以非 root 用户身份创建带分区的磁盘映像

以非 root 用户身份创建带分区的磁盘映像

我正在尝试从我的构建系统(目前是 SCons)构建一个磁盘映像作为输出。从目录结构创建磁盘映像非常容易,例如使用 genext2fs (http://genext2fs.sourceforge.net/)。

但我想要做的是创建一个包含来自多个目录的多个分区的映像。我目前必须通过将 dd、losetup、kpartx、mount 和复制文件粘合在一起来完成此操作。这需要 root 访问权限。

有没有方便的方法以非 root 用户身份执行此操作? 有没有适合纳入构建系统并能有效执行此任务的应用程序?

答案1

我不想这么说,但我不知道简单的方法来做到这一点。

您很可能可以通过使用 dd 创建映像文件,然后使用 fdisk 对其进行分区,然后使用 dd 创建第二个映像文件并直接对其进行格式化(或使用类似 genext2fs 的工具),然后将第二个文件系统映像以正确的偏移量 dd 到第一个分区映像文件中,从而使某些操作正常工作。。。但是,这会很困难且复杂。

不过,恐怕我不知道有什么好方法可以在没有 root 访问权限的情况下实现此目的。

答案2

根据您想要避免 root 访问权限的原因,sudo 可能是一个解决方案。

编写一个脚本,完成该任务所需的所有工作,确保用户不会通过“创造性”输入滥用它,然后为相关用户提供该脚本的 sudo 权限,而不提供任何其他权限。

答案3

最近遇到了类似的问题,主要原因是操作loop设备文件需要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 "$@"

答案4

我还没有尝试过,但你试过 fakeroot 吗?它通常用于基于 Debian 的发行版,以引导安装所需的初始文件集(或者在 64 位系统的情况下,使用 32 位文件的 chroot)。你没有说你使用的是什么操作系统,fakeroot 可能不适合你。

我见过另一种解决这个问题的方法,即在构建系统中使用虚拟机。在虚拟机中,您可以成为 root 用户,而不会弄乱实际构建机器上的操作系统,您可以对其进行快照,这样每次启动时它都处于相同的干净状态。

相关内容