
Ich versuche, ein Disk-Image als Ausgabe meines Build-Systems (derzeit SCons) zu erstellen. Das Erstellen von Disk-Images aus einer Verzeichnisstruktur ist sehr einfach, beispielsweise mit genext2fs (http://genext2fs.sourceforge.net/).
Ich möchte jedoch ein Image erstellen, das mehrere Partitionen aus mehreren Verzeichnissen enthält. Derzeit muss ich dies tun, indem ich dd, losetup, kpartx, mount zusammenfüge und Dateien kopiere. Dies erfordert Root-Zugriff.
Gibt es eine bequeme Möglichkeit, dies als Nicht-Root-Benutzer zu tun? Gibt es eine Anwendung, die sich für die Einbindung in ein Build-System eignet und diese Aufgabe effizient ausführen kann?
Antwort1
Ich sage es ungern, aber ich kenne keineneinfachWeg, dies zu tun.
Es ist durchaus möglich, dass Sie etwas zum Laufen bringen, indem Sie eine Image-Datei mit dd erstellen, sie dann mit fdisk partitionieren, dann eine zweite Image-Datei mit dd erstellen und sie direkt formatieren (oder etwas wie genext2fs verwenden) und dann das zweite Dateisystem-Image mit dd am richtigen Offset in die erste partitionierte Image-Datei einfügen ... das wird jedoch schwierig und kompliziert.
Ich fürchte, ich kenne keine gute Möglichkeit, dies ohne Root-Zugriff zu erreichen.
Antwort2
Je nachdem, warum Sie den Root-Zugriff vermeiden möchten, kann sudo eine Lösung sein.
Schreiben Sie ein Skript, das alle für die Aufgabe erforderlichen Schritte ausführt, und stellen Sie sicher, dass Benutzer es nicht für „kreative“ Eingaben missbrauchen können. Geben Sie dem betreffenden Benutzer dann Sudo-Rechte für genau dieses Skript und für nichts anderes.
Antwort3
bin vor kurzem auf ein ähnliches Problem gestoßen, der Hauptgrund ist, dass der Betrieb von Loop-Gerätedateien Root-Rechte erfordert. habe die gleiche Idee wieMikeyBs Antwort
und hier istmein Code:
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 "$@"
Antwort4
Ich habe das nicht ausprobiert, aber haben Sie Fakeroot ausprobiert? Es wird häufig bei Debian-basierten Distributionen verwendet, um den anfänglichen Satz von Dateien zu booten, der für eine Installation erforderlich ist (oder im Fall eines 64-Bit-Systems ein Chroot mit 32-Bit-Dateien). Sie haben nicht gesagt, welches Betriebssystem Sie verwenden, Fakeroot funktioniert bei Ihnen möglicherweise nicht.
Ich habe gesehen, dass dieses Problem auf eine andere Weise gelöst werden kann: Verwenden Sie eine virtuelle Maschine im Build-System. In der VM können Sie Root sein, ohne das Betriebssystem auf Ihrer tatsächlichen Build-Maschine zu beschädigen. Sie können einen Snapshot davon erstellen, sodass es bei jedem Einschalten im gleichen sauberen Zustand ist.