非ルートユーザーとしてパーティションを含むディスクイメージを作成する

非ルートユーザーとしてパーティションを含むディスクイメージを作成する

ビルド システム (現在は SCons) からの出力としてディスク イメージをビルドしようとしています。ディレクトリ構造からディスク イメージを作成するのは、たとえば genext2fs (http://genext2fs.sourceforge.net/) を使用すると非常に簡単です。

しかし、私がやりたいのは、複数のディレクトリから複数のパーティションを含むイメージを作成することです。現在、dd、losetup、kpartx、mount を結合してファイルをコピーすることでこれを実現しています。これにはルート アクセスが必要です。

非ルート ユーザーとしてこれを行う便利な方法はありますか? このタスクを効率的に実行できる、ビルド システムに組み込むのに適したアプリケーションはありますか?

答え1

言いたくないけど、私は簡単これを行う方法。

dd でイメージ ファイルを作成し、それを fdisk でパーティション分割し、次に dd で 2 番目のイメージ ファイルを作成し、それを直接フォーマットし (または genext2fs などを使用して)、2 番目のファイル システム イメージを正しいオフセットで最初のパーティション分割されたイメージ ファイルに dd することで、何かが機能する可能性は十分にあります。ただし、これは困難で複雑になります。

ただし、ルート アクセスなしでこれを実現する良い方法は知りません。

答え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 を台無しにすることなくルートになることができ、スナップショットを作成できるため、電源を入れるたびに同じクリーンな状態になります。

関連情報