2007年8月6日 星期一

FreeBSD 如何 mount iso image? 2006/1

FreeBSDmount 一個燒錄用的 iso 檔,並不像 GNU/Linux 般的容易。無法直接使用 mount 指令給 mount 上來,這究竟是怎麼一回事?


在 GNU/Linux 有個 loop device(/dev/loop*),可以給燒錄用的 iso 檔使用,就是把 iso 檔使用 -o loop 參數直接 mount 上來,查看裡頭的內容細節,這本是非常平常的事。可是,到了 FreeBSD,發現並沒有 loop device 可以用,這下要怎麼把 isomount 上來呢?

首先想到的是 FreeBSD Handbook,找了一下,藏在第 17 章,而且敘述也很簡短,不過,總算是能用了。原來 FreeBSD 有一個虛擬的 memory disk device(/dev/md*),他有多種用途,其中的 vnode 型態就可以給 iso 檔來用。

但手續上就比較麻煩一點,例如,我們想把 xxx.isomount 上來的話,首先要去製作一個 vnode type 的 memory disk,並把 iso 檔內容映射至這個 md device,然後再來 mount 這個 md device:

mdconfig -a -t vnode -f xxx.iso -u 0
mount -t cd9660 /dev/md0 /mnt/iso
這樣就行了,要把他 umount 也是要兩個動作:
umount /mnt/iso
mdconfig -d -u 0
是否有此 md device 可以使用 mdconfig -l 來得知。

好像有點給他麻煩,我試著寫了兩個很醜的 sh script 來做這些動作,如果有人有更好的寫法,請不吝借我一用:

#!/usr/bin/env sh
# 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
不過,你要讓這個 user 有 md device 讀寫權限,否則就要使用 root 的身份來 mount。umoun 是寫在另外一個 sh script:
#!/usr/bin/env sh                                                             
# 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
當然,由於我的環境很單純,只有我一個人在用,所以就固定在 /dev/md0 了。雖然麻煩了點,不過 FreeBSD 的做法還真的感覺有點 hacker 風格呀!:-)

沒有留言: