自动检测并加载分区脚本

自动检测并加载分区脚本

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

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

[code:1]#!/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
[/code:1]

2、将下面脚本放到/etc/rc.d/rc.local里(用ML1.2pre6以后系统的朋友可加在/etc/rc.d/rc.magic里),以便每次开机自动运行:
---------------------------------------------------
[code:1]
#自动检测加载分区
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|grep  hd);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,noauto  0 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,noauto  0 0" >>/etc/fstab
        fi
fi[/code:1]
加一些解释会更好

KanKer, 下次记得用code格式格式化代码
[quote:06bfd53c70="MichaelBibby"]加一些解释会更好

KanKer, 下次记得用code格式格式化代码 [/quote]
版主能否修改一下论坛代码,将code中的代码显亮一下,这样不好看啊!
下面是我以前写的,javascript显亮Delphi代码,也许改改就能用。
----------------------------
[code:1]/*
*
* Copyright (c) 2003, Ander ChongQing China
* All rights reserved.
*
* Filename:hl.js
* Summary:Highlighted Delphi codes
*
* Version:1.0
* Author: Ander
* Email: chensoft@etang.com
* 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);
}[/code:1]
楼主:

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

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

呵呵,运行不报错了。

但是,"*)" 让我迷惑,查也没有查到,这个到底是什么语法呢?
sorry,是贴的时候掉了,已改正。
在case里面的 "*)" 是指除了上面列举以外的情况,相当于C里面的else。

在ML的initscripts包内集成了该脚本,下载地址:
http://www.magiclinux.org/people/kanker/os/rpms/initscripts-8.0-4mgc.i686.rpm
昨天找到一本好书!Linux参考大全。上面有case的语法,我看了一下,觉得您的解释不正确。

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

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

盼复

PS:我也是重庆人。 老乡哦 :-)
楼上的看得真是仔细,

FILE="$(LANG=C LC_ALL=C LC_MESSAGES=C
其实是设定 file -Lkbs "$1")" 运行的环境变量,这些变量是局部(file 进程)的,不会影响全局(shell)的值。
多谢楼上的zslevin大侠!我知道了,我去查一下环境变量。

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

问了些比较初级的问题,真不好意思
再写个脚本,自动在桌面加入一个“我得电脑”
现在仅仅是在/mnt/hdn,一般人还不知道呢
其实就是作个连接到位置,指向/mnt
让它在mount的同时建个链接就可以了