如何在沒有超級使用者權限的情況下建立ext2映像?

如何在沒有超級使用者權限的情況下建立ext2映像?

我需要產生幾個 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"

GitHub 上游

關鍵選項是-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:描述如何解決以下問題:

一個鏡像檔案中的多個分區

看看這個:https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-without-root-privileges/52850819#52850819

答案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

相關內容