
我有一些 SquashFS 文件,我想知道它們是如何壓縮的,以便我可以大致了解它們在安裝時的執行情況。
squashfs-tools
該軟體包提供的唯一二進位檔案是mksquashfs
和unsquashfs
,它們分別用於建立/附加 SquashFS 檔案和提取 SquashFS 檔案。
如何確定使用什麼壓縮方法來製作特定的 SquashFS 檔案?
答案1
unsquashfs -s
沒有能力顯示所使用的壓縮類型,直到此提交於 2009 年 8 月 7 日。這意味著如果您運行的是squashfs-tools
4.0 或更早版本,您將無法看到所使用的壓縮方法。
根據這些信息,我得出了一種讀取 SquashFS 4.0 超級區塊以確定所使用的壓縮方法的方法(其中$SQUASHFS
是 SquashFS 檔案的路徑):
dd if=$SQUASHFS bs=1 count=2 skip=20 2>/dev/zero | od -An -tdI | xargs
或者,對於那些想要在行尾輸入檔案名稱的人來說,這裡有一個函數:
sqsh_comp_method(){ dd if="$1" bs=1 count=2 skip=20 2>/dev/zero|od -An -tdI | xargs;};sqsh_comp_method
您將得到一個數字(從 SquashFS 4.4 開始,數字在 1 到 6 之間)。您可以將該數字與下表進行匹配,以查看使用的壓縮方法:
╔═══╦════════════════════╦════════════════════╗
║ # ║ Compression Method ║ Compatible Version ║
╠═══╬════════════════════╬════════════════════╣
║ 1 ║ gzip ║ 1.0 and newer ║
║ 2 ║ lzma ║ 4.1 and newer ║
║ 3 ║ lzo ║ 4.1 and newer ║
║ 4 ║ xz ║ 4.2 and newer ║
║ 5 ║ lz4 ║ 4.3 and newer ║
║ 6 ║ zstd ║ 4.4 and newer ║
╚═══╩════════════════════╩════════════════════╝
(來源)
dd
請注意,只有當您指定的檔案具有 SquashFS 4.0 超級區塊時,上述命令才會提供可靠的輸出。Not SquashFS 4.0
如果檔案$SQUASHFS
沒有 SquashFS 4.0 幻數,以下指令將輸出「 」:
if [[ "$(dd if="$SQUASHFS" bs=1 count=4 skip=28 2>/dev/zero | xxd -p)" != "04000000" ]] ; then echo -n "Not " ; fi ; echo "SquashFS 4.0"
解釋
在 SquashFS 4.0 檔案系統中,壓縮方法作為資料類型儲存在超級區塊的第21和 22位元組short
上。 dd bs=1 count=2 skip=20
將檢索short
,od -An -tdI
將把 變成short
人類可讀的數字,並且xargs
只是去掉前導空格。
在 SquashFS 4.0 之前,只有壓縮包方法。
舊答案
unsquashfs
有-s
用於顯示 SquashFS 檔案系統資訊的標誌。
用法範例:
deltik@node51 [/tmp]# unsquashfs -s template.squashfs
Found a valid SQUASHFS 4:0 superblock on template.squashfs.
Creation or last append time Thu Apr 30 23:07:23 2015
Filesystem size 47225242.44 Kbytes (46118.40 Mbytes)
Compression gzip
Block size 131072
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always_use_fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 23629
Number of inodes 437076
Number of ids 1
如果您只想識別壓縮類型,可以透過管道輸出awk '/^Compression/{print $2}'
。例子:
deltik@node51 [/tmp]# unsquashfs -s template.squashfs | awk '/^Compression/{print $2}'
gzip
答案2
5.39以上版本的實用file
程式支援顯示squashfs壓縮。如果提供file
一個區塊設備,則需要告訴它不要關心它是一個特殊文件,並像它是一個文件一樣查看內部。
file --special-files /dev/mmcblk0p1
/dev/mmcblk0p1: Squashfs filesystem, little endian, version 4.0, zlib compressed, 817826784 bytes, 27633 inodes, blocksize: 131072 bytes, created: Mon Nov 29 20:51:12 2021
答案3
也在尋找更好的答案。我假設您想知道,因為您的作業系統似乎不支援為您提供相關的壓縮檔案時使用的壓縮。或者可能像 CentOS6 上的 unsquashfs 一樣,您的不報告壓縮類型。
所以我 strings | head
就壓縮檔案了。第一行是hsqs
,第二行是應該 指示所使用的壓縮方法。我相信我使用此方法來確定7zXZ
表明 7zip 實際上就是該方法。然而,卻gzip
沒有這樣的運氣。我必須使用od -b
該文件來獲取八進制轉儲並嘗試將文件簽名與與file
程式關聯的簽名相匹配。然而,同樣沒有這樣的運氣(我期望找到的字串是,037 213
但我只看到037 221
.