
내 빌드 시스템(현재 SCons)의 출력으로 디스크 이미지를 빌드하려고 합니다. 예를 들어 geneext2fs(http://genext2fs.sourceforge.net/)를 사용하면 디렉토리 구조에서 디스크 이미지를 생성하는 것이 매우 쉽습니다.
하지만 제가 하고 싶은 일은 여러 디렉터리의 여러 파티션을 포함하는 이미지를 만드는 것입니다. 현재 dd, losstup, kpartx를 함께 붙이고 마운트하고 파일을 복사하여 이 작업을 수행해야 합니다. 이를 위해서는 루트 액세스가 필요합니다.
루트가 아닌 사용자로서 이 작업을 수행할 수 있는 편리한 방법이 있습니까? 이 작업을 효율적으로 수행할 수 있는 빌드 시스템에 포함하기에 적합한 애플리케이션이 있습니까?
답변1
말하기 싫지만 그런 건 모르겠어쉬운이 작업을 수행하는 방법입니다.
dd를 사용하여 이미지 파일을 생성한 다음 fdisk로 파티션을 나눈 다음 dd를 사용하여 두 번째 이미지 파일을 생성하고 직접 포맷(또는 geneext2fs와 같은 것을 사용)한 다음 두 번째 파일 시스템을 dd'ing하여 작업을 수행할 수 있을 가능성이 매우 높습니다. 이미지를 올바른 오프셋으로 첫 번째 분할된 이미지 파일에 넣습니다. . . 그러나 그것은 어렵고 복잡할 것입니다.
하지만 루트 액세스 없이 이 작업을 수행할 수 있는 좋은 방법을 모르겠습니다.
답변2
루트 액세스를 피하려는 이유에 따라 sudo가 해결책이 될 수 있습니다.
작업에 필요한 모든 작업을 수행하는 스크립트를 작성하여 사용자가 "창의적인" 입력으로 이를 오용할 수 없도록 확인한 다음 문제의 사용자에게 해당 스크립트에 대한 sudo 권한만 부여하고 다른 권한은 부여하지 않습니다.
답변3
최근 비슷한 문제가 발생했는데, 주된 이유는 루프 장치 파일을 운영하려면 루트 권한이 필요하기 때문입니다. 같은 생각을 가지고MikeyB의 답변
그리고 여기내 코드:
create_vdiskn() {
local path=$1
local dsize=$2
local fstype=$3
local imghead=img-head-$$
local imgtail=img-tail-$$
local fn=${FUNCNAME[0]}
echo -e "\n[$fn:info] creating disk and partition"
dd if=/dev/null of=$path bs=1${dsize//[0-9]/} seek=${dsize//[^0-9]/}
printf "o\nn\np\n1\n\n\nw\n" | fdisk "$path"
partprobe "$path"
read pstart psize < <( LANG=C parted -s $path unit B print | sed 's/B//g' |
awk -v P=1 '/^Number/{start=1;next}; start {if ($1==P) {print $2, $4}}' )
echo -e "\n[$fn:info] split disk head and partition($pstart:$psize)"
dd if=$path of=$imghead bs=${pstart} count=1
truncate --size=${psize} $imgtail
echo -e "\n[$fn:info] making fs($fstype)"
mkfs.$fstype $MKFS_OPT "$imgtail"
echo -e "\n[$fn:info] concat image-head and partition"
cat $imghead $imgtail >$path
rm -vf $imghead $imgtail
}
[[ $# -lt 3 ]] && {
cat <<-COMM
Usage: [MKFS_OPT=xxx] $0 <image> <size> <fstype>
Examples:
$0 usb.img 256M vfat
$0 ext4.img 4G ext4
MKFS_OPT="-f -i attr=2,size=512" $0 xfs.img 4G xfs
COMM
exit 1
}
create_vdiskn "$@"
답변4
나는 이것을 시도하지 않았지만 fakeroot를 시도 했습니까? 일반적으로 Debian 기반 배포판에서 설치에 필요한 초기 파일 세트(또는 64비트 시스템의 경우 32비트 파일이 있는 chroot)를 부트스트랩하는 데 사용됩니다. 어떤 OS를 사용하고 있는지 밝히지 않았으므로 fakeroot가 작동하지 않을 수도 있습니다.
이 문제가 다른 방법으로 해결되는 것을 본 적이 있습니다. 빌드 시스템에서 가상 머신을 사용하는 것입니다. VM에서는 실제 빌드 시스템의 OS를 망칠 필요 없이 루트가 될 수 있으며, 전원을 켤 때마다 동일한 깨끗한 상태로 유지되도록 스냅샷을 만들 수 있습니다.