在 GNU/Linux 有個 loop device(/dev/loop*),可以給燒錄用的 iso 檔使用,就是把 iso 檔使用 -o loop 參數直接 mount 上來,查看裡頭的內容細節,這本是非常平常的事。可是,到了 FreeBSD,發現並沒有 loop device 可以用,這下要怎麼把 iso 檔 mount 上來呢?
首先想到的是 FreeBSD Handbook,找了一下,藏在第 17 章,而且敘述也很簡短,不過,總算是能用了。原來 FreeBSD 有一個虛擬的 memory disk device(/dev/md*),他有多種用途,其中的 vnode 型態就可以給 iso 檔來用。
但手續上就比較麻煩一點,例如,我們想把 xxx.iso 給 mount 上來的話,首先要去製作一個 vnode type 的 memory disk,並把 iso 檔內容映射至這個 md device,然後再來 mount 這個 md device:
mdconfig -a -t vnode -f xxx.iso -u 0這樣就行了,要把他 umount 也是要兩個動作:
mount -t cd9660 /dev/md0 /mnt/iso
umount /mnt/iso是否有此 md device 可以使用 mdconfig -l 來得知。
mdconfig -d -u 0
好像有點給他麻煩,我試著寫了兩個很醜的 sh script 來做這些動作,如果有人有更好的寫法,請不吝借我一用:
#!/usr/bin/env sh不過,你要讓這個 user 有 md device 讀寫權限,否則就要使用 root 的身份來 mount。umoun 是寫在另外一個 sh script:
# vim:ts=2 sw=2 et
# isom.sh : mount iso on FreeBSD box using md device.
# Edward G.J. Lee (08/02/06)
if [ $# -eq 0 ]
then
echo
echo "Usage: `basename $0` youriso"
echo
exit 1
fi
file $1 | grep 'ISO 9660' > /dev/null 2>&1
IFIOS=$?
if [ $IFIOS -eq 0 ]
then
if [ ! -d $HOME/mnt/iso1 ]
then
mkdir -p $HOME/mnt/iso1
fi
mdconfig -a -t vnode -f $1 -u 0
mount -t cd9660 /dev/md0 $HOME/mnt/iso1
if [ $? -eq 1 ]
then
mdconfig -d -u 0
echo
echo "mount failed."
echo
exit 1
else
echo
echo "mount under $HOME/mnt/iso1"
echo
exit 0
fi
else
echo
echo 'This is not an iso file, abort!'
echo
exit 1
fi
#!/usr/bin/env sh當然,由於我的環境很單純,只有我一個人在用,所以就固定在 /dev/md0 了。雖然麻煩了點,不過 FreeBSD 的做法還真的感覺有點 hacker 風格呀!:-)
# vim:ts=2 sw=2 et
# isoum.sh : umount iso from FreeBSD md device
# Edward G.J. Lee (08/02/06)
umount $HOME/mnt/iso1
mdconfig -d -u 0
沒有留言:
張貼留言