我需要產生幾個 ext2 圖像。最明顯的方法是建立一個映像,安裝它並複製內容。但它需要兩次 root 權限(以 chown 檔案和安裝映像)。我還發現了兩個用於生成圖像的工具:e2fsimage 和 genext2fs。
genext2fs 在生成時將影像放置在 RAM 中,但我的其中一張影像的大小約為 30GiB。
e2fsimage 因某些影像大小值而崩潰。
那我怎麼能生成我的圖像呢?如果該工具能夠自行計算圖像大小,那就太好了。
答案1
mke2fs -d
最小的可運行範例,無需sudo
mke2fs
是 e2fsprogs 套件的一部分。它是由 2018 年在 Google 工作的著名 Linux 核心檔案系統開發人員 Theodore Ts'o 編寫,上游原始碼位於 kernel.org 下:https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs因此,此儲存庫可被視為 ext 檔案系統操作的參考使用者態實作:
#!/usr/bin/env bash
set -eu
root_dir=root
img_file=img.ext2
# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"
# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
-L '' \
-N 0 \
-O ^64bit \
-d "$root_dir" \
-m 5 \
-r 1 \
-t ext2 \
"$img_file" \
32M \
;
# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"
關鍵選項是-d
, 它選擇用於鏡像的目錄,它是 commit 中對 v1.43 的一個相對較新的補充。0d4deba22e2aa95ad958b44972dc933fd0ebbc59
因此,它可以在開箱即用的 Ubuntu 18.04 上運行,其中 e2fsprogs 1.44.1-1,但不能在 Ubuntu 16.04 上運行,後者的版本為 1.42.13。
然而,我們可以像 Buildroot 一樣,在 Ubuntu 16.04 上輕鬆地從原始碼編譯它:
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h
如果mke2fs
失敗:
__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system
新增選項時:
-E no_copy_xattrs
例如,當根目錄位於 NFS 或而tmpfs
不是 extX 作為這些檔案系統時,這是必要的似乎沒有擴展屬性。
mke2fs
通常符號連結到mkfs.extX
,並man mke2fs
表示如果您將 call if 與此類符號連結一起使用,則-t
隱含了 then 。
我是如何發現這一點以及如何解決未來的問題的:建構根無需 sudo 即可產生 ext2 映像如圖所示,所以我只是運行構建V=1
並從最後的圖像生成部分提取命令。好的舊複製貼上從來沒有讓我失望過。
TODO:描述如何解決以下問題:
- 在映像中建立 sudo 擁有的檔案。 Buildroot 就可以做到。
- 自動計算所需的最小尺寸。最初估計
du
檔案大小和find . | wc
目錄結構,最小為 32Mb(較小的失敗),然後加倍直到命令起作用,這可能是一個非常好的方法。 Buildroot曾經這樣做過,但由於某種原因停止了,但我們自己實現起來很容易。 - 方便地從分區中提取所有文件:
一個鏡像檔案中的多個分區
答案2
找出e2fsimage
崩潰的原因。這是圖片大小大於4GiB時int32溢位所引起的。因此,解決方案是計算所需的區塊和索引節點,建立循環文件(truncate
& mke2fs
),然後e2fsimage
與-n
參數一起使用(因此它不會建立循環文件,而是使用已經建立的循環文件)
答案3
建立鏡像不需要root權限。以下是建立 ext2 映像的範例:
dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2
但掛載設備需要root權限:
mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk