我想看看当 LiveUSB Linux 运行时,在 ISO 9660 之上添加了哪些文件。启动时, USB 驱动器上的文件persistence
upper
夹work
清晰可见。我mount
在从 LiveUSB“通常方式”(w/out persistence
)启动的 Linux 上运行,并看到通过和/
挂载。但给出.overlayfs
upperdir=/cow/upper
sudo ls /cow
no 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 脚本,添加引导选项的绑定安装shownmounts
。initrd
为此,需要解压并重新打包 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 文件。