슈퍼유저 권한 없이 ext2 이미지를 만드는 방법은 무엇입니까?

슈퍼유저 권한 없이 ext2 이미지를 만드는 방법은 무엇입니까?

여러 개의 ext2 이미지를 생성해야 합니다. 이를 수행하는 확실한 방법은 이미지를 생성하고 이를 마운트한 후 콘텐츠를 복사하는 것입니다. 그러나 파일을 chown하고 이미지를 마운트하려면 루트 권한이 두 번 필요합니다. 또한 이미지 생성을 위한 두 가지 도구인 e2fsimage와 geneext2fs를 찾았습니다.

  • geneext2fs는 생성하는 동안 이미지를 RAM에 배치하지만 내 이미지 중 하나의 크기는 ~30GiB입니다.

  • e2fsimage가 일부 이미지 크기 값과 충돌합니다.

그렇다면 이미지를 어떻게 생성할 수 있나요? 도구가 이미지 크기 자체를 계산하면 좋을 것입니다.

답변1

mke2fs -d없이 실행 가능한 최소 예제sudo

mke2fse2fsprogs 패키지의 일부입니다. 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이미지에 사용할 디렉토리를 선택하는 이며 커밋에서 v1.43에 비교적 새로운 추가 항목입니다.0d4deba22e2aa95ad958b44972dc933fd0ebbc59

따라서 e2fsprogs 1.44.1-1이 있는 Ubuntu 18.04에서는 즉시 작동하지만 1.42.13인 Ubuntu 16.04에서는 작동하지 않습니다.

그러나 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

tmpfs예를 들어 루트 디렉터리가 NFS에 있거나 해당 파일 시스템으로 extX 대신에 있는 경우에 필요합니다.확장된 속성이 없는 것 같습니다..

mke2fs는 종종 에 심볼릭 링크되어 mkfs.extX있으며 man mke2fs이러한 심볼릭 링크와 함께 call if를 사용하면 -t암시된다는 것을 나타냅니다.

이 사실을 알게 된 방법과 향후 문제를 해결하는 방법은 다음과 같습니다.루트 빌드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 오버플로로 인해 발생합니다. 따라서 해결책은 필요한 블록 및 inode 수를 계산하고 루프 파일( truncate& mke2fs)을 만든 다음 인수 e2fsimage와 함께 사용하는 것입니다 -n(따라서 루프 파일을 생성하지 않고 이미 생성된 파일을 사용합니다).

답변3

이미지 생성에는 루트 권한이 필요하지 않습니다. 다음은 ext2 이미지를 생성하는 예입니다.

dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2

하지만 장치를 마운트하려면 루트 권한이 필요합니다.

mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk

관련 정보