ska*_*zin 7 rhel usb kickstart system-installation linux-kernel
我一直在尝试使用 kickstart 文件来指导 Red Hat 安装程序 (RHEL6.5),而无需用户干预。它正确地在 中查找 kickstart 文件/dev/sdb/fs.cfg
,但由于 USB 被识别为/dev/sda
,它实际上位于/dev/sda/fs.cfg
. 我可以手动将安装程序指向这个目的地,但 kickstart 文件的其余部分依赖于让本机硬盘驱动器sda
. 我想在不编辑 kickstart 文件的情况下这样做,但这是必要的,我愿意这样做。
有什么方法可以强制内核将 USB 识别为sdb
和 HD识别为sda
(我假设内核负责混淆,但我不确定)?它选择外部驱动器(USB)sda
并强制内部驱动器(HD)sdb.
注意:我的问题与这个非常相似,除了我的 kickstart 文件绝对依赖于 HDsda
这个问题只发生在 RHEL6.5 安装程序上,而不是 RHEL5.X 安装程序上(我没有尝试过任何以前版本的 RHEL6.X)。我真正想知道的是为什么版本之间会发生变化。
好的,这是启动过程的工作方式:
${parameters}
> initramfs >可能是用户空间在 redhat 安装盘上,他们的dracut脚本系统构建并构成了 initramfs,而他们的anaconda安装系统构成了最终的用户空间。
它udev
负责处理设备设置——如,它将设备命名为/dev
. 但这几乎总是发生两次- 一次在 initramfs 中,另一次是在 insideinit
找到其目标根设备并准备在其devfs
上安装 a时。
所以这是它的工作原理:
引导加载程序(或固件)使用可选参数集和可选 initramfs 映像调用内核。这个参数集被保存在/proc/cmdline
,内核会忽略它不理解的所有参数。
initramfs 是一个可用的 linux 用户空间。它的/
内容是从调用时传递给它的映像解压缩还是编译都没有关系 - 从内核 2.6 开始,它始终是 linux 内核挂载的第一个工作根文件系统。从这一点来看,Linux 内核将一切都留给了用户空间。
通常(就像 redhat 的 dracut 一样) initramfs 只包含查找根设备并将其挂载到自身上绝对必要的内容。通常所包含的只是busybox
挂载目标根设备所需的内核模块。
udev
不过,它可能需要这样做,因此udev
通常包含在内 - 有自己的一小部分规则。
如前所述,initramfs 是它自己的小型完整 linux 根文件系统。一个完整的可能看起来像:/bin /etc /dev /new_root /proc /sys init
. 这些目录的任何内容通常都没有什么特别之处 - 几乎总是有一个/bin/sh
和一个/etc/fstab
.
大多数init
s 将解析/proc/cmdline
它们可能解释的任何内核参数。一个很常见的就是root=/dev/somedisk
orroot=UUID=somediskUUID
或root=LABEL=somedisklabel
。init
解释这些root=...
参数的是 initramfs - 而不是内核或init
稍后执行的最后一个(尽管最后一个可能很好地解释其他参数)。它将接受此参数并将其安装在/new_root
(或在其之前用于暂存安装的任何名称switchroot
)。如果udev
包含在 initramfs 中,则由 initramfs 规则集决定目标磁盘/dev/...
条目的名称——但这可能会改变。
当initramfs中init
成功地找到和坐骑/new_root
它通常会寻找的东西设备exec
本身成-通常是/new_root/bin/init
-因此无论该计划是成为PID 1.它通常与执行此switch_root
提供程序busybox
-这确实的exec
,同时安装/new_root
了 /
。它的过程在内核文档中描述,因此:
但是 initramfs是rootfs:您既不能
pivot_root
rootfs,也不能rootfsumount
。而是删除 rootfs 中的所有内容以释放空间(find -xdev / -exec rm '{}' ';'
),使用新的 root (cd /newmount; mount --move . /; chroot .
)超载 rootfs ,附加stdin/stdout/stderr
到新的/dev/console
和exec
新的init
.
init
刚刚执行的根设备现在必须填充它自己的根文件系统。它根据自己的规则集调用udev
和挂载自己的devfs
,/dev
并完成所有其余的工作。完成后,您就可以使用计算机了。
很抱歉这里的详细程度,但我想说明为什么以下是正确的:
root=/dev/sda
都不必与/dev/sda
您/dev/sda
在 initramfs/init
完成后最终访问的参数相同。所以我认为,一种方法是udev
在你的anaconda磁盘上设置一个规则——它实际上可能是一个 squashfs 存档——指示它在其他地方设置所有 USB 磁盘。这里有一个很好的例子:
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"
Run Code Online (Sandbox Code Playgroud)
如果您也阅读该链接的其余部分,那将是一件非常好的事情。您应该能够这样做,因此您的 USB 磁盘设备/dev/sda
用于 initramfs - 因此您不必更改任何引导加载程序配置 - 但随后会/dev/usba
为与 anaconda 安装系统相同的磁盘创建一个节点。