抽象的

抽象的

我已经从 USB 驱动器创建了可启动 CD(根据此从 Ubuntu core 12.04 构建例子) 经过

  • 将 USB 启动分区的文件(包含 vmlinuz 和 initrd.img)复制到一个文件夹中CD_root/
  • 将 isolinux 添加到该文件夹​​(根据这些指示
  • rootfs.part将USB 根分区的映像复制到文件夹中,然后
  • 使用 mkisofs。

我如何从 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

我如何才能自动实现这一部分(或安装 /root 的要点)?我是否必须修补initrd.img(如何)或者是否有其他选项,例如内核参数?

此时,里面的文件rootfs.part在 处可见root/。(它们包括/root/sbin/init,,, ...)我尝试继续并模拟 init 脚本的正常进行(当然/root/sbin/modprobe有些root/lib/modules/*脱离上下文):

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 应该以不同的方式安装?)

答案1

抽象的

与此同时,我设法解决了这个问题。我的主要错误是在没有写入权限的情况下挂载了根分区的映像(因为它存储在 DVD 上)。目前,解决这个问题的常用方法似乎是使用overlayfstmpfs。此外,使用 squashfs 提供根分区的映像似乎是一种常见的做法。

替代解决方案

重製機械,有一个软件包可以将正在运行的 Debian 系统备份到 Live-DVD。虽然我设法让它构建启动 DVD,但我发现结果不能满足我的目的。(一些问题:必须修改现有系统。过于强调重新安装 Live-DVD 和其他软件包。需要配置的功能太多。每次启动 DVD 时,都需要等待两分钟才能进行一些网络配置。)此外,我发现很难理解到底发生了什么。所以我选择了另一种方式。

我的解决方案

下面,我将详细介绍我root在 Ubuntu 12.04 上所做的操作。我去掉了任何特定于应用程序的元素,试图提供一个简洁而通用的示例,用于从 USB 启动基于 Linux 的 DVD 驱动器创建可启动 DVDUbuntu 核心12.04. (由于剥离,下面显示的代码未经测试。因此,如果您发现错误,请告诉我,我会修复它。)

配置 isolinux

首先,在目录内创建 DVD 文件系统结构CD_root(参见伊索Linux

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) 指定,即使它以小写字母复制到 CD 文件系统。
  • 这同样适用于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/

必须向 initrd 添加两个模块:

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

在启动过程中,必须安装 DVD,/cdrom以便可以访问根文件系统的压缩映像/cdrom/rootfs.squash。这可以通过以下 local-premount 脚本实现:

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文件系统的单个条目(我删除了 root/或 的所有条目/boot):

proc /proc proc nodev,noexec,nosuid 0 0

chroot现在可以在受保护的根文件系统环境中构建修补的 initrd :

chroot patch_root update-initramfs -c -k 3.2.0-37-generic
  • 参数 -k 指定加载 initrd 的启动内核的版本(uname -rUSB 记忆棒上启动系统的输出)。

现在可以将修补后的 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

或者,可以使用 casper 的弹出脚本(例如,在 生产的 DVD 中使用remastersys)在关机时弹出 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 映像

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

就这样。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 的软件,在生命会话中进行调试时提供更好的输出,...)?

相关内容