Car*_*tes 2 boot dvd mount initrd ubuntu
我创建了从USB记忆棒可引导CD(根据这个从Ubuntu的核心12.04建成例如)通过
CD_root/,rootfs.partU 盘根分区的映像复制到文件夹中,然后如何从 DVD 引导到根分区的映像?
问题的更多细节和更精确的版本:
我可以开始引导到 init 脚本(在 Ubuntu 12.04 主机上使用 virtualbox):使用内核参数,break=mountroot我可以rootfs.part在安装映像之前放入shell并插入:
mkdir /run/cdrom
mount -t iso9660 /dev/sr0 /run/cdrom
losetup /dev/loop0 /run/cdrom/rootfs.part
mount -o ro /dev/loop0 /root
Run Code Online (Sandbox Code Playgroud)
我怎样才能自动实现这部分(或其挂载 /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
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并没有走多远。许多有关丢失modprobe和设备(例如/dev/loop0不存在)的错误消息出现并无限重复。(也许 DVD 应该以不同的方式安装?)
同时,我设法解决了这个问题。我的主要错误是在没有写权限的情况下挂载根分区的映像(因为它存储在 DVD 上)。目前,通常的解决方法似乎是使用overlayfs和tmpfs。此外,使用 squashfs 来提供根分区的映像似乎是一种常见的做法。
使用Remastersys,存在一个可以将正在运行的 Debian 系统备份到 Live-DVD 的软件包。虽然我设法让它构建了一个引导 DVD,但我发现结果不符合我的目的。(一些问题:现有系统需要修改,过分强调重新安装Live-DVD和附加包。需要配置的功能太多。每次启动DVD都要等待两分钟一些网络配置。)此外,我发现很难理解到底发生了什么。所以我选择了另一种方式。
下面,我将详细介绍我root在 Ubuntu 12.04 上所做的工作。我已经剥离了任何特定于应用程序的元素,试图提供一个简洁和通用的示例,用于从基于Ubuntu Core 12.04的 Linux 启动的 U 盘创建可启动 DVD 。(由于剥离,下面显示的代码没有测试。所以如果你发现错误,请告诉我,我会修复它。)
首先在目录中创建 DVD 文件系统结构CD_root(参见Isolinux)
mkdir -p CD_root/boot/isolinux
cp /usr/lib/syslinux/isolinux.bin CD_root/boot/isolinux/
Run Code Online (Sandbox Code Playgroud)
我假设可启动棒的启动分区安装在下面,stick_boot/并且启动的内核存储在那里并命名为vmlinuz.
cp -a stick_boot/vmlinuz CD_root/boot/isolinux/
vi CD_root/boot/isolinux/isolinux.cfg
Run Code Online (Sandbox Code Playgroud)
内容isolinux.cfg如下:
PROMPT 1
TIMEOUT 30
DEFAULT Linux
LINUX Linux
LINUX VMLINUZ
APPEND root=/cdrom/rootfs.squash ro
INITRD INITRD.IMG
Run Code Online (Sandbox Code Playgroud)
VMLINUZ)指定,即使它以小写字母复制到 CD 文件系统。INITRD.IMG.rootfs.squash必须在没有此类更改的情况下指定。/dev/sda1)足以使用squashfs.该initrd.img对引导棒使用时,必须进行修补。可引导棒的 rootfs 可用于构建打补丁的 initrd。可以通过使用overlayfsand来保护它免受永久更改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
Run Code Online (Sandbox Code Playgroud)
patch_root/.必须在 initrd 中添加两个模块:
cat >>patch_root/etc/initramfs-tools/modules <<!
squashfs
overlayfs
!
Run Code Online (Sandbox Code Playgroud)
在引导期间,必须将 DVD 挂载到其下,/cdrom以便/cdrom/rootfs.squash可以访问根文件系统的压缩映像。这是通过以下本地预挂载脚本实现的:
vi patch_root/etc/initramfs-tools/scripts/local-premount/cdmount
Run Code Online (Sandbox Code Playgroud)
它的内容是:
#!/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
Run Code Online (Sandbox Code Playgroud)
此脚本必须是可执行的:
chmod +x patch_root/etc/initramfs-tools/scripts/local-premount/cdmount
Run Code Online (Sandbox Code Playgroud)
根文件系统的可写视图由一个记录良好的脚本提供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
Run Code Online (Sandbox Code Playgroud)
基本更改涉及应用于脚本底部 fstab 的修改。我只为proc文件系统使用一个条目(我删除了 root/或 的所有条目/boot):
proc /proc proc nodev,noexec,nosuid 0 0
Run Code Online (Sandbox Code Playgroud)
现在可以在chroot受保护的棒的根文件系统上的环境中构建打补丁的 initrd :
chroot patch_root update-initramfs -c -k 3.2.0-37-generic
Run Code Online (Sandbox Code Playgroud)
uname -rUSB 记忆棒上引导系统的输出)。现在可以将打过补丁的 initrd 复制到 isolinux 文件夹中:
cp patch_root/boot/initrd.img-3.2.0-37-generic CD_root/boot/isolinux/initrd.img
Run Code Online (Sandbox Code Playgroud)
stick_rootfs现在可以撤消/忘记更改:
umount patch_root
umount patch_tmp
Run Code Online (Sandbox Code Playgroud)
还必须修补可引导棒的根文件系统的压缩映像。再次使用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
Run Code Online (Sandbox Code Playgroud)
从 DVD 启动时,应删除旧的缓存文件以避免挂起/失败的网络配置:
rm -f patch_root/etc/udev/rules.d/70-persistent-net.rules
rm -f patch_root/var/lib/dhcp/dhclient.eth?.leases
Run Code Online (Sandbox Code Playgroud)
或者,可以使用来自 casper 的弹出脚本(例如在由 制作的 DVDremastersys中使用)可用于在关闭时弹出 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
Run Code Online (Sandbox Code Playgroud)
现在可以压缩修补后的图像:
mksquashfs patch_root CD_root/rootfs.squash
Run Code Online (Sandbox Code Playgroud)
stick_rootfs现在可以再次撤消/忘记更改:
umount patch_root
umount patch_tmp
Run Code Online (Sandbox Code Playgroud)
最后dvd.iso可以创建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
Run Code Online (Sandbox Code Playgroud)
就这样。已准备好将 ISO 映像刻录到 CD/DVD。
我主要通过反复试验获得了这个解决方案。因此,我不太相信会出现一个稳定的系统。(不过,到目前为止,在 virtualbox 和一些 iMac 上进行了一些测试后,情况似乎确实如此。)
提供对引导 CD/DVD 内容的访问的方式(参见 init 脚本/etc/initramfs-tools/scripts/local-premount/cdmount)当然可以改进:在存在多个光驱的情况下,可能应该检查所有光驱(sr?,hd?,... )。我不知道如何直接确定启动 CD/DVD 的设备。我觉得这应该是可能的(也许是评估/sys或/proc?)。也许,甚至不需要显式挂载启动设备(另一次?)?毕竟,它的内容在执行 init 脚本时已经被访问了。
/etc/fstab根分区的压缩映像中的文件可能会使用(正确安装的)CD/DVD 的条目。
也许/bootiso镜像上的目录应该包含常用文件并正确安装到生命系统中。这可能会在使用生命系统时提供更大的灵活性(例如:在生命会话期间临时安装修改 initrd 的软件,在生命会话中调试时提供更好的输出,......)?
| 归档时间: |
|
| 查看次数: |
6432 次 |
| 最近记录: |