我在 U 盘上安装了 Clonezilla,我想对操作系统进行一些修改。具体来说,我想插入一个可运行的脚本/usr/sbin
,以便轻松运行我自己的备份命令,从而减少备份的痛苦。
主文件系统/live/filesystem.squashfs
位于 USB FAT-32 分区下。
我如何在我的 Linux 机器上安装这个读/写以便能够添加/删除/更改文件?我正在运行 Ubuntu 12.04 衍生版本。
显然,我不想实际修改 squashfs。不过,我想做的是采用现有的 squashfs、一组文件并创建一个新的 squashfs,它与旧的相同,只是该组中的文件替换了 squashfs 中的类似文件,或者只是添加(如果有)没有类似的文件。
好吧,最后一部分听起来很奇怪。那我举个例子:
有一个叫做 mfs.squash 的 squashfs。里面有一个文件./a/foo
。我想创建一个新的 squashfs,它与旧的 squashfs 相同——除了有一个新文件a/b
并且我./a/foo
用我的规范之一覆盖了它。
为什么 Live ISO 不能只是一个带有安装程序的最小 Linux 系统?有什么理由使用squashfs来保存文件系统的根目录吗?是为了更好的压缩,还是还有其他原因?
我看到一些答案(和评论)说这是出于只读原因。持久性怎么样,比如 Ubuntu 或 EndeavourOS 的 Live USB 中的持久性?
我试图通过解压缩、编辑我的文件并再次压缩来修改固件文件。但是由于不同的 squashfs 类型(如我所想),我遇到了不接受该文件的设备的问题。这是我的开发箱上的输出:
原始文件:
user@ubuntuVM:~$ unsquashfs -s main-fs.5_0
Reading a different endian SQUASHFS filesystem on main-fs.5_0
Found a valid big endian SQUASHFS 3:0 superblock on main-fs.5_0.
Creation or last append time Thu Aug 21 20:56:15 2008
Filesystem size 9653.75 Kbytes (9.43 Mbytes)
Block size 65536
Filesystem is not exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always_use_fragments option is not specified
Check data is not present in the filesystem
Duplicates are removed
Number of fragments 105 …
Run Code Online (Sandbox Code Playgroud) 是否可以将 SquashFS 文件系统用作 LXC rootfs?我可以通过设置lxc.rootfs
文件名将 ext3 映像挂载为 rootfs ,但如果它是任何其他类型的映像,则lxc-start
只是说它无法挂载 ext3 文件系统。该lxc.conf
男子页面不建议任何方式指定文件系统类型。
此外,如果我过了那个阶段,您是否可以仅通过使用选项字段中的lxc.mount.entry
条目在容器中挂载其他环回文件系统'loop'
?
我曾尝试从固件(嵌入式 linux)挂载文件系统,但在我的 Ubuntu 12.04 机器上失败了。你能告诉我如何挂载那个文件系统吗?(或失败的可能原因)。详情如下。
Step1) 使用binwalk 分析固件显示squashfs 文件系统的起始地址。因此,我使用“dd”linux 实用程序生成了 squashfs 文件系统。
Step2) 使用“binwalk ./fs.img”命令分析生成的文件系统显示:
Squashfs filesystem, big endian, lzma signatrue, version 3.0, size: XXXXXXX bytes, XXX inodes, blocksize: XXXXX bytes, created: xxxx
Run Code Online (Sandbox Code Playgroud)
Step3) “mount -o loop ./fs.img ./fs”失败。“dmesg | tail”显示:
SQUASHFS error: Can't find a SQUASHFS superblock on loop1
Run Code Online (Sandbox Code Playgroud)
如何挂载该文件系统?仅供参考,我从“sourceforge.net/procjects/squashfs”安装了最新的带有 lzma 支持的 squashfs 工具。
当我使用 Unetbootin 将 Linux ISO 放在 USB 驱动器上时,它进行得非常快,直到它到达filesystem.squashfs
,这比其他所有东西加起来需要更长的时间来处理。
这是在向 USB 写入一个新的文件系统,还是在复制一些巨大的文件系统相关文件?如果是这样,如果我将尝试许多发行版并希望加快这一步,有没有办法只做一次?
我正在尝试更新自定义 initramfs init 脚本以将 squashfs 映像安装为根文件系统。我一直在测试以只读方式将壁球图像安装到循环设备,以读写方式将另一个空文件安装到另一个循环设备,并使用设备映射器创建 ro 循环设备的 rw 快照。
我已经用我的测试脚本(以 root 身份运行)做到了这一点:
mkdir /tmp/squash_rw
dev=$(losetup -f)
losetup -r $dev /mcp_fs.sqsh
ovl=/overlay
newdevname=overlay
size=$(blockdev --getsz "$dev")
loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" | dmsetup create "$newdevname"
Run Code Online (Sandbox Code Playgroud)
然后,我使用 touch 来测试新设备是否以 rw 方式安装,但出现错误,并提示它是只读设备。
# touch /tmp/squash_rw/test
touch: cannot touch '/tmp/squash_rw/test': Read-only file system
Run Code Online (Sandbox Code Playgroud)
我使用的是 gentoo 发行版和 Linux 内核 3.10.6,其中包含设备映射器和 squashfs 模块。许多参考资料建议使用 dracut initramfs,但我试图让供应商提供的 init 脚本工作。
我已经坚持了几天,非常感谢任何人可以提供的任何帮助。
在继续研究和实验之后,我正在制作的 devmapper 设备似乎假定第一个设备的文件系统正在合并在一起。如果我使用 squashfs 设备,则 devmapper 设备是只读的,如果我使用 rw …
假设我们有filesystem.squashfs
,我们可以通过以下方式附加到它:
mksquashfs somefile filesystem.squashfs
Run Code Online (Sandbox Code Playgroud)
它附加somefile
到 squashfs 文件的根目录。附加目录:
mksquashfs somedir/ filesystem.squashfs
Run Code Online (Sandbox Code Playgroud)
将里面的文件和目录附加somedir/
到squashfs文件的根目录。如果在 squashfs 树中存在目录或文件,mksquashfs
则将重命名新文件,而不是更改旧文件和目录。好吧,“附加”这个短语是有道理的。
我知道unsquashfs
哪个解压缩了 squashfs,但我很好奇是否有一种方法可以在不解压的情况下将新文件或目录添加到 squashfs 树中的现有子目录?
我经常使用 mksquashfs 来备份各种系统上的文件夹。有时,这会导致文件在安装时无法被任何用户读取。如果我执行 asudo mount file.squashfs /to/mountpoint
然后尝试以 root 身份或使用 sudo ls 该目录,则会收到“权限被拒绝”错误。在 Thunar 中查看挂载点的属性会导致其所有者显示为nobody
。应用achmod
也不起作用,因为squashfs 是只读文件系统。
如何强制挂载以与权限无关的方式或使用正确的权限挂载squashfs?我实际上不需要这个用例的权限,它也可能是世界可读的。
编辑:我从未找到打开“由于权限而无法由 root 读取”squashfs 文件的完整解决方案,但我确实找到了一种方法来防止它再次发生。这可以跨系统和跨平台工作。添加 -all-root 使存档中的所有文件都归 root 所有。由于权限对于这些备份并不重要,因此这是一个笨拙但有效的修复方法。仍然很好奇是否有人有更好的。
squashfs ×10
linux ×4
mount ×4
filesystems ×3
live-usb ×2
boot ×1
initramfs ×1
loop-device ×1
lxc ×1
permissions ×1
read-write ×1
unetbootin ×1