KanKer 发表于 2004-9-18 22:58:44

自动检测并加载分区脚本

受linuxsir上哈蜜瓜的启发,重新写了一个自动加载分区的脚本,条件所限,对scsi的检测还不太完善,请大家修正:

1、将下面脚本保存为/usr/sbin/fstype:

#!/bin/sh

#节选自哈蜜瓜写的自动加载分区脚本。

FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C file -Lkbs "$1")"

if [ "$FILE" = "data" ]; then
# could still be ReiserFS, since "file" only reads 64k in Debian
   FILE="$(dd if="$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


2、将下面脚本放到/etc/rc.d/rc.local里(用ML1.2pre6以后系统的朋友可加在/etc/rc.d/rc.magic里),以便每次开机自动运行:
---------------------------------------------------

#自动检测加载分区
if [ -f /etc/profile.d/lang.sh ]; then
. /etc/profile.d/lang.sh
case $LANG in
   zh_CN*)
      MOUNTOPTIONS="iocharset=cp936"
      ;;
   zh_TW*)
      MOUNTOPTIONS="iocharset=cp950"
      ;;
   ja_JP*)
      MOUNTOPTIONS="iocharset=cp932"
      ;;
   ko_KR*)
      MOUNTOPTIONS="iocharset=cp949"
esac
fi

if [ ! -f /etc/fstab ];then
      touch /etc/fstab
fi

#for ide devices
for i in $(ls -d /proc/ide/h*);do
    if cat $i/media |grep -i disk >/dev/null;then
      for j in $(/sbin/fdisk -l /dev/$(basename $i)|cut -c1-10|grephd);do
             LABEL=$(e2label $j 2>/dev/null)
             FSTYPE=$(/usr/sbin/fstype $j)
             if [ ! -z $FSTYPE ];then
                  if [ -z $LABEL ];then
                      if ! grep -Rn "$j " /etc/fstab >/dev/null;then
                           MYMOUNT="/mnt/$(basename $j)"
                           if [ ! -d "$MYMOUNT" ]; then
                                  mkdir -p "$MYMOUNT"
                           fi
                           if echo $FSTYPE|grep -i vfat >/dev/null|| echo $FSTYPE|grep -i ntfs >/dev/null;then
                                 echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                 mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                           else
                                  echo "$j   $MYMOUNT   $FSTYPE   defaults   0 0" >>/etc/fstab
                                  mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                           fi
                     fi
                  else
                        if ! grep -Rn "$j " /etc/fstab >/dev/null && ! grep -Rn LABEL=$LABEL /etc/fstab >/dev/null;then
                              MYMOUNT="/mnt/$(basename $j)"
                              if [ ! -d "$MYMOUNT" ]; then
                                 mkdir -p "$MYMOUNT"
                              fi
                              if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                                 echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                                    mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                              else
                                    echo "$j   $MYMOUNT   $FSTYPE   defaults   0 0" >>/etc/fstab
                                    mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                               fi
                           fi
                     fi
                fi
            done
    elif cat $i/media |grep -i cdrom >/dev/null;then
         if ! grep -Rn $(basename $i) /etc/fstab >/dev/null;then
            MYMOUNT="/mnt/cdrom-$(basename $i)"
            if [ ! -d "$MYMOUNT" ]; then
                  mkdir -p "$MYMOUNT"
            fi
            echo "/dev/$(basename $i)   $MYMOUNT   udf,iso9660$MOUNTOPTIONS,user,noauto0 0" >>/etc/fstab
         fi
   fi
done

# for scsi devices,now only for sata.
if cat /proc/scsi/scsi |grep Direct >/dev/null;then
    for j in $(/sbin/fdisk -l /dev/sda|cut -c1-10|grep'sda');do
         LABEL=$(e2label $j 2>/dev/null)
         FSTYPE=$(/usr/sbin/fstype $j)
         if [ ! -z $FSTYPE ];then
            if [ -z $LABEL ];then
               if ! grep -Rn "$j " /etc/fstab >/dev/null;then
                      MYMOUNT="/mnt/$(basename $j)"
                      if [ ! -d "$MYMOUNT" ]; then
                            mkdir -p "$MYMOUNT"
                      fi
                      if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                           echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                           mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                     else
                            echo "$j   $MYMOUNT   $FSTYPE defaults   0 0" >>/etc/fstab
                            mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                        fi
                  fi
                else
                  if ! grep -Rn "$j " /etc/fstab >/dev/null && ! grep -Rn LABEL=$LABEL /etc/fstab >/dev/null;then
                        MYMOUNT="/mnt/$(basename $j)"
                        if [ ! -d "$MYMOUNT" ]; then
                              mkdir -p "$MYMOUNT"
                        fi
                        if echo $FSTYPE|grep -i vfat >/dev/null || echo $FSTYPE|grep -i ntfs >/dev/null;then
                              echo "$j   $MYMOUNT   $FSTYPE $MOUNTOPTIONS,umask=0,exec 0 0" >>/etc/fstab
                              mount -t $FSTYPE -o $MOUNTOPTIONS,umask=0,exec,rw $j $MYMOUNT 2>/dev/null
                        else
                              echo "$j   $MYMOUNT   $FSTYPE defaults   0 0" >>/etc/fstab
                              mount -t $FSTYPE -o defaults $j $MYMOUNT 2>/dev/null
                           fi
                     fi
                  fi
         fi
      done
elif cat /proc/scsi/scsi |grep CD-ROM >/dev/null;then
      if ! grep -Rn sda /etc/fstab >/dev/null;then
      MYMOUNT="/mnt/cdrom-sda"
      if [ ! -d "$MYMOUNT" ]; then
                mkdir -p "$MYMOUNT"
      fi
      echo "/dev/sda   $MYMOUNT   udf,iso9660$MOUNTOPTIONS,user,noauto0 0" >>/etc/fstab
      fi
fi

MichaelBibby 发表于 2004-9-18 23:07:19

加一些解释会更好:twisted:

KanKer, 下次记得用code格式格式化代码 :mrgreen:

aaaa 发表于 2004-9-20 10:39:36

加一些解释会更好:twisted:

KanKer, 下次记得用code格式格式化代码 :mrgreen:
版主能否修改一下论坛代码,将code中的代码显亮一下,这样不好看啊!
下面是我以前写的,javascript显亮Delphi代码,也许改改就能用。
----------------------------
/*
*
* Copyright (c) 2003, Ander ChongQing China
* All rights reserved.
*
* Filename:hl.js
* Summary:Highlighted Delphi codes
*
* Version:1.0
* Author: Ander
* Email: [email protected]
* Creation date: 2003-2-8
*
//////////////////////////////////
*
* Function:highlighting Delphi codes by HTML tag
* Import:Delphi codes
* Return Value:highlighted Delphi codes by HTML tag
*
*/
function Highlight(sCode) {
        var Color = new Array(6);//highlighted text style
        var i,j;
        //Delphi Keywords
        var KeyWrd = new Array("and", "array ", "as", "asm", "begin", "case", "class", "const",
                                "constructor", "destructor", "dispinterface", "div", "do", "downto", "else",
                                "end", "except", "exports", "file", "finalization", "finally", "for",
                                "function", "goto", "if", "implementation", "in", "inherited",
                                "initialization", "inline", "interface", "is", "label", "library", "mod",
                                "nil", "not", "object", "of", "or", "out", "packed", "procedure", "program",
                                "property", "raise", "record", "repeat", "resourcestring", "set", "shl",
                                "shr", "string", "then", "threadvar", "to", "try", "type", "unit", "until",
                                "uses", "var", "while", "with", "xor", "private", "protected", "public",
                                "published", "automated");
                               
        //keyword style
        Color[0] = "<strong>";
        Color[1] = "</strong>";
        //number style
        Color[2] = "<font color=\"#0000FF\">";
        Color[3] = "</font>";
        //comment style
        Color[4] = "<em><font color=\"#0000FF\">";
        Color[5] = "</font></em>";
       
        var KeyReg;
        var numReg = /([\W])([0-9]+)/g;
        var LCReg = /(\/\/+[^\r]*)/g;
        var MCReg = /({[^}]*})/g;

        //special symbols
        sCode = sCode.replace(/\&/g, "&");
        sCode = sCode.replace(/\"/g, """);
        sCode = sCode.replace(/\r|\n/g, "\r<br/>");
        sCode = sCode.replace(/ /g, " ");
        sCode = sCode.replace(/\t/g, "    ");
        //highlight number
        sCode = sCode.replace(numReg,"$1" + Color[2] + "$2" + Color[3]);
        //highlight keywords
        for (j = 0; j < KeyWrd.length; j++) {
                KeyReg = new RegExp("\\b" + KeyWrd[j] + "\\b", "gi");
                sCode = sCode.replace(KeyReg, Color[0] + KeyWrd[j] + Color[1]);
                KeyReg = null;
        }
        //highlight comment
        sCode = sCode.replace(LCReg, Color[4] + "$1" + Color[5]);
        sCode = sCode.replace(MCReg, Color[4] + "$1" + Color[5]);
       
        return (sCode);
}

aaaa 发表于 2004-9-20 11:03:20

楼主:

/usr/sbin/fstype这个脚本我输入了,但case好像你没有写完哦。

后来我查顶贴的教程也没有发现case怎么写,但后来我灵机一动,在最后一行写了个esac。

呵呵,运行不报错了。 :-D

但是,"*)" 让我迷惑,查也没有查到,这个到底是什么语法呢?

KanKer 发表于 2004-9-20 12:17:14

sorry,是贴的时候掉了,已改正。
在case里面的 "*)" 是指除了上面列举以外的情况,相当于C里面的else。

在ML的initscripts包内集成了该脚本,下载地址:
http://www.magiclinux.org/people/kanker/os/rpms/initscripts-8.0-4mgc.i686.rpm

aaaa 发表于 2004-9-21 15:32:14

昨天找到一本好书!Linux参考大全。上面有case的语法,我看了一下,觉得您的解释不正确。

应该是,两个**是用来做一个字符匹配的。)才是case的语法的一部分。

另外我有一个不明白的地方。第一行中LANG=C LC_ALL=C LC_MESSAGES=C何解?
为什么要加到file命令前面?我没有查到。

盼复

PS:我也是重庆人。 老乡哦 :-)

zslevin 发表于 2004-9-30 14:13:43

楼上的看得真是仔细,

FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C
其实是设定 file -Lkbs "$1")" 运行的环境变量,这些变量是局部(file 进程)的,不会影响全局(shell)的值。

aaaa 发表于 2004-9-30 15:53:29

多谢楼上的zslevin大侠!我知道了,我去查一下环境变量。

由于我是第一次学Linux,所以会有很多不明白的地方!

问了些比较初级的问题,真不好意思 :oops:

ygw_ycf 发表于 2004-10-19 13:39:06

再写个脚本,自动在桌面加入一个“我得电脑”
现在仅仅是在/mnt/hdn,一般人还不知道呢
其实就是作个连接到位置,指向/mnt

MichaelBibby 发表于 2004-10-19 13:54:52

让它在mount的同时建个链接就可以了

aaaa 发表于 2004-10-20 09:52:00

桌面的图标链接是怎么添加的?

那位大侠教我?我来修改这个添加分区的脚本

MichaelBibby 发表于 2004-10-20 12:38:43

用 ln 命令就可以了啊 :o

aaaa 发表于 2004-10-21 17:51:09

这样简单啊?但不是桌面上要有个图标么?

大侠来个例子嘛。我学学。

aaaa 发表于 2004-10-22 12:14:44

昨天晚上看了一下,ln出来的东西不行,比如自动挂了光盘后图标是要变化的。另外就是图片上还关联了鼠标右键菜单的。

看了一下RH9下gnome的桌面图标,是个文本文件,里面有另外还看了一下TurboLinux7下面的gnome,里面是xml文件。晕了。

找不到资料。

那位大侠指点指点?

MichaelBibby 发表于 2004-10-22 12:20:16

汗,这个还真有点复杂了
本以为只要链接一个就可以了,现在看来还需要XML知识 :oops:

期待各位朋友的解答......
页: [1] 2
查看完整版本: 自动检测并加载分区脚本