从 LiveUSB 启动的 Linux 的 /cow 在哪里?

从 LiveUSB 启动的 Linux 的 /cow 在哪里?

我想看看当 LiveUSB Linux 运行时,在 ISO 9660 之上添加了哪些文件。启动时, USB 驱动器上的文件persistence upperwork清晰可见。我mount在从 LiveUSB“通常方式”(w/out persistence)启动的 Linux 上运行,并看到通过和/挂载。但给出.overlayfsupperdir=/cow/uppersudo ls /cowno such file or directory

在哪里/cow以及如何查看其内容?

添加 1:我能够initrd通过unmkinitramfs(参见https://unix.stackexchange.com/a/495524/446998

$ find . -type f -exec bash -c 'cat {} | grep "/cow/upper" && ls -l {}' \;
    if [ ! -d /cow/upper ]; then
        mkdir -p /cow/upper
            /cow/lost+found|/cow/upper|/cow/log|/cow/crash|/cow/install-logs-*)     continue ;;
            mv "$cow_content" /cow/upper
    mount -t overlay -o "upperdir=/cow/upper,lowerdir=$mounts,workdir=/cow/work" "/cow" "$rootmnt" || panic "overlay mount failed"
-rw-r--r-- 1 alex alex 33834 Jun 24  2020 ./main/scripts/casper  

我设想的下一步是了解如何/cow创建,因为在内容中看不到initrd

答案1

// 基于 kubuntu 22 lts livecd 的经验

chroot 之后

ramdisk (/cdrom/casper/initrd) 的最后一步是
run-init {rootmnt}" "${init}" "$@"

哪个做类似的事情
chroot {rootmnt}" "${init}" "$@"

该步骤之后可能会影响对原始挂载点的观察。

在 chroot 之前

幸运的是,有一些方法可以在 chroot 之前在交互式 shell 中暂停(按 ctrl+d 或退出以继续)

kernel boot cmdline args
break=top,premount,mount,mountroot,bottom,init
可以解决这个问题。

//BTW:manjaro 22只支持break=premount(同break=y) 或break=postmount, 不支持多个值复合,


另外另一个命令行参数可能会有所帮助
debug,或者debug=y
在 ramdisk 运行期间打开详细日志

// boot args 可以在 grub 菜单中通过按e
// 这些信息来自读取 ramdisk 脚本来编辑

在虚拟磁盘中

你已经unmkinitramfs找到了 scripts/casper
处理 casper-rw 持久性的东西

./脚本/casper

setup_overlay() {
    image_directory="$1"
    rootmnt="$2"

    # Mount up the writable layer, if it is persistent then it may well
    # tell us what format we should be using.
    mkdir -p /cow
    cowdevice="tmpfs"
    cow_fstype="tmpfs"
    cow_mountopt="rw,noatime,mode=755"

    # Looking for "$(root_persistence_label)" device or file
    if [ -n "${PERSISTENT}" ]; then
        cowprobe=$(find_cow_device "$(root_persistence_label)")
        if [ -b "${cowprobe}" ]; then
            cowdevice=${cowprobe}
            cow_fstype=$(get_fstype "${cowprobe}")
            cow_mountopt="rw,noatime"
        else
            [ "$quiet" != "y" ] && log_warning_msg "Unable to find the persistent medium"
        fi
    fi

    mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || panic "Can not mount $cowdevice on /cow"

这里的代码确定持久分区,并挂载它

在 chroot 之后保留 /cow

在 ramdisk shell 中,/cow /root 准备好之后

mkdir /root/_cow
mount -o bind /cow /root/_cow

然后chroot进入系统后,/_cow就可以访问原来的外层/cow了

答案2

LiveUSB 棒使用覆盖文件系统,例如覆盖文件系统。有几个不同的,所以我不确定它使用哪一个,但每个的原理几乎是相同的。

您看到的根文件系统是由层组成的。对于 LiveUSB 这将是

  • 上层可写层
  • 包含操作系统映像的只读下层,通常存储在 squashfs 文件中。

最初您只能看到下层中的文件,因为上层(可写)是空的。当您写入新文件时,它们将被写入上层。但其他的改变比如移动文件、编辑文件等,实际上都会导致文件从下层复制到上层。

上层可以是一些东西。如果 LiveUSB 没有持久性,它通常是仅存储在 RAM 中的临时文件系统。然而,如果有持久性,它可能会有所不同......也许它是一个使用 EXT4 格式化的可写文件。

如果它是一个可写文件,那么您也许能够找到该文件并将其单独安装到overlayfs 上以查看里面的内容。


/cow 在哪里以及如何查看其内容?

这是这个问题最难回答的部分。事实上,它可能不再存在,至少不再以这个名字存在。

它确实在 initramfs 执行期间存在。但随后 initramfs 调用了枢轴根这会移动它......然后很可能尝试卸载它,所以现在没有用户态进程实际上可以再看到它。尽管如此,内核在逻辑上仍然必须安装它。

如果坚持不懈地安装它,就有可能准确地发现它/cow是什么并将其重新安装到其他地方。

答案3

我在回答我的@yurenchen之前就发现了这一点,它在最后给出了这个想法。

下面的特定命令编辑 casper 脚本,添加引导选项的绑定安装shownmountsinitrd为此,需要解压并重新打包 initramfs( Linux Mint 21 的文件)。之后,在 liveUSO 系统完成启动后,/cow各层就可见了。/casper/cow

# add mount of /cow
sudo sed --in-place --regexp-extended -- 's|(if [[] -n "[$][{]SHOWMOUNTS[}]" []]; then)|\1\n\n        mkdir -p "${rootmnt}/${LIVE_MEDIA_PATH}/cow"\n        mount --bind /cow "${rootmnt}/${LIVE_MEDIA_PATH}/cow"\n|' $work_path/initrd/main/scripts/casper

# change mount option from "move" to "bind".
sudo sed --in-place --regexp-extended -- 's|(mount )-o move( "[$][{]d[}]" "[$][{]rootmnt[}]/[$][{]LIVE_MEDIA_PATH[}]/[$][{]d[#][#][*]/[}]")|\1--bind\2|' $work_path/initrd/main/scripts/casper

另外,作为奖励,第二个命令会更改挂载类型,由于某种原因,在启动的系统中/casper我看到了 squashfs 的文件夹,但它是空的。使用 with 命令时,它不是,但充满了内容。 PS/rofs也有同样的情况,但对于只有一个上层,发行版的 ISO 中可能有多个 squashfs 文件。

相关内容