由 moto » 週三 7月 07, 2004 4:34 pm
本文來自:
http://os208.nchc.org.tw/~klhaung
- 代碼: 選擇全部
主旨: Samba 光碟櫃
日期: 2002/11/03
參考資料:
http://www.nber.org/amd.html
http://www.tldp.org/HOWTO/CDServer-HOWTO/introduction.html (CDServ-HOWTO)
內容:
1.已經有光碟, 想利用 Samba 將光碟的資料分享出來, 然而光碟有很多份, 但是 CDROM 只有一台,
可利用 cdread 將光碟的資料完整的 dump 出來成為 raw image data (.raw)
# readcd dev=<device_name> f=<FILENAME>.raw
Example: cdread dev=0,0,0 f=31.raw
由於 Samba 在讀資料的時後其實是用 UTF8 來解讀資料的, 也就是說, 在 mount 這個 raw image data 時
要用 -o iocharset=utf8 這個參數
# mount -t iso9660 -o ro,loop=/dev/loop0,iocharset=utf8 <FILENAME>.raw <DIRECTORY>
2.因為系統裝好後只有 0-7 八個 loop device, 若要新增多個 look device 則要下以下的指令
# mknod -m 660 /dev/loop[n] b 7 [n]
Example: mknod /dev/loop9 b 7 9
然而,由於系統預設只有8個loop device,故新增之後也沒有用(因為八個quota用滿了:>),
所以要在 lilo.conf 中加入一個選項 max_loop=N 讓 loop device 多於8個
# vi /etc/lilo.conf
==========================================
image=/vmlinuz
label=Linux
read-only
append="hdd=ide-scsi max_loop=64"
^^^^^^^^^^^最多64個loop device
==========================================
# lilo -v -v -v
# shutdown -r now
3.由於不會同時每個CD都會被使用, 所以最好是能夠在使用到該CD時才被 mount 起來,
你可以使用需 kernel support 的 automount 的功能,
或是使用在 user level 的 bsd automounter utilities, 這裡介紹的是後者
# apt-get install am-utils
=================================================
安裝過程中會詢問你是否有其他的目錄要讓am-utils管,
此時你可以寫上:
/jukebox /etc/am-utils/amd.jukebox
這個意思是: /jukebox 這個目錄也要被 am-utils 管,
相關設定檔在 /etc/am-utils/amd.jukebox
=================================================
# vi /etc/am-utils/amd.jukebox
=================================================
/defaults type:=program;fs:=${autodir}${path}
* mount:="/etc/am-utils/jukebox.sh jukebox.sh mount ${fs} ${key}";\
unmount:="/etc/am-utils/jukebox.sh jukebox.sh umount ${fs} ${key}"
=================================================
這個檔案的意思是:
/defaults -> global 的設定, 此時設定成
type:=program (當/jukebox有個目錄被選擇時, 要執行一個程式)
fs:=${autodir}${path} (fs這個變數的值為${autodir}${path},
${path}則是要進入的絕對路徑名稱,
${autodir}在/etc/defaults/am-utils中有被定義)
* 表示任何一個要點選進去的目錄名稱,
mount:=...;unmount:=...則是在要掛上/卸載該目錄時, 要執行的程式碼
詳細情形請參考 http://www.nber.org/amd.html 及 /usr/share/doc/am-utils 中的說明
# vi /etc/am-utils/jukebox.sh
==================================================
#!/bin/sh
#echo " $1 $2 $3 ">> /tmp/jukebox.log
t=$1 # mount or umount
fs=$2 # mount destination
key=$3 # keyword (that is, if a user would like to enter "XX" directory,
# this word is "XX")
rawcd_path="/share/.jukebox/"
case $t in
'mount')
echo "mount ${rawcd_path}${key}.raw to $fs" > /tmp/jukebox.log
mkdir -p ${fs} &> /tmp/jukebox.log
mount -t iso9660 -o ro,iocharset=utf8,loop ${rawcd_path}${key}.raw ${fs} &> /tmp/jukebox.log
;;
'umount')
echo "umount ${rawcd_path}$key.raw to $fs" > /tmp/jukebox.log
umount ${fs} &> /tmp/jukebox.log
rmdir ${fs} &> /tmp/jukebox.log
;;
*)
;;
esac
==================================================
4. 將光碟的內容直接呈現給使用者看, 也就是說, 使用者看到的是一個大CD而不是一個個小的CD,
以下的 perl script 可以將你的個別 CD 的內容 ln 到某個目錄底下
===================================================
#!/usr/bin/perl
my($root) = $ARGV[0];
DoDir($root);
sub DoDir {
my($dir) = shift;
my($file);
opendir(DIR, $dir) || die "Unable to open $dir :$!";
my(@files) = grep {!/^\.\.?$/ } readdir(DIR);
closedir(DIR);
foreach (@files) {
#print "$_\n";
symlink("$dir//$_","$_");
}
}
===================================================
5. 檢討:
其實要使用 kernel support 的 automount 來做才是,
因為 bsd automount utilities 只能算是一個 mount 的前端程式,
它的動作是: 當你要使用到該目錄時, 它會幫你下達 mount 的指令,
Samba在browser目錄時(ls), 就會造成所有 CD 都會被 mount 起來,
若此時你的 /dev/loopXX 不夠多的話, 有些 link 就會有錯誤
歡迎你來到MOTO學園一起討論Debian相關問題。
在post問題前可先別忘記了以下的步驟:
1:翻一下/usr/share/doc/中是否已經有解答了?
2:閱讀一下無痛起步是否已經提到了?
3:找一下google予以解答?
4:善用學園中的"搜尋"功能,往往答案就在裡面窩。