여러 개의 ext2 이미지를 생성해야 합니다. 이를 수행하는 확실한 방법은 이미지를 생성하고 이를 마운트한 후 콘텐츠를 복사하는 것입니다. 그러나 파일을 chown하고 이미지를 마운트하려면 루트 권한이 두 번 필요합니다. 또한 이미지 생성을 위한 두 가지 도구인 e2fsimage와 geneext2fs를 찾았습니다.
geneext2fs는 생성하는 동안 이미지를 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
이미지에 사용할 디렉토리를 선택하는 이며 커밋에서 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: 다음 문제를 해결하는 방법을 설명합니다.
- 이미지에 sudo 소유 파일을 만듭니다. Buildroot가 수행합니다.
- 필요한 최소 크기를 자동으로 계산합니다.
du
파일 크기 및 디렉터리 구조에 대한 초기 추정치는find . | wc
최소 32Mb(더 작은 실패)이고 명령이 작동할 때까지 두 배가 되는 것이 매우 괜찮은 접근 방식일 가능성이 높습니다. Buildroot는 이 작업을 수행했지만 어떤 이유로 중지되었지만 직접 구현하기 쉽습니다. - 파티션에서 모든 파일을 편리하게 추출합니다.
하나의 이미지 파일에 여러 파티션
답변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