代码: 全选
#!/bin/sh
#作者:高星
#Email:gnix.oag@gmail.com
make_fstab() {
#找所的硬盘及分区
cat /proc/partitions | tr -s "[\ ]" | cut -d\ -f5 | tr "[\n]" "[ ]" > /dev_tmp
#开始生成fstab
msfscount=98 #ms文件系统计数值: 98对应B
for dev_name in $(cat /dev_tmp) ; do
fstype=$(get_fstype "${dev_name}")
case "$fstype" in
reiserfs|minix|xfs|jfs|ext3|ext2|swap|ntfs|vfat)
get_mountpoint
# mkdir -p ${getmountpoint}
get_mountoptions
echo "/dev/${dev_name} ${getmountpoint} ${fstype} ${getmountoptions} 0 0 " >> /fstab
;;
esac
done
#找所有的光驱
for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
hd_dev=$(echo "$(udevinfo -q name -p ${sysblock#/sys} 2>/dev/null || echo ${sysblock##*/})")
if /lib/udev/cdrom_id /dev/${hd_dev} > /dev/null; then
echo "/dev/${hd_dev} /media/${hd_dev} auto noauto,user 0 0 " >> /fstab
fi
done
#rm /dev_tmp
}
#生成挂载点
get_mountpoint(){
getmountpoint=
case "$fstype" in
ntfs*|vfat|msdos)
msfscount=$(expr $msfscount + 1)
getmountpoint=/media/`echo -e -n "\\x$(printf %x $msfscount)"`_win ;;
swap) getmountpoint="none" ;;
*) getmountpoint="/media/${dev_name}" ;;
esac
}
#生成挂载选项
get_mountoptions(){
getmountoptions=
case "$fstype" in
vfat) getmountoptions="noauto,exec,umask=000,shortname=winnt,utf8,user" ;;
msdos) getmountoptions="noauto,exec,umask=000,utf8,user" ;;
swap) getmountoptions="defaults" ;;
ntfs) getmountoptions="noauto,exec,umask=000,utf8,user";;
*) getmountoptions="noauto,exec,user";;
esac
}
#获取分区的类型
get_fstype() {
local FILE
FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "/dev/$1")"
if [ "$FILE" = "data" ]; then
# could still be ReiserFS, since "file" only reads 64k in Debian
FILE="$(dd if="/dev/$1" skip=16397 ibs=4 count=2 2>/dev/null)"
fi
case "$FILE" in
*[Rr][Ee][Ii][Ss][Ee][Rr]*) echo "reiserfs";;
*ISO\ 9660*) echo "iso9660";;
*[Mm][Ii][Nn][Ii][Xx]*) echo "minix";;
*[Xx][Ff][Ss]*) echo "xfs";;
*[Jj][Ff][Ss]*) echo "jfs";;
*[Ee][Xx][Tt]3*) echo "ext3";;
*[Ee][Xx][Tt]2*) echo "ext2";;
*[Ss][Ww][Aa][Pp]*) echo "swap";;
*[Nn][Tt][Ff][Ss]*) echo "ntfs";;
*[Ff][Aa][Tt]*) echo "vfat";;
# *) echo "auto";;
esac
}
#在initrd.gz里可用fstype程序替代dd相程序
#get_fstype() {
# local FSTYPE
# local FSSIZE
# eval $(fstype < $1)
# if [ "$FSTYPE" != "unknown" ]; then
# echo $FSTYPE
# return 0
# fi
# /lib/udev/vol_id -t $1 2>/dev/null
#}
make_fstab