私はUSBスティック(これに従ってUbuntuコア12.04から構築された 例 )から起動可能なCDを作成しました
CD_root/
にコピーします。rootfs.part
をフォルダにコピーして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/modprobe
、root/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は別の方法でマウントする必要がありますか?)
その間、私はなんとか問題を解決することができました。私の主な間違いは、書き込み許可なしにルートパーティションのイメージをマウントすることでした(DVDに保存されているため)。現在、これに対する通常の回避策は、overlayfs
とtmpfs
を使用しているようです。さらに、ルートパーティションのイメージを提供するためにsquashfsを使用するのが一般的な方法のようです。
Remastersys の場合、実行中のDebianシステムをLive-DVDにバックアップできるパッケージが存在します。なんとか起動DVDを作成することができましたが、目的に合わない結果になりました。 (いくつかの問題:既存のシステムを変更する必要があります。Live-DVDと追加パッケージの再インストールに重点が置かれすぎました。構成する機能が多すぎました。DVDを起動するたびに、2分間待機しました。いくつかのネットワーク構成。)さらに、実際に何が起こっているのか理解するのが難しいと思います。だから私は別の方法を選びました。
以下では、Ubuntu12.04でroot
として行ったことの詳細を説明します。 buntu Core 12.04に基づいてLinuxを起動するUSBスティックから起動可能なDVDを作成するための簡潔で一般的な例を提供しようとしているアプリケーション固有の要素をすべて取り除きました。 (ストリッピングのため、以下のコードはテストされていません。間違いを見つけたら教えてください。修正します。)
最初に、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
VMLINUZ
)で指定する必要があります。INITRD.IMG
にも当てはまります。rootfs.squash
は、このような変更なしで指定する必要があります。/dev/sda1
などのデバイスの代わりに)指定するだけで、squashfs
を使用してマウントできます。ブータブルスティックで使用されている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
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
ブータブルスティックのルートファイルシステムの押しつぶされたイメージにもパッチを適用する必要があります。ここでも、スティックの画像はoverlayfs
とtmpfs
を使用して保護されています(すでに作成されているディレクトリを再利用します)。
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
パッチを適用したイメージを押しつぶすことができるようになりました。
mksquashfs patch_root CD_root/rootfs.squash
stick_rootfs
への変更は、再び元に戻す/忘れることができます。
umount patch_root
umount patch_tmp
最後に、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を変更するソフトウェアを一時的にインストールする、ライフセッションでデバッグするときに出力を向上させるなど)。