Open3
SquashFS
SquashFS
- SquashFS は、Linux 向けの読み取り専用の圧縮されたファイルシステムである。
参考リンク
Hands-On
環境
- Amazon Linux 2023
ツールのインストール
$ sudo yum install -y squashfs-tools
mksquashfs
, sqfscat
, sqfstar
, unsquashfs
などのツールがダウンロードされる。
$ rpm -ql squashfs-tools
/usr/lib/.build-id
/usr/lib/.build-id/2c
/usr/lib/.build-id/2c/c76d16e1c43c4139c0b7c77d8d701434ea2e75
/usr/lib/.build-id/a2
/usr/lib/.build-id/a2/b41f5c49823a9c3930390ebfa1dd4c7c36c1e0
/usr/sbin/mksquashfs
/usr/sbin/sqfscat
/usr/sbin/sqfstar
/usr/sbin/unsquashfs
/usr/share/doc/squashfs-tools
/usr/share/doc/squashfs-tools/ACKNOWLEDGEMENTS
/usr/share/doc/squashfs-tools/CHANGES
/usr/share/doc/squashfs-tools/COPYING
/usr/share/doc/squashfs-tools/README
/usr/share/doc/squashfs-tools/README-4.5
/usr/share/doc/squashfs-tools/USAGE
/usr/share/man/man1/mksquashfs.1.gz
/usr/share/man/man1/unsquashfs.1.gz
イメージの作成
まずは圧縮するファイルシステムを作成する。
$ mkdir sample
$ touch sample/a.txt
$ touch sample/b.txt
$ echo hello > sample/hello.txx
$ dd if=/dev/zero of=sample/dd.txt bs=4K count=10
squashfs イメージを作成する。
$ mksquashfs sample/ sample.sqfs
Parallel mksquashfs: Using 2 processors
Creating 4.0 filesystem on sample.sqfs, block size 131072.
[====================================================|] 2/2 100%
Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
compressed data, compressed metadata, compressed fragments,
compressed xattrs, compressed ids
duplicates are removed
Filesystem size 0.39 Kbytes (0.00 Mbytes)
0.97% of uncompressed filesystem size (40.61 Kbytes)
Inode table size 78 bytes (0.08 Kbytes)
28.89% of uncompressed inode table size (270 bytes)
Directory table size 56 bytes (0.05 Kbytes)
78.87% of uncompressed directory table size (71 bytes)
Xattr table size 54 bytes (0.05 Kbytes)
100.00% of uncompressed xattr table size (54 bytes)
Number of duplicate files found 2
Number of inodes 5
Number of files 4
Number of fragments 1
Number of symbolic links 0
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 1
Number of ids (unique uids + gids) 1
Number of uids 1
ec2-user (1000)
Number of gids 1
ec2-user (1000)
ちゃんと圧縮されていることを確認。
$ du -sh sample/
44K sample/
$ du -sh sample.sqfs
4.0K sample.sqfs
マウント
/mnt
配下にマウントする。
$ sudo mount -t squashfs sample.sqfs /mnt
マウントしたものを確認する。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 0 loop /mnt
nvme0n1 259:0 0 100G 0 disk
├─nvme0n1p1 259:1 0 100G 0 part /
├─nvme0n1p127 259:2 0 1M 0 part
└─nvme0n1p128 259:3 0 10M 0 part /boot/efi
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 453M 0 453M 0% /dev/shm
tmpfs tmpfs 182M 448K 181M 1% /run
/dev/nvme0n1p1 xfs 100G 2.2G 98G 3% /
tmpfs tmpfs 453M 0 453M 0% /tmp
/dev/nvme0n1p128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 91M 0 91M 0% /run/user/1000
/dev/loop0 squashfs 128K 128K 0 100% /mnt
df
コマンド上では、サイズが 128K になっているのは、デフォルトのブロックサイズが 128 KB なせい (次のスレッドで検証) 。
書き込みしてみる
$ ls -la /mnt
total 43
drwxr-xr-x. 2 ec2-user ec2-user 72 Feb 6 18:18 .
dr-xr-xr-x. 18 root root 237 Jan 26 00:39 ..
-rw-r--r--. 1 ec2-user ec2-user 0 Feb 6 18:15 a.txt
-rw-r--r--. 1 ec2-user ec2-user 0 Feb 6 18:15 b.txt
-rw-r--r--. 1 ec2-user ec2-user 40960 Feb 6 18:18 dd.txt
-rw-r--r--. 1 ec2-user ec2-user 6 Feb 6 18:15 hello.txt
ファイルのアクセス権限は元のまま。
試しに書き込みしてみる。
$ echo world > /mnt/hello.txt
-bash: /mnt/hello.txt: Read-only file system
ちゃんと拒否される。
アンマウント
$ sudo umount /mnt
解凍
$ unsquashfs sample.sqfs
Parallel unsquashfs: Using 2 processors
4 inodes (2 blocks) to write
write_xattr: could not write xattr security.selinux for file squashfs-root/a.txt because you're not superuser!
write_xattr: to avoid this error message, either specify -user-xattrs, -no-xattrs, or run as superuser!
Further error messages of this type are suppressed!
[=========================================================================================================================================================================================================|] 2/2 100%
created 4 files
created 1 directory
created 0 symlinks
created 0 devices
created 0 fifos
created 0 sockets
$ ls -la squashfs-root/
total 44
drwxr-xr-x. 2 ec2-user ec2-user 63 Feb 6 18:18 .
drwx------. 5 ec2-user ec2-user 144 Feb 6 18:28 ..
-rw-r--r--. 1 ec2-user ec2-user 0 Feb 6 18:15 a.txt
-rw-r--r--. 1 ec2-user ec2-user 0 Feb 6 18:15 b.txt
-rw-r--r--. 1 ec2-user ec2-user 40960 Feb 6 18:18 dd.txt
-rw-r--r--. 1 ec2-user ec2-user 6 Feb 6 18:15 hello.txt
Hands-On (Cont.)
ブロックサイズを 4KB にすると、df
コマンドの結果でも 4K になる。
$ mksquashfs sample sample-4K.sqfs -b 4K
$ sudo mount -t squashfs sample-4K.sqfs /mnt
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 4K 0 loop /mnt
nvme0n1 259:0 0 100G 0 disk
├─nvme0n1p1 259:1 0 100G 0 part /
├─nvme0n1p127 259:2 0 1M 0 part
└─nvme0n1p128 259:3 0 10M 0 part /boot/efi
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs tmpfs 453M 0 453M 0% /dev/shm
tmpfs tmpfs 182M 448K 181M 1% /run
/dev/nvme0n1p1 xfs 100G 2.2G 98G 3% /
tmpfs tmpfs 453M 0 453M 0% /tmp
/dev/nvme0n1p128 vfat 10M 1.3M 8.7M 13% /boot/efi
tmpfs tmpfs 91M 0 91M 0% /run/user/1000
/dev/loop0 squashfs 4.0K 4.0K 0 100% /mnt
デフォルトのブロックサイズ 128KB のものと統計情報を比較。
$ unsquashfs -stat sample.sqfs
Found a valid SQUASHFS 4:0 superblock on sample.sqfs.
Creation or last append time Tue Feb 6 18:22:37 2024
Filesystem size 404 bytes (0.39 Kbytes / 0.00 Mbytes)
Compression gzip
Block size 131072
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Uids/Gids (Id table) are compressed
Fragments are compressed
Always-use-fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 1
Number of inodes 5
Number of ids 1
Number of xattr ids 1
$ unsquashfs -stat sample-4K.sqfs
Found a valid SQUASHFS 4:0 superblock on sample-4K.sqfs.
Creation or last append time Tue Feb 6 18:33:31 2024
Filesystem size 407 bytes (0.40 Kbytes / 0.00 Mbytes)
Compression gzip
Block size 4096
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Uids/Gids (Id table) are compressed
Fragments are compressed
Always-use-fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 1
Number of inodes 5
Number of ids 1
Number of xattr ids 1