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

Mar*_*020 5 initrd live-usb livecd initramfs overlayfs

我想看看当 LiveUSB Linux 运行时,在 ISO 9660 之上添加了哪些文件。启动时, USB 驱动器上的persistence upper文件work夹清晰可见。我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)从liveUSB中提取内容

$ 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  
Run Code Online (Sandbox Code Playgroud)

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

yur*_*hen 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"
Run Code Online (Sandbox Code Playgroud)

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

在 chroot 之后保留 /cow

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

mkdir /root/_cow
mount -o bind /cow /root/_cow
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!在阅读您的答案之前,我自己发现了“-bind”的解决方案,我已经用“sed”命令发布了一个答案来编辑 casper 脚本。至于使用内核参数暂停,这是一个有趣的想法。顺便说一句,如果您知道的话,请阅读我的答案并评论为什么“showmounts”的原始安装会导致空文件夹。TIA (2认同)