
Estou tentando construir uma imagem de disco como saída do meu sistema de compilação (atualmente SCons). Criar imagens de disco a partir de uma estrutura de diretórios é muito fácil, por exemplo, com genext2fs (http://genext2fs.sourceforge.net/).
Mas o que eu gostaria de fazer é criar uma imagem que contenha várias partições de vários diretórios. Atualmente estou tendo que fazer isso colando dd, Lostup, kpartx, mount e copiando arquivos. Isso requer acesso root.
Existe alguma maneira conveniente de fazer isso como usuário não root? Algum aplicativo disponível, adequado para inclusão em um sistema de compilação que possa executar essa tarefa com eficiência?
Responder1
Detesto dizer isso, mas não conheço nenhumfácilmaneira de fazer isso.
É bem provável que você possa fazer algo funcionar criando um arquivo de imagem com dd, particionando-o com fdisk, criando um segundo arquivo de imagem com dd e formatando-o diretamente (ou usando algo como genext2fs) e depois dd'ing o segundo sistema de arquivos imagem no primeiro arquivo de imagem particionado no deslocamento correto. . . no entanto, isso será difícil e complicado.
Infelizmente, não conheço nenhuma boa maneira de fazer isso sem acesso root.
Responder2
Dependendo do motivo pelo qual você deseja evitar o acesso root, o sudo pode ser uma solução.
Escreva um script que faça tudo o que você precisa fazer para a tarefa, garantindo que os usuários não possam usá-lo indevidamente com entradas "criativas" e, em seguida, conceda ao usuário em questão direitos sudo exatamente para esse script e nada mais.
Responder3
encontrou um problema semelhante recentemente, o principal motivo é que os arquivos de dispositivos de loop operacional requerem privilégios de root. tive a mesma ideia queResposta de MikeyB
e aqui estámeu código:
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 "$@"
Responder4
Eu não tentei isso, mas você já tentou o fakeroot? É comumente usado em distribuições baseadas em Debian para inicializar o conjunto inicial de arquivos necessários para uma instalação (ou no caso de um sistema de 64 bits, um chroot com arquivos de 32 bits). Você não disse qual sistema operacional está usando, o fakeroot pode não funcionar para você.
Já vi esse problema ser resolvido de outra forma, use uma máquina virtual no sistema de compilação. Na VM, você pode ser root sem bagunçar o sistema operacional em sua máquina de compilação real, você pode tirar um instantâneo dela para que sempre que ela for ligada, ela esteja no mesmo estado limpo.