web-dev-qa-db-ja.com

起動可能なDVDにパーティションイメージファイルとして保存されているルートファイルシステムを起動するにはどうすればよいですか?

私はUSBスティック(これに従ってUbuntuコア12.04から構築された )から起動可能なCDを作成しました

  • uSBスティックのブートパーティション(vmlinuzとinitrd.imgを含む)のファイルをフォルダーCD_root/にコピーします。
  • そのフォルダにisolinuxを追加します(これらによると 指示
  • uSBスティックのルートパーティションの画像rootfs.partをフォルダにコピーして
  • mkisofsを使用します。

DVDからルートパーティションのイメージを起動するにはどうすればよいですか?

質問のいくつかの詳細とやや正確なバージョン:

Initスクリプトの起動を開始できます(Ubuntu 12.04ホストでvirtualboxを使用):カーネルパラメーターbreak=mountrootを使用して、イメージrootfs.partをマウントして挿入する直前にシェルにドロップできます。

mkdir /run/cdrom
mount -t iso9660 /dev/sr0 /run/cdrom
losetup /dev/loop0 /run/cdrom/rootfs.part
mount -o ro /dev/loop0 /root

この部分(または/ rootをマウントする要点)を自動的に達成するにはどうすればよいですか? initrd.img(方法)にパッチを適用する必要がありますか、それともカーネルパラメータなどの他のオプションがありますか?

この時点で、rootfs.part内のファイルはroot/に表示されます。 (それらには/root/sbin/init/root/sbin/modproberoot/lib/modules/*、...が含まれます)私は続行して、initスクリプトの通常の進行をシミュレートしようとしました(確かに多少文脈から外れています):

udevadm control --timeout=121 --exit
mount -n -o move /dev /root/dev
mount -n -o move /run/ /root/run
mount -n -o move /sys /root/sys
mount -n -o move /proc /root/proc
exec run-init /root /sbin/init </dev/console >/dev/console 2>&1

残念ながら、これはそれほど進んでいません。 modprobeの欠落や、/dev/loop0などのデバイスが存在しないことに関するエラーメッセージが多数表示され、無限に繰り返されます。 (たぶんDVDは別の方法でマウントする必要がありますか?)

2

概要

その間、私はなんとか問題を解決することができました。私の主な間違いは、書き込み許可なしにルートパーティションのイメージをマウントすることでした(DVDに保存されているため)。現在、これに対する通常の回避策は、overlayfstmpfsを使用しているようです。さらに、ルートパーティションのイメージを提供するためにsquashfsを使用するのが一般的な方法のようです。

代替ソリューション

Remastersys の場合、実行中のDebianシステムをLive-DVDにバックアップできるパッケージが存在します。なんとか起動DVDを作成することができましたが、目的に合わない結果になりました。 (いくつかの問題:既存のシステムを変更する必要があります。Live-DVDと追加パッケージの再インストールに重点が置かれすぎました。構成する機能が多すぎました。DVDを起動するたびに、2分間待機しました。いくつかのネットワーク構成。)さらに、実際に何が起こっているのか理解するのが難しいと思います。だから私は別の方法を選びました。

私の解決策

以下では、Ubuntu12.04でrootとして行ったことの詳細を説明します。 buntu Core 12.04に基づいてLinuxを起動するUSB​​スティックから起動可能なDVDを作成するための簡潔で一般的な例を提供しようとしているアプリケーション固有の要素をすべて取り除きました。 (ストリッピングのため、以下のコードはテストされていません。間違いを見つけたら教えてください。修正します。)

Isolinuxの構成

最初に、DVDファイルシステム構造がディレクトリCD_root内に作成されます(cf. Isolinux

mkdir -p CD_root/boot/isolinux
cp /usr/lib/syslinux/isolinux.bin CD_root/boot/isolinux/

起動可能なスティックの起動パーティションはstick_boot/の下にマウントされ、起動されたカーネルはそこに保存され、vmlinuzという名前が付けられていると仮定します。

cp -a stick_boot/vmlinuz CD_root/boot/isolinux/
vi CD_root/boot/isolinux/isolinux.cfg

isolinux.cfgの内容は次のとおりです。

Prompt 1
TIMEOUT 30
DEFAULT Linux

LINUX Linux
    LINUX VMLINUZ
    APPEND root=/cdrom/rootfs.squash ro
    INITRD INITRD.IMG
  • ロードするカーネルは、CDファイルシステムに小文字でコピーする場合でも、大文字(VMLINUZ)で指定する必要があります。
  • 同じことがINITRD.IMGにも当てはまります。
  • ブータブルスティックのルートファイルシステムの押しつぶされたイメージの名前rootfs.squashは、このような変更なしで指定する必要があります。
  • 押しつぶされたイメージのファイル名を(/dev/sda1などのデバイスの代わりに)指定するだけで、squashfsを使用してマウントできます。

Initrdの構築

ブータブルスティックで使用されているinitrd.imgにパッチを適用する必要があります。起動可能なスティックのrootfsを使用して、パッチが適用されたinitrdを構築できます。 overlayfsおよびtmpfsを使用することにより、永続的な変更から保護できます(DVDに保存されている押しつぶされたルートファイルシステムの書き込み可能なバージョンを提供するためにこれらが使用されるのと同じ方法で)。ブータブルスティックのルートファイルシステム(変更から保護される)がstick_rootfsの下にマウントされていると仮定します。

mkdir patch_tmp
mount -t tmpfs patched_files_fs patch_tmp
mkdir patch_root
mount -t overlayfs -o lowerdisk=stick_rootfs,upperdisk=patch_tmp overlayed_stick_rootfs patch_root
  • patch_root/で安全に変更できるようになりました。

2つのモジュールをinitrdに追加する必要があります。

cat >>patch_root/etc/initramfs-tools/modules <<!
squashfs
overlayfs
!

起動中、ルートファイルシステム/cdromの押しつぶされたイメージにアクセスできるように、DVDを/cdrom/rootfs.squashの下にマウントする必要があります。これは、次のローカルプリマウントスクリプトを使用して実現されます。

vi patch_root/etc/initramfs-tools/scripts/local-premount/cdmount

その内容は次のとおりです。

#!/bin/sh

PREREQ=""

prereqs()
{
    echo "$PREREQ"
}

case $1 in
# get pre-requisites
prepreqs)
    prereqs
    exit 0
    ;;
esac

# No error checking / fallbacks for brevity, here
mkdir /cdrom
mount -t iso9660 /dev/sr0 /cdrom
exit 0

このスクリプトは実行可能である必要があります。

chmod +x patch_root/etc/initramfs-tools/scripts/local-premount/cdmount

ルートファイルシステムの書き込み可能なビューは、十分に文書化されたスクリプトroot-roによって提供されます。このスクリプトは、この ドイツ語 / 英語 ソースから少し変更を加えたものです。

cp root-ro patch_root/etc/initramfs-tools/scripts/init-bottom/root-ro
chmod +x patch_root/etc/initramfs-tools/scripts/init-bottom/root-ro

重要な変更は、スクリプトの下部にあるfstabに適用される変更に関するものです。 procファイルシステムには1つのエントリのみを使用します(ルート/または/bootのエントリはすべて削除します)。

proc /proc proc nodev,noexec,nosuid 0 0

パッチが適用されたinitrdは、スティックの保護されたルートファイルシステム上のchroot環境内に構築できるようになりました。

chroot patch_root update-initramfs -c -k 3.2.0-37-generic
  • -kのパラメーターは、initrd(USBスティック上のブートシステムでのuname -rの出力)をロードするブートカーネルのバージョンを指定します。

これで、パッチが適用されたinitrdをisolinuxフォルダーにコピーできます。

cp patch_root/boot/initrd.img-3.2.0-37-generic CD_root/boot/isolinux/initrd.img

stick_rootfsへの変更は、元に戻す/忘れることができるようになりました。

umount patch_root
umount patch_tmp

ルートファイルシステムの構築

ブータブルスティックのルートファイルシステムの押しつぶされたイメージにもパッチを適用する必要があります。ここでも、スティックの画像はoverlayfstmpfsを使用して保護されています(すでに作成されているディレクトリを再利用します)。

mount -t tmpfs patched_files_fs patch_tmp
mount -t overlayfs -o lowerdisk=stick_rootfs,upperdisk=patch_tmp overlayed_stick_rootfs patch_root

DVDから起動するときに、ネットワーク構成がハングしたり失敗したりしないように、古いキャッシュファイルを削除する必要があります。

rm -f patch_root/etc/udev/rules.d/70-persistent-net.rules
rm -f patch_root/var/lib/dhcp/dhclient.eth?.leases

オプションで、キャスパーからの取り出しスクリプト(たとえば、remastersysによって作成されたDVDで使用される)を使用して、シャットダウン時にDVDを取り出すことができます。

cp casper patch_root/etc/init.d/casper
chmod 755 patch_root/etc/init.d/casper
ln -s ../init.d/casper patch_root/etc/rc0.d/S89casper
ln -s ../init.d/casper patch_root/etc/rc6.d/S89casper
  • このスクリプトの先頭に小さなパッチが必要です。システムがcasperによって起動されたかどうかのチェックがあります。そうでない場合、スクリプトはすぐに終了します。このチェックを削除しました。

パッチを適用したイメージを押しつぶすことができるようになりました。

mksquashfs patch_root CD_root/rootfs.squash

stick_rootfsへの変更は、再び元に戻す/忘れることができます。

umount patch_root
umount patch_tmp

DVDイメージの作成

最後に、isoイメージdvd.isoを作成できます。

mkisofs -iso-level 3 -quiet -r -V "STICK_DVD" -cache-inodes -J -l -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -joliet-long -o dvd.iso CD_root

それで全部です。 ISOイメージをCD/DVDに書き込む準備ができました。

いくつかの警告

  • 私は主に試行錯誤によってこの解決策にたどり着きました。したがって、私はそれほど自信がなく、安定したシステムが出現します。 (それでも、これまで、virtualboxといくつかのiMacでいくつかのテストを行った後、これが当てはまるようです。)

  • 起動中のCD/DVDのコンテンツへのアクセスを提供する方法(init script /etc/initramfs-tools/scripts/local-premount/cdmountを参照)は確かに改善される可能性があります。複数の光学ドライブが存在する場合は、おそらくすべてをチェックする必要があります(sr?、hd ?、...)。 CD/DVDの起動元のデバイスを直接判別する方法がわかりません。私はこれが可能であるはずだと感じています(多分/sysまたは/procを評価しますか?)。たぶん、起動デバイスを明示的にマウントする必要さえありませんでしたか(別の時間ですか?)?結局のところ、そのコンテンツは、initスクリプトの実行時にすでにアクセスされています。

  • ルートパーティションの押しつぶされたイメージ内のファイル/etc/fstabは、おそらく(適切にマウントされた)CD/DVDのエントリを使用する可能性があります。

  • たぶん、isoイメージの/bootディレクトリには通常のファイルが含まれていて、ライフシステムに適切にマウントされている必要があります。これにより、ライフシステムを操作する際の柔軟性が向上する可能性があります(たとえば、ライフセッション中にinitrdを変更するソフトウェアを一時的にインストールする、ライフセッションでデバッグするときに出力を向上させるなど)。

5