我一直在尝试使用 kickstart 文件来引导 Red Hat 安装程序 (RHEL6.5),而无需用户干预。它正确地在 中查找 kickstart 文件/dev/sdb/fs.cfg
,但由于 USB 被识别为/dev/sda
,因此它实际上位于/dev/sda/fs.cfg
.我可以手动将安装程序指向此目的地,但 kickstart 文件的其余部分依赖于本机硬盘驱动器sda
。我想在不编辑启动文件的情况下这样做,但这是必要的,我愿意这样做。
有没有办法强制内核将 USB 识别为sdb
HD 为sda
(我假设内核负责混淆,但我不确定)?它选择外部驱动器(USB)作为sda
并强制内部驱动器(HD)似乎很奇怪sdb.
注意:我的问题非常类似于这个,除了我的启动文件绝对取决于高清sda
此问题仅出现在 RHEL6.5 安装程序中,而不会出现在 RHEL5.X 安装程序中(我没有尝试过任何以前版本的 RHEL6.X)。我真正想知道的是为什么版本之间会发生变化。
答案1
好的,这就是启动过程的工作方式:
- 固件 > 引导加载程序或许> 内核
${parameters}
> initramfs > 用户空间或许
在 redhat 安装盘上德拉库特脚本系统是构建和构成 initramfs 及其蟒蛇安装系统构成了最终的用户空间。
它udev
负责处理设备设置 - 例如,它在 中命名设备/dev
。但这几乎总是会发生两次init
- 一次在 initramfs 中,当内部找到其目标根设备并准备在其上安装时再次进行devfs
。
这就是它的工作原理:
引导装载程序(或固件)使用可选参数集和可选 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
和 an/etc/fstab
。大多数
init
s 将解析/proc/cmdline
它们可能解释的任何内核参数。一个很常见的就是root=/dev/somedisk
或root=UUID=somediskUUID
或root=LABEL=somedisklabel
。init
解释这些参数的是 initramfsroot=...
- 而不是内核或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,也不能umount
使用它。相反,删除 rootfs 中的所有内容以释放空间(find -xdev / -exec rm '{}' ';'
),用新的 root 覆盖 rootfs(cd /newmount; mount --move . /; chroot .
),依附于stdin/stdout/stderr
新/dev/console
,又exec
新init
。刚刚执行的根设备
init
现在必须填充其自己的根文件系统。它根据自己的规则集调用并udev
安装自己的规则集,然后执行其余所有操作。完成后,您就可以使用计算机了。devfs
/dev
抱歉,我说的太详细了,但我想解释清楚为什么以下说法是正确的:
- 您从引导加载程序中提交的任何内核参数,例如
root=/dev/sda
没有与 initramfs完成后/dev/sda
您最终将访问的内容相同。/dev/sda
/init
因此,我认为,做到这一点的一种方法是为udev
你的蟒蛇disk - 实际上可能是一个 squashfs 存档 - 指示它在其他地方设置所有 USB 磁盘。有一个很好的例子在这里:
KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB 2.0 Storage Device", SYMLINK+="usbhd%n"
如果您也阅读该链接的其余部分,那将是一件非常好的事情。您应该能够这样做,以便您的 USB 磁盘设备/dev/sda
用于 initramfs - 因此您不必更改任何引导加载程序配置 - 但稍后会为/dev/usba
与 anaconda 安装系统相同的磁盘创建一个节点。
答案2
进入主机的 BIOS 并重新排列硬盘驱动器和可移动驱动器的顺序。这将调整 Linux 内核中显示的顺序。
答案3
在我闪亮的新但古老的 45 美元 HP G60 笔记本电脑上,我遇到了同样的问题。我通过将新的 SSD 放在启动顺序的第一位,将 USB 从 移动/dev/sda
到。/dev/sdb
然后在启动时,按 ESC 键,就像进入 BIOS 一样,但有一个 preBIOS 菜单。因此,我没有按 F10 进入 BIOS,而是按 F9 进入启动选项。然后,无论 BIOS 中设置的引导顺序如何,您都可以手动选择从 USB 引导。显然我选择了 USB,然后在安装时我的 SSD 显示为/dev/sda
。
我搜索了好久,很多人都遇到过类似的问题,但没有人提出这个建议。比我发现的任何其他方法都简单得多。我凭直觉发现了这一点。
答案4
从 RHEL6 开始,您可以对安装介质使用标签,以便通过唯一的名称而不是不一致的内核 sdX 命名来访问驱动器/hd。
当您在 USB 驱动器上创建文件系统时,请确保使用 e2label 或 101 种其他方式来标记文件系统。
标记后,您可以通过该名称访问 USB,例如:ks=hd:LABEL=yourname:/path/to/fs.ks
另请记住,这种类型的命名也可用于其他位置。安装媒体、存储库等...