題 如何在沒有超級用戶權限的情況下創建ext2映像?


我需要生成幾個ext2圖像。 顯而易見的方法是創建一個圖像,安裝它並複制內容。但它需要root權限兩次(以便chown文件並掛載圖像)。 我還發現了兩個用於生成圖像的工具:e2fsimage和genext2fs。

  • genext2fs在生成時將圖像放置在RAM中,但我的一個圖像的大小為~30GiB。

  • e2fsimage崩潰了一些圖像大小的值。

那麼如何生成我的圖像呢?如果該工具將自己計算圖像大小,那將是很好的。


5
2018-06-08 08:49


起源




答案:


想出原因 e2fsimage 崩潰。當圖像大小大於4GiB時,它是由int32溢出引起的。 所以解決方案是計算所需的塊和inode,創建循環文件(truncate & mke2fs)然後使用 e2fsimage 同 -n 參數(因此它不會創建循環文件但使用已創建的循環文件)


2
2018-06-08 14:21



您是否為此發送了錯誤報告和/或補丁? - Toby Speight
我懷疑我做到了。抱歉。 - Equidamoid


創建映像不需要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

1
2017-09-29 06:14





mke2fs -d 最小的runnable示例沒有 sudo

mke2fs 是e2fsprogs包的一部分。它是由著名的Linux內核文件系統開發人員Theodore Ts'o撰寫的,他於2018年在谷歌工作,上游源代碼位於kernel.org: https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs 因此,該存儲庫可以被視為ext文件系統操作的引用userland實現:

#!/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,它選擇用於圖像的目錄,它是提交中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 說,如果你使用呼叫,如果有這樣的符號鏈接然後 -t 隱含著。

我是如何找到這個以及如何解決任何未來的問題: Buildroot裡面 生成沒有sudo的ext2圖像 如圖所示,所以我只是運行構建 V=1 並從最後出現的圖像生成部分中提取命令。好老的複制粘貼從來沒有讓我失望。

TODO:描述如何解決以下問題:

一個圖像文件中的多個分區

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


1
2017-10-14 22:14