web-dev-qa-db-ja.com

UbuntuをRAMにロードし、そこから起動するにはどうすればよいですか?

問題

私はUSBフラッシュドライブを持っています。これは、Windows PEやその他のものの中でも、仮想(ファイルベース)パーティションにUbuntu11.04システムを備えています。

<drive>/ubuntu/disks/boot.disk      mount point /boot  (contains GRUB)
<drive>/ubuntu/disks/root.disk      mount point /      (contains rest of system)

正常に動作します...

ただし、シャットダウン後、すべての変更持続します。

また、GRUB2メニューのadditionalオプションで同じものを起動します。 インストール、ただしリダイレクトすべての書き込みルートファイルシステムからRAMへ、したがって、破棄ルートファイルシステム(root.disk)に加えられたすべての変更。

強調するために:そこに必須システムを正常に起動するオプションがまだあります。

(もちろん、他のファイルシステムへの変更はリダイレクトしないでください。このオプションでは、ルートディスクとブートディスクのみを変更しないでください。)

私がすでにしたこと

私の/ etc/fstabは現在次のようになっています。

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/Host/ubuntu/disks/root.disk /             ext2   loop,errors=remount-ro 0      0
/Host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

そして私のgrub.cfgは次のようになります:

menuentry "Ubuntu, Linux 2.6.38-13-generic" {
    insmod part_msdos
    insmod ntfs
    set root='(/dev/sdb,msdos1)'
    search --no-floppy --fs-uuid --set=root MY_DRIVE_UUID
    loopback loop0 /ubuntu/disks/root.disk
    set root=(loop0)
    linux /boot/vmlinuz-2.6.38-13-generic root=UUID=MY_DRIVE_UUID loop=/ubuntu/disks/root.disk ro   acpi_sleep=nonvs acpi_osi=Linux acpi_backlight=vendor
    initrd /boot/initrd.img-2.6.38-13-generic
}

私はすでに試しました私のfstabを例に変更します:

# <file system>              <mount point> <type> <options>              <dump> <pass>
proc                         /proc         proc   nodev,noexec,nosuid    0      0
/Host/ubuntu/disks/root.disk /rootdisk     ext2   loop,errors=remount-ro 0      0
tmpfs                        /ramdisk      tmpfs  defaults               0      0
none                         /             aufs   br:/rootdisk=ro:/ramdisk=rw 0 1
/Host/ubuntu/disks/boot.disk /boot         ext2   loop,errors=remount-ro 0      0

何らかの理由で、/に正しくマウントされません(nonetmpfsaufs、順序、フラグなどのすべての組み合わせを試しました。私が考えることができた)、そして起動時にエラーが発生します。

だから...これを設定するにはどうすればよいですか?

6
user541686

正確にあなたが求めていることはおそらくカスタムファイルシステムなしでは実行できませんが、ramfs(notramdiskまたtmpfs)これは近づいています。 Ramfsは、(組み込み)Linuxの起動時に初期ファイルシステムとして使用されることがあります。つまり、initramfsです。このルートファイルシステムはメモリ内にあるため、加えられた変更はフラッシュ内のソースに伝播されず、シャットダウンまたは次回の再起動時に失われます。 initramfsの内容は、カーネルバイナリに添付されているinitramfs.cpioアーカイブファイルから取得されます。

「ルートファイルシステムからRAMにすべての書き込みをリダイレクトする」には、おそらくカスタムファイルシステムが必要になります。この種のファイルシステムは、私が開発を支援した階層化ファイルシステムに似ています。最上位層のファイルシステムはユーザーがアクセスでき、実際には2つの個別のファイルシステムで構成されていました。ファイルへのユーザーアクセスでは、最初にAファイルシステムでファイルを探す必要があります。 Aに存在しなかった場合、Bファイルシステムにファイルがあると想定されていました。 (Aファイルシステムには、読み取り専用メディア上のBファイルシステムを更新/置換する必要がないBファイルシステムの更新ファイルが含まれていました。)夢のファイルシステムも同様です。ファイルにアクセス(つまり開く)するには、最初にファイルを確認する必要があります。すでにramfsにあります。そうである場合は、そのコピーを使用します。それ以外の場合は、ファイルをディスクルートファイルシステムからramfsにコピーしてから、ramfsコピーを使用します。

おそらく、ramfsを起動、作成、マウントし、rootfsをramfsにコピーしてから、chrootからramfsへ。これにより、夢のファイルシステムの変更されたファイルだけでなく、ルートファイルシステム全体がメモリに配置されます。

7
sawdust

UbuntuとほとんどのDebian派生ディストリビューションは、ルートボリュームをマウントする前に起動時に必要なドライバーとユーティリティを含む「initramfs」を使用します。カーネルがロードされた直後にブートローダーによってロードされます(これもブートローダーによって実行されます)。

通常、initramfsは、実際のルートボリュームがその上にマウントされた後に省略されます。適切な/etc/init.d/スクリプトを編集すれば、これを防ぐことができると思います。

これを正しく機能させるには、Linuxの実行に必要なすべてのファイルを含む独自のカスタムinitramfsが必要です。ブートプロセスの最後に、initramfsから完全に実行しているという効果があります。一部のライブCD/ISOは実際に同じことを行います。

たとえば、Ubuntuのみをインストールする最小限のコマンドラインを新しいカスタムinitramfsにコピーするのは、それほど難しいことではありません。現在のシステムを自動的に「initramfs-ify」するツールを私は知りませんが、他の誰かが以前に行ったことのようなもののようです。何か見つけたら、この回答を更新します。

1
LawrenceC