QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6711|回复: 25

自动检测并加载分区脚本

[复制链接]
发表于 2004-9-18 22:58:44 | 显示全部楼层 |阅读模式
受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]
发表于 2004-9-18 23:07:19 | 显示全部楼层
加一些解释会更好

KanKer, 下次记得用code格式格式化代码
回复

使用道具 举报

发表于 2004-9-20 10:39:36 | 显示全部楼层
[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: [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);
}[/code:1]
回复

使用道具 举报

发表于 2004-9-20 11:03:20 | 显示全部楼层
楼主:

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

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

呵呵,运行不报错了。

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

使用道具 举报

 楼主| 发表于 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
回复

使用道具 举报

发表于 2004-9-21 15:32:14 | 显示全部楼层
昨天找到一本好书!Linux参考大全。上面有case的语法,我看了一下,觉得您的解释不正确。

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

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

盼复

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

使用道具 举报

发表于 2004-9-30 14:13:43 | 显示全部楼层
楼上的看得真是仔细,

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

使用道具 举报

发表于 2004-9-30 15:53:29 | 显示全部楼层
多谢楼上的zslevin大侠!我知道了,我去查一下环境变量。

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

问了些比较初级的问题,真不好意思
回复

使用道具 举报

发表于 2004-10-19 13:39:06 | 显示全部楼层
再写个脚本,自动在桌面加入一个“我得电脑”
现在仅仅是在/mnt/hdn,一般人还不知道呢
其实就是作个连接到位置,指向/mnt
回复

使用道具 举报

发表于 2004-10-19 13:54:52 | 显示全部楼层
让它在mount的同时建个链接就可以了
回复

使用道具 举报

发表于 2004-10-20 09:52:00 | 显示全部楼层
桌面的图标链接是怎么添加的?

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

使用道具 举报

发表于 2004-10-20 12:38:43 | 显示全部楼层
用 ln 命令就可以了啊
回复

使用道具 举报

发表于 2004-10-21 17:51:09 | 显示全部楼层
这样简单啊?但不是桌面上要有个图标么?

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

使用道具 举报

发表于 2004-10-22 12:14:44 | 显示全部楼层
昨天晚上看了一下,ln出来的东西不行,比如自动挂了光盘后图标是要变化的。另外就是图片上还关联了鼠标右键菜单的。

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

找不到资料。

那位大侠指点指点?
回复

使用道具 举报

发表于 2004-10-22 12:20:16 | 显示全部楼层
汗,这个还真有点复杂了
本以为只要链接一个就可以了,现在看来还需要XML知识

期待各位朋友的解答......
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-9-20 03:59 , Processed in 0.053652 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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