将根文件系统挂载ro在 initramfs(和 initrd)中的原因是什么。
例如,Gentoo initramfs 指南使用以下命令挂载根文件系统:
mount -o ro /dev/sda1 /mnt/root
Run Code Online (Sandbox Code Playgroud)
为什么不是下面的?
mount -o rw /dev/sda1 /mnt/root
Run Code Online (Sandbox Code Playgroud)
我可以看到可能有一个很好的理由(并且可能涉及switchroot),但是似乎没有任何地方记录。
我正在构建一个非常小的 Linux 系统,它只包含内核 (v4.1-rc5) 和一个填充了 busybox (v1.23.2) 的 initramfs。它在大多数情况下运行良好,但我观察到 /init 中命令执行行为的差异,无论我使用的是嵌入式 initramfs 还是外部 initramfs。
/init 脚本是:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
setsid cttyhack /bin/sh
done
Run Code Online (Sandbox Code Playgroud)
然后我要么将内核 .config 中的 CONFIG_INITRAMFS_SOURCE 选项设置为包含 initramfs 的所有文件夹的目录,要么运行
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz
Run Code Online (Sandbox Code Playgroud)
来建造它。
当我编译内核时,无论是否设置了 CONFIG_INITRAMFS_SOURCE 集,我最终都会得到系统的两个变体:
嵌入了 initramfs 的 bzImage
bzImage + rootfs.cpio.gz(外部 initramfs)
当我现在开始使用 qemu
qemu-system-x86_64 -enable-kvm -kernel bzImage …Run Code Online (Sandbox Code Playgroud) 我正在尝试自定义 initramfs 救援环境,并希望强制内核挂载失败/并进入(initramfs)救援外壳,而不是单用户模式。
我怎样才能做到这一点?
注意:我知道如何挂钩initramfs-tools以实现自定义步骤,但我需要能够验证结果。
是否可以使用mdadm及其扫描功能组装特定的 RAID 阵列,但不需要配置文件?
背景:
我使用定制的 initramfs 来设置我的系统(dm-crypt 和其他东西)。一切都在 init 脚本中完成和配置,这就是我想要保留它的方式,即没有任何额外的配置文件。
我的目标:
在 init 脚本中,我想仅使用命令行来组装一个特定的 RAID 阵列。该阵列通过其 UUID 进行标识,给出了 md 设备名称,并应扫描阵列成员(因为例如连接的 USB 记忆棒或故障设备会弄乱 /dev/sdX 名称)。所有其他设备和潜在的 RAID 阵列都将被忽略,因为在引导期间只有一个阵列是感兴趣的(携带根文件系统)。
彻底阅读 mdadm 的手册页并执行了几个测试,我想出了这个:
mdadm --assemble --uuid <uuid> /dev/md0
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但这是正确的方法吗?
来自手册页:
如果只列出了一个设备,但没有给出 --scan,那么 mdadm 就像提供了 --scan 一样,并从配置文件中提取了身份信息。
我最近将内核从 3.16.4 (Debian jessie) 升级到 4.9.0 (Debian stretch)。一切都很好,直到我尝试“休眠”(暂停到磁盘)。
当我在 LXDE 中使用 Hibernate 选项时,它似乎处于休眠状态。我能听到磁盘主轴滴答作响和写入数据的声音。但是从休眠状态恢复时就会出现问题。内核成功地从交换中恢复了映像,但随后冻结并重新启动,所有这些工作都丢失了。我在互联网上的任何地方都找不到答案。人们只是在解决一些关于未设置 /etc/initramfs-tools/conf.d/resume 或设置内核参数或在 /etc/fstab 中输入错误的错误。我有这些正确的。更正 /etc/initramfs-tools/conf.d/resume 中的 UUID,更正 fstab 并且不设置 resume kernel 参数。
我将扩展分区之外的交换分区移动到主分区。UUID 已保存并应用于新的交换。
系统到达“正在恢复映像 100%”,然后到达“暂停控制台”,然后它会断电并正常启动,所有工作都丢失了。
尝试干净安装,但没有运气。
仅在 i386(32 位 x86)上发生,amd64(64 位 x86)不会受到影响。
磁盘分区表布局:
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
??sda1 ext4 HDD <ROOT-UUID> /
??sda2 swap HDD-SWAP <SW-UUID> [SWAP]
sr0
Run Code Online (Sandbox Code Playgroud)
sda2 在升级之前是合乎逻辑的(resides-inside-extended)。
表:
UUID=<ROOT-UUID> / ext4 errors=remount-ro 0 1
UUID=<SW-UUID> none swap sw 0 0
Run Code Online (Sandbox Code Playgroud)
/etc/initramfs-tools/conf.d/resume
RESUME=UUID=<SW-UUID>
Run Code Online (Sandbox Code Playgroud)
内核命令行
BOOT_IMAGE=/boot/vmlinuz-4.9.0-3-686-pae root=UUID=<ROOT-UUID> ro quiet
Run Code Online (Sandbox Code Playgroud)
系统信息:
Computer: Compaq CQ60-120ec …Run Code Online (Sandbox Code Playgroud) 我试图从您按下电源按钮的那一刻起了解整个机器的启动过程。从引导加载程序到 initramfs 阶段,我不太了解其他一些较小的部分。
鉴于条目的此 Grub 配置,取自最近的 Ubuntu 默认安装:
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
Run Code Online (Sandbox Code Playgroud)
这在系统状态和内存方面实际上做了什么?我知道 Grub 的任务是“加载和运行内核”,它有自己的一组模块来访问设备(或网络)上的文件以获取它们。在这里insmod的例子中s, set rootand search- 但这只是从 Grub 的角度来看,并没有与内核共享,对吗?
我还猜测 Grub 正在将内核的(副本?)加载到内存(linuxcommand)中并启动它以开始执行。(显然是两个不同的步骤 - 那么,如何?)给定的参数可以在内核中读取并解释(这是一个映射到内存某处的大字符串吗?)并提供安排所请求事物的选项。
我也看到了这个initrd选项。这指向我的 gzip 压缩 initramfs,需要引导由root=. 但是这个initramfs是如何提供给内核的呢?它不会传递任何内存地址到它可以加载它的地方,也不能访问它本身,因为它在内核启动之前已经加载。一些内核文档说这个 initramfs 文件系统“设备”可以通过 访问/dev/ram0,但我不知道它是如何成为一个可访问的设备文件的。我猜我没看到水下发生了什么。
我也没有看到这与其他引导加载程序有什么关系,包括嵌入式平台,例如使用 U-boot/Coreboot。这是否与 Grub 做同样的事情(相同的标准内存地址?)以及在加载内核/initrd 方面这些与 Grub 相比在多大程度上? …
我需要将 RHEL 6.6/7.0 引导至只读模式,仅在 RAM 中具有可写层。我相信这类似于 live CD 的工作方式,因为文件系统是只读的,但它的某些部分在加载到 RAM 后是可写的。在这里,写入文件系统的任何更改都会在重新启动时丢失(因为在可写层中只更新了 RAM)。
在网上环顾四周时,我没有找到有关在没有帮助工具的情况下配置我自己的“live CD”的指南,以便我可以在现有的已安装系统中模拟此过程。
有谁知道我可以从哪里获得有关构建自己的 Live CD 或仅在 RAM 中具有可写层的只读 Linux 的一些资源?
我有一台机器用于双启动 Ubuntu(当前为 16.04)和 Windows 7,使用 Ubuntu 的 GRUB 作为引导加载程序。
现在我按照官方安装说明添加了 Arch Linux 作为第三个操作系统。我没有从 Arch 安装 GRUB,因为我想使用由 Ubuntu 控制的那个。这些说明包含一个命令mkinitcpio -p linux,该命令可能会生成一些我按照描述运行的引导文件。
现在,当我尝试通过其默认条目从 GRUB 启动 Ubuntu 时,出现了这个令人不快的错误(抱歉屏幕照片):
正如输出uname -a所示,它正在尝试启动 Arch 内核,但/dev/sda6它是 Ubuntu 根分区。
我必须导航到Advanced options for Ubuntu并选择其中一个Ubuntu, with Linux 4.4.0-*条目才能加载 Ubuntu,但我找不到可以正确加载 Arch 的条目。
sudo update-grub从 Ubuntu运行(“update-grub是用于运行grub-mkconfig -o /boot/grub/grub.cfg以生成 grub2 配置文件的存根。”)不会更改任何内容。grub-customizer到目前为止,该工具也无法解决此问题。
是什么导致了 GRUB 的这种混乱,我该如何修复它以便每个 Linux 版本都使用正确的内核和正确的分区启动?
看起来我在安装了 Ubuntu 的 /boot 的情况下愚蠢地安装了 Arch,所以它可能将其引导文件放在那里。
我可以擦除所有与 Arch …
如果/proc/config.gz不可用,我怎么知道正在运行的内核能够在压缩文件上使用哪些解压缩算法cpio initramfs?
gzip算法是否始终可用,即使在构建内核时CONFIG_DECOMPRESS_GZIP不可用y?
我正在编写一个脚本,从 debootstrap 创建一个完全加密的可清洗系统。它做得很好,但是出来的initramfs图像没有正确地拾取 cryptroot。使用 qemu 启动映像后,我进入了一个 busybox shell,我必须使用cryptsetup以下命令手动解锁 luks 加密:
cryptsetup luksOpen /dev/sda1 system
/scripts/local-premount/flashback
exit
Run Code Online (Sandbox Code Playgroud)
(闪回做了一些 btrfs 快照魔术来忘记每次启动时所做的更改)
在此之后,qemu 中的引导继续正常进行,然后我就能够生成一个好的initramfs映像。我将其复制到 btrfs @root.base 子卷,从那时起一切都很好。
我需要帮助弄清楚为什么 cryptsetup/cryptroot 部分没有通过以下方式在 chroot 环境中被拾取update-initramfs:
echo "CRYPTSETUP=y" >> /usr/share/initramfs-tools/conf-hooks.d/cryptsetup
echo "export CRYPTSETUP=y" >> /usr/share/initramfs-tools/conf-hooks.d/cryptsetup
update-initramfs -ut
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,我写了一个很好的 fstab 和 crypttab,甚至尝试在 grub.cfg 中显式设置 cryptdevice。参考脚本的具体版本。
下面是我创建 fstab 和 crypttab 的方法:
export partuuid=$(blkid $partition | sed -re 's/.*: UUID="([^"]+)".*/\1/')
export decruuid=$(blkid /dev/mapper/$decrypted | sed -re 's/.*: UUID="([^"]+)".*/\1/') …Run Code Online (Sandbox Code Playgroud) initramfs ×10
linux-kernel ×3
boot ×2
debian ×2
kernel ×2
linux ×2
ubuntu ×2
arch-linux ×1
boot-loader ×1
compression ×1
cryptsetup ×1
debootstrap ×1
dual-boot ×1
fedora ×1
fstab ×1
grub2 ×1
hibernate ×1
init-script ×1
initrd ×1
livecd ×1
luks ×1
mdadm ×1
proc ×1
raid ×1
readonly ×1
rescue ×1
rhel ×1
sysfs ×1