[ad_1]
OS chroot 命令允许您从当前的 Gnu/Linux 中挂载和运行另一个 Gnu/Linux。 它通过在您的系统中安装嵌套分区来实现这一点,并为您提供一个允许访问这个 chroot 操作系统的 shell。 这将允许您从运行中管理或调试另一个 Gnu/Linux Fedora Linux
介绍
免责声明: 当我说 chroot 时,我的意思是命令,而 chrootDir 是一个文件夹。 OSext 是要使用的外部操作系统。 以下所有命令都以超级用户身份执行。 为了增加可读性,我删除了 sudo 一开始,在执行任务时不要忘记成为超级管理员。 […] 意味着我削减了一些终端输出。
首先,我将回顾如何在经典文件系统(ext4、xfs、fat 等)上执行 chroot,然后我们将了解如何在我们全新的标准 Btrfs 及其子卷上执行此操作。
该过程类似于用于更改 root 密码的过程,或者我们可以用来修复损坏的 fstab(它发生了,相信我)。 我们也可以使用 chroot 命令在我们的系统中挂载一个 Gnu/Linux Fedora Linux 以执行操作(更新、文件恢复、调试等)。
一些解释
这 chroot 命令可让您临时“更改”根位置。 这使您可以在目录树中对服务或用户进行分区。
当您使用 chroot 运行已挂载的 Gnu/Linux 操作系统时,为了使其功能齐全,您必须在 chrootDir 的“目录树中的原始位置”中挂载特殊的系统文件夹。 这允许 chroot 操作系统与内核对话。
这些特殊的系统文件夹是:
- /dev 用于设备;
- /proc 包含有关系统(内核和进程)的信息;
- /sys 包含有关硬件的信息。
例如,/dev 必须安装在 chrootDir/dev 中。
因为我总是通过练习学得更好,所以让我们动手吧。
没有 btrfs 子卷的文件系统
经典方法
在以下示例中,我们要挂载的分区是 OSext 根 (/)。 它位于 /dev/vda2 中,我们将它挂载到 chrootDir (/mnt) 目录中。 /mnt 不是必需的,您也可以将分区挂载到其他地方。
# mount /dev/vda2 /mnt # mount --bind /dev /mnt/dev # mount -t proc /proc /mnt/proc # mount -t sysfs /sys /mnt/sys # mount -t tmpfs tmpfs /mnt/run # mkdir -p /mnt/run/systemd/resolve/ # echo 'nameserver 1.1.1.1' > /mnt/run/systemd/resolve/stub-resolv.conf # chroot /mnt
–bind 选项使内容可在两个位置访问,-t 定义文件系统类型。 见 联机帮助页 想要查询更多的信息。
我们将挂载 /run 作为 tmpfs(在内存中),因为我们使用的是 systemd-resolved(这是现在的默认设置) Fedora)。 然后我们将创建文件夹和文件 stub-resolv.conf,该文件通过指向 /etc/resolv.conf 的符号链接关联。 此文件包含解析器 IP。 在此示例中,解析器为 1.1.1.1,但您可以使用任何您喜欢的解析器 IP。
要退出 chroot,shell 命令是 exit。 之后,我们卸载刚刚挂载的所有文件夹:
exit # umount /mnt/dev # umount /mnt/proc # umount /mnt/sys # umount /mnt/run # umount /mnt
lvm的案例
在lvm的情况下,分区不是直接可用的,必须先映射。
# fdisk -l /dev/vda2 Disk /dev/vda2: 19 GiB, 20400046080 bytes, 39843840 sectors [...] I/O size (minimum/optimal): 512 bytes / 512 bytes # mount /dev/vda2 /mnt/ mount: /mnt: unknown filesystem type 'LVM2_member'.
如您所见,我们无法直接挂载 /dev/vda2。 我们现在将使用 lvm 工具来定位我们的分区。
# pvscan PV /dev/vda2 VG cl lvm2 [<19.00 GiB / 0 free] Total: 1 [<19.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 0 [0] # vgscan Found volume group "cl" using metadata type lvm2 # lvscan ACTIVE '/dev/cl/root' [10.00 GiB] inherit ACTIVE '/dev/cl/swap' [2.00 GiB] inherit ACTIVE '/dev/cl/home' [1.00 GiB] inherit ACTIVE '/dev/cl/var' [<6.00 GiB] inherit
所以在这里我们可以看到逻辑卷映射到 /dev/cl 的位置,我们可以像以前一样挂载这些分区,使用相同的方法:
# mount /dev/cl/root /mnt/ # mount /dev/cl/home /mnt/home/ # mount /dev/cl/var /mnt/var/ # mount --bind /dev /mnt/dev # mount -t proc /proc /mnt/proc # mount -t sysfs /sys /mnt/sys # mount -t tmpfs tmpfs /mnt/run # mkdir -p /mnt/run/systemd/resolve/ # echo 'nameserver 1.1.1.1' > /mnt/run/systemd/resolve/stub-resolv.conf # chroot /mnt
带有子卷的 Btrfs 文件系统
带有子卷的 btrfs 分区概述
让我们来看看文件系统。
Fdisk 告诉我们物理介质上只有两个分区。
# fdisk -l Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors […] Device Boot Start End Sectors Size Id Type /dev/vda1 * 2048 2099199 2097152 1G 83 Linux /dev/vda2 2099200 41943039 39843840 19G 83 Linux
以下是目标系统的 fstab (OSext) 的内容:
UUID=3de441bd-59fc-4a12-8343-8392faab5ac7 / btrfs subvol=root,compress=zstd:1 0 0 UUID=71dc4f0f-9562-40d6-830b-bea065d4f246 /boot ext4 defaults 1 2 UUID=3de441bd-59fc-4a12-8343-8392faab5ac7 /home btrfs subvol=home,compress=zstd:1 0 0
查看 fstab 中的 UUID,我们可以看到有两个不同的。
一个是 ext4,这里用于 /boot,另一个是包含两个挂载点(子卷),/ 和 /home 的 btrfs。
带有子卷的 btrfs 文件系统概述
我们直接挂载看看btrfs分区(这里是/dev/vda2)里面有什么:
# mount /dev/vda2 /mnt/ # ls /mnt/ home root # ls /mnt/root/ bin dev home lib64 media opt root sbin sys usr boot etc lib lost+found mnt proc run srv tmp var # ls /mnt/home/ user # umount /mnt
在这里我们可以看到,在挂载的分区中有两个文件夹(子卷),其中包含许多不同的目录(目标文件层次结构)。
要获取有关子卷的信息,有一种更优雅的方法。
# mount /dev/vda2 /mnt/ # btrfs subvolume list /mnt ID 256 gen 178 top level 5 path home ID 258 gen 200 top level 5 path root ID 262 gen 160 top level 258 path root/var/lib/machines # umount /mnt
带有 btrfs 子卷的实用 chroot
现在我们已经查看了分区的内容,我们将系统挂载到 chrootDir(示例中的 /mnt)。 我们将通过将挂载类型添加为 btrfs 和 subvolume subvol=SubVolumeName 选项来完成此操作。 我们还将以相同的方式添加特殊的系统文件夹和其他分区。
# mount /dev/vda2 /mnt/ -t btrfs -o subvol=root # ls /mnt/ bin dev home lib64 media opt root sbin sys usr boot etc lib lost+found mnt proc run srv tmp var # ls /mnt/home/ <it's still empty> # mount /dev/vda2 /mnt/home -t btrfs -o subvol=home # ls /mnt/home/ user # mount /dev/vda1 /mnt/boot # mount --bind /dev /mnt/dev # mount -t proc /proc /mnt/proc # mount -t sysfs /sys /mnt/sys # mount -t tmpfs tmpfs /mnt/run # mkdir -p /mnt/run/systemd/resolve/ # echo 'nameserver 1.1.1.1' > /mnt/run/systemd/resolve/stub-resolv.conf # chroot /mnt
工作完成后,我们使用 shell 命令 exit 并卸载所有先前安装的目录以及 chrootDir 本身 (/mnt)。
exit # umount /mnt/boot # umount /mnt/sys # umount /mnt/proc # umount /mnt/sys # umount /mnt/run # umount /mnt
结论
正如您在下面的屏幕截图中看到的那样,我对一个 Fedora 来自现场的 Linux 34 工作站 Fedora 33安全实验室CD,那样的话,如果一个朋友需要你调试他/她/他们的 Gnu/Linux,他/她/他们只需要把硬盘带给你,而不是整个桌面/服务器机器。
如果在主机操作系统和 OSext(chroot 操作系统)之间使用不同的 shell,请小心,例如 ksh bash. 您可以通过在 chroot 命令的末尾添加此 shell 的路径来指定要在 OSext 上运行的 shell。 例如:
# chroot /mnt /usr/bin/bash
我希望这对需要调试的人有用,或者如果您只需要更新其他 Fedora Linux 在你的双启动中,不想重新启动 ?
这篇文章只是引用了btrfs的一部分,更多信息可以看一下 维基 这将为您提供所需的所有信息。
祝 chroot 玩得开心。
[ad_2]