루트가 아닌 사용자로 파일 시스템 생성

루트가 아닌 사용자로 파일 시스템 생성

루트가 아닌 사용자로 파일 시스템 이미지를 생성하고 싶습니다. 현재 직면한 문제는 루트가 아닌 사용자가 설치할 수 없는 설치가 필요하다는 것입니다.

이것이 내가 지금 하고 있는 일입니다:

#!/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

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

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

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

꼭 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

또한보십시오:https://libguestfs.org/virt-make-fs.1.html

관련 정보