找回密码
 注册
查看: 1359|回复: 14

自动加载win分区的脚本

[复制链接]
发表于 2003-6-7 03:46:14 | 显示全部楼层 |阅读模式
在中软4.0上搜刮到的,不知道是否是中软的技术员写的,作用是在每次系统启动时自动将机器上的win分区内容搜索出来,并自动mount到/mnt/WIN_C这样的目录下,不用手工修改/etc/fstab.

我将原内容贴出来,由于fdisk版本的差异,应该修改一下就可以在其他系统上用了.

第一个脚本是WinAutoMnt,放在/etc/rc.d/init.d目录下,作为系统服务的一个,内容如下:
[code:1]
#!/bin/sh
#
# WinAutoMnt        mount the windows partitions automatically
#
# chkconfig:        345 17 05
# description:        mount the windows partitions automatically

# source function library
. /etc/rc.d/init.d/functions

WINAUTOMNTCMD=/sbin/WinAutoMnt.sh
UNMOUNTCMD=/bin/umount
if [ ! -x $UNMOUNTCMD -a -x /sbin/umount ]; then
        UNMOUNTCMD=/sbin/umount
fi

if [ -x $WINAUTOMNTCMD ]; then
        case "$1" in
                  start)
                        # mount the windows partitions automatically
                        rmdir /mnt/win_*
                        rm -f /root/win_*
                        /bin/sh $WINAUTOMNTCMD >/dev/null 2>&1
                        ;;
                stop)
                        if [ -x $UNMOUNTCMD ]; then
                                $UNMOUNTCMD /mnt/win_* >/dev/null 2>&1       
                        else
                                umount /mnt/win_* >/dev/null 2>&1
                        fi
                        # delete all the win mount points
                        rmdir /mnt/win_*
                        rm -f /root/win_*
                        ;;
                restart|reload)
                        /bin/sh $0 stop
                        /bin/sh $0 start
                        ;;
                  *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
        esac
fi
[/code:1]

在/etc/rc.d/init.d加入这个脚本后,执行一下chkconfig -add WinAutoMnt即可在ntsysv里可见到这个服务

第二个脚本是WinAutoMnt.sh,放在/sbin目录下,内容如下:
[code:1]
#!/bin/sh

# mount path : mount in /bin/mount, /usr/bin/mount
if [ -x /bin/mount ]
then
        MOUNT=/bin/mount
elif [ -x /usr/bin/mount ]
then
        MOUNT=/usr/bin/mount
fi
if [ ! -x $MOUNT ]
then
        echo "mount command cann't be found, exit here!"
        exit 1
fi

# mount parameters
# fdisk path
if [ -x /sbin/fdisk ]
then
        FDISK=/sbin/fdisk
elif [ -x /usr/sbin/fdisk ]
then
        FDISK=/usr/sbin/fdisk
fi
if [ ! -x $FDISK ]
then
        echo        "fdisk command cann't be found, exit here!"
        exit 1
fi



# if this have been done, exit with 1
if [ -d /mnt/win_C ]; then
        if [ `ls /mnt/win_C | wc | awk '{printf $1}'` != "0" ] ; then
                echo         "windows partitions have been mounted!"
                exit 1
        fi
fi

# delete all the mounted points here
rmdir /mnt/win_* >/dev/null 2>&1

# mount location
MntLoc[0]=C ; MntLoc[1]=D ; MntLoc[2]=E ; MntLoc[3]=F ;
MntLoc[4]=G ; MntLoc[5]=H ; MntLoc[6]=I ; MntLoc[7]=J ;
MntLoc[8]=K ; MntLoc[9]=L ; MntLoc[10]=M ; MntLoc[11]=N ;
MntLoc[12]=O ; MntLoc[13]=P ; MntLoc[14]=Q ; MntLoc[15]=R ;
MntLoc[16]=S ; MntLoc[17]=T ; MntLoc[18]=U ; MntLoc[19]=V ;
MntLoc[20]=W ; MntLoc[21]=X ; MntLoc[22]=Y ; MntLoc[23]=Z ;

# get all the hard disk partitions we need to think over:
# ntfs, fat16, fat32 etc
# get all  the partitions first, then filter out the informations
# about comments. The next thing is to get all the
# NTFS, FAT16, FAT32, and Extended.
# Extended Key word for dividing Primary and Extended partitions.
# delete the * , which mark the bootable partitions
# get only the partitions and partitions mark.

# get all the harddisk in /dev/hd?
PARTITIONS=""                   # partitions string
if [ ! -x /bin/dmesg ]; then
        echo "/bin/dmesg is not exit!"
        exit 1
fi
for HDDEV in `/bin/dmesg | grep "^hd.*DISK drive" | awk -F: '{print $1}'`
do                                # do for every hard disk devices
                                # until the last available one
                                # get the NTFS, FAT16, FAT32, and Extended
                                # delete things between /dev/hda? and FAT32
        PARTITIONONE=`$FDISK -l /dev/$HDDEV 2>/dev/null | \
        grep ^\/dev | \
        sed 's/\*/ /g' | \
        grep -i "['FAT'|'NTFS']" | \
        sed 's/ (LBA)$//g' | sed 's/ .* /        /g' `
        if [ "${PARTITIONONE}" = "" ]; then
                break
        fi
                        # for the logical partitions in windows
                        # the Primary state before the logical one
                        # so we need to do something mark the Primary
                        # one
                        # we know the non-primary partitions is after
                        # the Extended one
                        # so here mark the primary one with BEFOREXTENDED
BFEX=1          # BFEX = 1 means before Extended partitions,
                        # BFEX = 0 means after Extended partitions,

for LOGICALPART in $PARTITIONONE
do
if [ "$LOGICALPART" = "Extended" ]
then
        BFEX=0
fi
if [ $BFEX -eq 1 ]
then
        MODIFYPARTITIONS="$MODIFYPARTITIONS BEFOREXTENDED$LOGICALPART        "
else
        MODIFYPARTITIONS="$MODIFYPARTITIONS $LOGICALPART"
fi
PARTITIONS="$PARTITIONS  $MODIFYPARTITIONS"
MODIFYPARTITIONS=""
done                # end for one devcice
done                # end for all available hard disk devices
                # $PARTITIONS store all the informations about the
                # partitions name and its type(NTFS, FAT.., Extended,etc)
#echo $PARTITIONS

# deal with the PARTITIONS, sort it in the following orders, ex.:
# /dev/hda1  primaryone
# /dev/hda2  primaryone
# /dev/hdb1  primaryone
# /dev/hdb2  primaryone
# /dev/hda4  extended one
# /dev/hda5  extended one
# /dev/hdb4  extended one

{
        { STEP=0
        for ParaOne in $PARTITIONS
        do
                echo -e -n "$ParaOne        "
                STEP=`expr $STEP + 1`
                STEP=`expr $STEP % 2`
                if [ $STEP  -eq 0 ]
                then
                        echo  ""
                fi
        done
        } | \
        sort | sed -e '/Extended        $/d' -e 's/BEFOREXTENDED//g'
} | \
{
        WINPARTSTEP=0
        while        read PartitionName PartitionType
        do
                # mount location is located at /mnt/..., named from C, D,...
                # if the mount location doesn't exist, make it with mkdir
                MOUNTLOCATITION=/mnt/win_${MntLoc[$WINPARTSTEP]}
                if [ ! -d $MOUNTLOCATITION ]
                then
                        mkdir -p $MOUNTLOCATITION
                ln -sf $MOUNTLOCATITION /root/win_${MntLoc[$WINPARTSTEP]}
                fi

                echo $PartitionName $PartitionType
                echo $MOUNTLOCATITION

                # mount partition according to the PartitionType
                WINPARTSTEP=`expr $WINPARTSTEP + 1`
                MountType=""
                case $PartitionType in
                        FAT16)        MountType=vfat
                                        MNTFLAGS="-o rw"
                                        ;;
                        FAT32)         MountType=vfat
                                        MNTFLAGS="-o rw"  
                                        ;;
                        HPFS/NTFS) MountType=ntfs
                                                MNTFLAGS="-o ro,iocharset=cp936"  
                                        ;;
                esac
                if [ "$MountType" != "" ]
                then
                        $MOUNT $MNTFLAGS -t $MountType $PartitionName $MOUNTLOCATITION >/dev/null 2>&1
                        if [ $? != 0 ]; then
                                echo -e "\tERROR in mount $PartitionName at $MOUNTLOCATITION, fs: $MountType"
                                rmdir  $MOUNTLOCATITION
                                WINPARTSTEP=`expr $WINPARTSTEP - 1`
                        else
                                echo "mount $PartitionName Readonly at $MOUNTLOCATITION, fs: $MountType";
                        fi
                fi
        done
}
[/code:1]
发表于 2003-6-7 11:38:07 | 显示全部楼层
好也啊!!
回复

使用道具 举报

发表于 2003-6-7 12:45:16 | 显示全部楼层
了不起!利用 fdisk -l 的输出进行工作,非常熟练地运用循环、awk、sed、grep 和管道技术,而且是一个通用脚本。
回复

使用道具 举报

发表于 2003-6-7 20:24:06 | 显示全部楼层
纳入,软件包就叫winmount吧,
注明来自cosix
回复

使用道具 举报

 楼主| 发表于 2003-6-7 22:02:01 | 显示全部楼层
无论中软还是红旗,都有不少下了工夫的地方,能将那些好东西都搞过来就好
我还看中了他们的声卡配置工具和内猫配置工具,还有一个自动检测PCI硬件工具(中软不用kzudu,自己搞了个叫ScanPCI),可以让新加入的硬件检测出来,在进入KDE前自动运行一个GUI配置工具配置,和红旗一样,可惜这些都没有源码,没办法弄过来
回复

使用道具 举报

发表于 2003-6-7 22:56:58 | 显示全部楼层
[quote:788a217b3e="llc"]无论中软还是红旗,都有不少下了工夫的地方,能将那些好东西都搞过来就好
我还看中了他们的声卡配置工具和内猫配置工具,还有一个自动检测PCI硬件工具(中软不用kzudu,自己搞了个叫ScanPCI),可以让新加入的硬件检测出来,在进入KDE前自动运行一个GUI配置工具配置,和红旗一样,可惜这些都没有源码,没办法弄过来[/quote]
不要说源代码,中软4.0在网上根本没的下载,连软件包都没有,哪来的源代码。
虽说那是他们花了大量精力作出来的,让人家免费用未免有点不甘心,不过这种违背GPL精神的事情亏他们做得出来……
国产linux好像就只有magic遵循着GPL。
回复

使用道具 举报

发表于 2003-6-8 17:13:00 | 显示全部楼层
我讨厌中软,即使它的东西再好也懒得用,建议magic也不要用它的东西,抬高中软身分了。
在自动加载win分区方面,mandrake绝对更强,为什么不学习mandrake呢?
回复

使用道具 举报

发表于 2003-6-9 11:54:45 | 显示全部楼层
楼上的兄弟也不必太动气,只要是好的,我们都可以学习,借用,为的是我们的 MagicN(会是这个名儿吗?)更好用,更易用。
我用过中软的3.1,它的windows下的分区是可以自动加入,可是,我的hda10被变成了winc,hda11变成了wind,真正的hda1却成了 wing,我的分区有hda1、5、6、7、8、9、10、11、12。她的4.0的我没有机会用。
回复

使用道具 举报

发表于 2003-6-9 12:33:17 | 显示全部楼层
嗯,这个脚本是错的,
我正准备用python自己重写。
回复

使用道具 举报

 楼主| 发表于 2003-6-9 12:42:46 | 显示全部楼层
[quote:d304a6053f="cjacker"]嗯,这个脚本是错的,
我正准备用python自己重写。[/quote]

我测试了一下,确实mount上的表示位置不对
回复

使用道具 举报

发表于 2003-6-10 12:54:43 | 显示全部楼层
用别人的东西之前,要小心看看人家是否愿意公开,否则的话趁早重写,免得遭遇 SCO 控告 Linux 之类的尴尬。
回复

使用道具 举报

发表于 2003-6-10 13:06:26 | 显示全部楼层
[quote:471992fb06="charlesw"]用别人的东西之前,要小心看看人家是否愿意公开,否则的话趁早重写,免得遭遇 SCO 控告 Linux 之类的尴尬。[/quote]

所以我要重写
回复

使用道具 举报

发表于 2003-6-10 17:19:43 | 显示全部楼层
這個好,好像fg也可以.
回复

使用道具 举报

发表于 2003-6-10 19:53:41 | 显示全部楼层
希望快些写好,放上来测试
回复

使用道具 举报

发表于 2003-6-19 00:54:27 | 显示全部楼层
呵呵,我在给LINUX分区的时候就把WIN里的分区给设定自动挂载了,现在不用那么麻烦搞了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-1-9 10:36 , Processed in 0.087389 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表