루트가 아닌 사용자로 파일 시스템 이미지를 생성하고 싶습니다. 현재 직면한 문제는 루트가 아닌 사용자가 설치할 수 없는 설치가 필요하다는 것입니다.
이것이 내가 지금 하고 있는 일입니다:
#!/bin/sh
IMG="app.ext4"
LBL="PIHU_APP"
MNT="/mnt/PIHU_APP"
APP="/home/buildroot/board/arctura/PIHU_APP/application"
#64MB:
dd if=/dev/zero of=$IMG bs=4096 count=16384
mkfs.ext4 $IMG
e2label $IMG $LBL
mkdir -p $MNT
mount -o loop $IMG $MNT
cp -r $APP $MNT
sync
umount $MNT
나는 모든 것을 설정/준비할 수 있도록 전체 루트 액세스 권한을 가지고 있지만 스크립트는 루트가 아닌 계정에서 실행됩니다.
그러나 설치가 필요하지 않은 더 좋은 방법이 있을 수도 있다는 느낌이 들지만 확실하지 않습니다.
답변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
예를 들어 루트 디렉터리가 NFS에 있거나 이러한 파일 시스템으로 extX 대신에 있는 경우에 tmpfs
필요합니다 .확장된 속성이 없는 것 같습니다..
mke2fs
일반적으로 에 심볼릭 링크되어 mkfs.extX
있으며 man mke2fs
이러한 심볼릭 링크와 함께 call if를 사용하는 경우 의미는 -t
암시적으로 사용됩니다 .
이것을 발견한 방법과 향후 문제를 해결하는 방법은 다음과 같습니다.루트 구축sudo 없이 ext2 이미지 빌드그림에서 알 수 있듯이, 그래서 방금 빌드를 실행 V=1
하고 최종 이미지 빌드 섹션에서 명령을 추출했습니다. 오래된 복사-붙여넣기는 결코 나를 실망시키지 않았습니다.
TODO: 다음 문제를 해결하는 방법을 설명하세요.
- 이미지에 sudo 소유 파일을 만듭니다. Buildroot가 할 수 있습니다.
- 필요한 최소 크기를 자동으로 계산합니다. 처음에는
du
파일 크기와 디렉터리 구조를 최소 32Mb(더 작은 크기는 실패)로 추정한 다음 명령이 작동할 때까지 이를 두 배로 늘리는 것이find . | wc
꽤 좋은 생각일 것입니다 . Buildroot는 이 작업을 수행했지만 어떤 이유로 중단되었지만 직접 구현하는 것은 충분히 쉬웠습니다. - 파티션에서 모든 파일을 편리하게 추출합니다.
하나의 이미지 파일에 여러 파티션이 있음
답변2
꼭 ext4여야 하나요?
다른 옵션이 있다면 행운을 시험해 보세요.
- mksquashfs, 사용자 공간에서 읽기 전용 압축 파일 시스템을 생성합니다.
- mkisofs는 광학 미디어에 일반적으로 사용되는 읽기 전용 파일 시스템을 생성합니다.
- cpio, tar, ...먼저 압축을 풀어야 하는 파일
그렇지 않으면 사용자 공간을 현실로 만들려면 ext4
다음을 수행해야 합니다.
- 미친듯이
debugfs
- 사용자 공간 가상 머신에서 커널 실행
- ext4 이미지를 처리하는 방법을 아는 또 다른 순수 사용자 공간 유틸리티 찾기
에 관해서는 debugfs
대부분의 파일 시스템에는 그러한 유틸리티조차 없습니다. 운이 좋을 것입니다.
사용자 세션:
$ truncate -s 64M app.ext4
$ /sbin/mkfs.ext4 app.ext4
Creating filesystem with 65536 1k blocks and 16384 inodes
$ /sbin/debugfs -w app.ext4
debugfs: mkdir this_is_crazy
debugfs: cd this_is_crazy
debugfs: write /proc/config.gz config.gz
Allocated inode: 13
루트 세션: (작동하는지 확인하기 위해)
# mount -o loop app.ext4 loop/
# cd loop/
# ls
lost+found this_is_crazy
# md5sum this_is_crazy/config.gz /proc/config.gz
7b414ad844272a9e3c31931037fe0495 this_is_crazy/config.gz
7b414ad844272a9e3c31931037fe0495 /proc/config.gz
따라서 가능하며 작동합니다.
그러나 가장 실용적인 옵션은 어떤 방식으로든 루트를 사용하는 것입니다.
답변3
sudo
이러한 문제에 대해서는 /etc/sudoers 파일에서 mount 명령을 실행할 수 있는 사용자 권한을 부여해야 합니다.
그런 다음 스크립트에서 mount 명령 앞에 sudo를 추가할 수 있습니다.
sudo mount -o loop $IMG $MNT
비밀번호가 필요하지 않도록 규칙을 구성할 수 있습니다.
답변4
virt-make-fs명령은 모든 요구 사항을 충족할 수 있습니다
sudo yum install -y /usr/bin/virt-make-fs
virt-make-fs -s 64M -t ext4 $APP $IMG --label=$LBL