autofs能自动mount你的各种文件系统,包括cdrom、samba、nfs等,它在你以任意方式访问该文件系统时自动mount,然后当一段时间没有使用的时候自动umount,所以对那种可能变化的文件系统如cdrom、usb和samba特别有用。
autofs的主配置文件是auto.master,格式类似:
/var/autofs/misc /etc/autofs/auto.misc /var/smb /etc/autofs/auto.smb前面是mount point,后面是其对应的map文件,map文件可以是一个文本文件,格式为
key [-options] location
removable -fstype=vfat :/dev/hdd cd -fstype=iso9660,ro :/dev/hdckey可被认为是mount point下的子目录,location指定的要被mount的文件系统将在/<mount point>/<key>下可访问,options是mount使用的option。location可以指定多项,如:
/share1://host/share1 /share2://host/share2
当以任意方式访问形如/var/smb/<key>[/<path>]的路径时,autofs从map文件找到对应<key>的那一项,按照指定的参数用automount进行mount,然后就可以访问该文件系统了。
map文件还可以是一个可执行文件,这时autofs将把<key>作为第一个参数执行该文件,期望得到形如[-options] location的输出,然后用输出的内容mount。
一般autofs package会带一个auto.smb文件,是一个可执行的map文件,只要在auto.master里使之对应到一个mount point即可;不过该目前map文件还不是很完善:
可以修改为:
key="$1" credfile="/etc/auto.smb.$key" mountopts="-fstype=smbfs,file_mode=0644,dir_mode=0755,uid=user,gid=users,credentials=$credfile" for P in /bin /sbin /usr/bin /usr/sbin do if [ -x $P/smbclient ] then SMBCLIENT=$P/smbclient break fi done [ -x $SMBCLIENT ] || exit 1 $SMBCLIENT -gNL $key 2>/dev/null| awk -v key="$key" -v opts="$mountopts" -F'|' -- ' BEGIN { ORS=""; first=1 } /Disk/ { if (first) { print opts; first=0 }; print " ///n/t /" $2, "://" key "/" $2 } END { if (!first) print "/n"; else exit 1 } 'auto.smb的主要原理就是用smbclient -L列出机器名(通过key传入)上的service,然后用awk分析,输出location信息供mount。这里只是修改了mount option使普通用户也可以访问,并且可以通过/etc/auto.smb.<host>为要访问的host指定username/password。 这样,要用samba访问一台机器foo,只要在/etc目录下新建一个文件auto.smb.foo,写入:
username=guest password=guest不过要记住用chmod 600 auto.smb.foo修改file mode使之只能被root读写。
auto.smb利用smbclient输出到标准输出的内容来得到目标机器上的共享名,因此依赖smbclient的输出格式,如果是下面的格式,上面的script就无能为力了:
Disk|E$|默认共享 IPC|IPC$|远程 IPC Disk|D$|默认共享我把上面script的最后一句修改为:
$SMBCLIENT -gNL $key 2>/dev/null / | awk -v key="$key" -v opts="$mountopts" -v RS="|" -- ' BEGIN { ORS=""; first=1 } /Disk/ { P=1 } { if (0==P--) { if (first) { print opts; first=0 }; gsub(/ /, "// ", $0); sub(//$/, "//___FCKpd___5quot;, $0); print " ///n/t /" $0, "://" key "/" $0 } } END { if (!first) print "/n"; else exit 1 } '值得注意的是,系统必须支持-fstype指定的文件系统,对smbfs/cifs,可能需要另行安装。