
我正在嘗試建立一個磁碟映像作為我的建置系統(目前為 SCons)的輸出。從目錄結構建立磁碟映像非常容易,例如使用 genext2fs (http://genext2fs.sourceforge.net/)。
但我想做的是建立一個包含多個目錄中的多個分割區的映像。我目前必須通過將 dd、losetup、kpartx、mount 和複製文件粘合在一起來完成此操作。這需要 root 存取權限。
作為非 root 用戶,有什麼方便的方法可以做到這一點嗎?是否有任何應用程式適合包含到可以有效執行此任務的建置系統中?
答案1
我不想這麼說,但我不知道簡單的方法來做到這一點。
您很可能可以透過使用dd 來建立映像文件,然後使用fdisk 對其進行分割區,然後使用dd 建立第二個映像文件,並直接對其進行格式化(或使用諸如genext2fs 之類的東西),然後dd 'ing 第二個檔案系統來完成某些工作影像到第一個分割影像檔案的正確偏移處。 。 。然而,這將是困難和複雜的。
不過,恐怕我不知道有什麼好方法可以在沒有 root 存取權限的情況下完成此任務。
答案2
根據您想要避免 root 訪問的原因,sudo 可能是一個解決方案。
編寫一個腳本來完成該任務所需的所有操作,確保使用者不會透過「創造性」輸入來濫用它,然後為有問題的使用者授予對該腳本的 sudo 權限,而不是其他任何權限。
答案3
最近遇到類似的問題,主要原因是操作循環設備檔案需要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 用戶,而不會弄亂實際建置機器上的作業系統,您可以對其進行快照,以便每次啟動時都處於相同的乾淨狀態。