OS Chroot 101:覆盖 btrfs 子卷

[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]

Related Posts