Open3

SquashFS

zulinx86zulinx86

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
zulinx86zulinx86

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