关于分区自动挂载并在桌面建立相关图标

[quote:e9764e2efa="suowei1979"]cool[/quote]
兄台何以每个帖子都回复一个“cool”或者“very good"?

不过,看了你个人签名里的链接,不错啊,牛人一个
我的硬盘上好像还保留了比较老版本的红旗automount脚本,我一会回去找找,如果有也补充一下
[quote:af2bcbcc7e="lanche"]呵呵,那是要建立相应的*.desktop文件 ~~[/quote]

说得不错啊!就是这个样子的。只要在上次KanKer版主发的脚本中加入建立.desktop文件的部分就可以了。具体怎么加,看一下knoppix中就应该可以了。很简单。

不过我试了一下,gnome是不支持的。所以gnoppix中就没有knoppix中那些自动加载的硬盘图标了。

不过,我在turbolinux7下面发现他的gnome桌面能够采用
<?xml version="1.0"?>
<nautilus_object nautilus_link……

link="command:mount /dev/cdrom"/>这样的语句来进行kde下面.desktop文件基本相同的工作,但我把这个文件拷贝到RH9中却不能用。查了一下帮助,也没有发现相关内容。
[quote:b8973851c5="aaaa"]
不过我试了一下,gnome是不支持的[/quote]
我试了一下,发现我的gnome-2.8下可以

我把 "应用程序“ -->Internet --> Gaim 程序往桌面上拉,桌面就会有一个快捷方式的图标。但是在gnome-terminal里用ls命令查看一下,发现是一个.desktop文件。

至于这个.desktop文件是如何写的,俺研究ing......
不过不是象你所列出来的一样,它并不是XML语言写成的。
稍后贴上来 :-)
测试成功了

我试着在~/Desktop目录里建立一个1.desktop文件,文件内容如下:
[code:1]
[Desktop Entry]
Name=Bibby # 你看到的图标的名字
Comment=.desktop file test # 对这个.desktop文件的注释,在 属性 页里可以看到
Exec=anjuta # 要执行的命令
Icon=/usr/share/pixmaps/anjuta/applogo.png # 指定一个图片做为图标
Type=Application # 表示这是一个应用程序
Terminal=false # 这个还没弄明白,但是不加的话,会出错。知道的兄弟还请赐教 :)
[/code:1]

上面的是启动应用程序,下面的是启动文件管理器Nautilus,并且指定的是/mnt目录:
[code:1]
[Desktop Entry]
Name=File Browser
Exec=nautilus /mnt --browser
Icon=file-manager
Terminal=false
Type=Application
[/code:1]
也许这个是gnome的版本问题。我还没2.8版本的。

不过,如果是文本文件,一切都好办啊。您说呢?

找找说明,有没有解释[Desktop Entry] 的
嗯,searching ...
[quote:2b5b1dc7af="aaaa"]也许这个是gnome的版本问题。我还没2.8版本的。[/quote]
2.6的gnome也有这个文件的,看这里就知道了,6月份时发的贴,那时候2.8还没出来呢:
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=71988
老版本的红旗的automount脚本,也发上来让大家分析:


包括两部分,一个是/etc/rc.d/init.d/WinAutoMnt:
[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]

另一个是/sbin/WinAutoMnt.sh

[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]
多谢 llc 大哥

俺研究ing ...