Создание образов дисков с разделами от имени пользователя без полномочий root
Я пытаюсь создать образ диска как вывод из моей системы сборки (в настоящее время SCons). Создать образы дисков из структуры каталогов очень просто, например, с помощью genext2fs (http://genext2fs.sourceforge.net/).
Но я хотел бы создать изображение, содержащее несколько разделов из нескольких каталогов. В настоящее время я должен сделать это путем склеивания dd, losttup, kpartx, монтирования и копирования файлов поверх. Это требует root-доступа.
Есть ли удобный способ сделать это как пользователь без полномочий root? Любое приложение, подходящее для включения в систему сборки, которое может эффективно выполнить эту задачу?
7 ответов
Ненавижу это говорить, но я не знаю простого способа сделать это.
Вполне вероятно, что вы могли бы заставить что-то работать, создав файл образа с помощью dd, затем разделив его с помощью fdisk, затем создав второй файл изображения с помощью dd и отформатировав его напрямую (или используя что-то вроде genext2fs), а затем добавив dd'ing во вторую файловую систему. изображение в первый файл разделенного изображения с правильным смещением.,, однако это будет сложно и сложно.
Боюсь, я не знаю ни одного хорошего способа сделать это без root-доступа.
В зависимости от того, почему вы хотите избежать корневого доступа, sudo может быть решением.
Напишите сценарий, который выполняет все, что вам нужно для выполнения задачи, чтобы пользователи не могли злоупотреблять им с помощью "творческого" ввода, а затем предоставьте обсуждаемому пользователю права sudo именно для этого сценария и ничего больше.
Недавно столкнулся с подобной проблемой, основная причина в том, что для работы с файлами устройств цикла требуются права root. получил ту же идею, что и ответ 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 "$@"
Я не пробовал это, но вы пробовали fakeroot? Он обычно используется в дистрибутивах на основе Debian для начальной загрузки начального набора файлов, необходимых для установки (или в случае 64-битной системы, chroot с 32-битными файлами). Вы не сказали, какую ОС используете, fakeroot может не сработать.
Я видел, как эта проблема решена другим способом - использовать виртуальную машину в системе сборки. В виртуальной машине вы можете быть суперпользователем, не портя ОС на вашем компьютере, вы можете сделать снимок, чтобы он включался каждый раз в том же чистом состоянии.
- /questions/282257/preobrazovat-katalog-v-obraz-virtualnogo-diska-qemukvm/282266#282266;
- если ISO9660, как правило, вам подходит, см. также изогибридный скрипт в дистрибутиве syslinux.
Вы можете попробовать с mkisofs...
папка mkisofs -l -iso-level 4 -o file.iso
Различные разделы, которые вы создаете, известных размеров?
Вы можете обойти эту проблему, создав шаблон "образ диска" с разделами с известным смещением байтов, а затем разделить реальные файловые системы на этот образ, используя dd
,