QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3606|回复: 33

fsautomount 有点混乱哈,我看了下只识别单硬盘~

[复制链接]
发表于 2012-1-6 12:06:15 | 显示全部楼层 |阅读模式
新的内核识别光驱也对应新硬件,应该识别为 sr0,而不是 sda
改写了一下如下:

#!/bin/sh
#自动检测加载分区 //Written by KanKer haulm for Magic Linux
#if [ -f /etc/profile.d/lang.sh ]; then
#. /etc/profile.d/lang.sh
#case $LANG in
#cp936 cp950 cp932 cp949 改成 utf8
if [ ! -f /etc/fstab ];
then touch /etc/fstab;
fi
case $1 in
   zh_CN*|zh_SG*)
        MOUNTOPTIONS="iocharset=utf8"
        ;;
   zh_TW*|zh_HK*)
        MOUNTOPTIONS="iocharset=utf8"
        ;;
   ja_JP*)
        MOUNTOPTIONS="iocharset=utf8"
        ;;
   ko_KR*)
        MOUNTOPTIONS="iocharset=utf8"
esac
# for scsi devices,now only for sata.
if ! grep -Rn "/dev/pts" /etc/fstab >/dev/null;then
echo 'none                   /dev/pts                       devpts                 gid=5,mode=620         0    0'>>/etc/fstab
fi
if ! grep -Rn "/dev/shm" /etc/fstab >/dev/null;then
echo 'none                   /dev/shm                       tmpfs                  defaults               0    0'>>/etc/fstab
fi
if ! grep -Rn "/proc" /etc/fstab >/dev/null;then
echo 'none                   /proc                          proc                   defaults               0    0'>>/etc/fstab
fi
if ! grep -Rn "/sys" /etc/fstab >/dev/null;then
echo 'none                   /sys                           sysfs                  defaults               0    0'>>/etc/fstab
fi
if [ -f /proc/scsi/scsi ];then
        for j in $(/sbin/fdisk -l|grep ^/dev/sd|cut -c1-10);do
                LABEL=$(e2label $j 2>/dev/null)
                FSTYPE=$(/usr/sbin/fstype $j)
                if [ ! -z ${FSTYPE} ];then
                                if ! grep -Rn "$j " /etc/fstab >/dev/null;then
                                        MYMOUNT="/mnt/$(basename $j)"
                                        mkdir -p "${MYMOUNT}"
                                        chmod 777 "${MYMOUNT}"
                                        if echo ${FSTYPE}|grep -i vfat >/dev/null; then
                                                        echo "$j   ${MYMOUNT}   ${FSTYPE} ${MOUNTOPTIONS},umask=0,exec,rw  0 0" >>/etc/fstab
                                        elif echo ${FSTYPE}|grep -i ntfs >/dev/null; then
                                                        MOUNTOPTIONS="locale=zh_CN.UTF8"
                                                        echo "$j   ${MYMOUNT}   ${FSTYPE} ${MOUNTOPTIONS},umask=0  0 0" >>/etc/fstab
                                                        MOUNTOPTIONS="iocharset=utf8"
                                        elif echo ${FSTYPE}|grep -i swap >/dev/null; then
                                                        echo "$j   swap        swap defaults   0 0" >>/etc/fstab
                                        else
                                                echo "$j   ${MYMOUNT}   ${FSTYPE} defaults   0 0" >>/etc/fstab
                                        fi
                                fi                       
                fi
        done
        if (cat /proc/scsi/scsi |grep CD-ROM >/dev/null);then
                if ( ! grep -Rn sr0 /etc/fstab >/dev/null );then
                MYMOUNT="/mnt/cdrom"
                mkdir -p "${MYMOUNT}"
                chmod 777 "${MYMOUNT}"
                echo "/dev/sr0    ${MYMOUNT}  udf,iso9660  ${MOUNTOPTIONS},user,noauto  0 0" >>/etc/fstab
                fi
        fi
fi
#for ide devices
if [ -d /proc/ide ];then
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 ! grep -Rn "$j " /etc/fstab >/dev/null;then
                                                MYMOUNT="/mnt/$(basename $j)"
                                                mkdir -p "${MYMOUNT}"
                                                chmod 777 "${MYMOUNT}"
                                                if echo ${FSTYPE}|grep -i vfat >/dev/null; then
                                                        echo "$j   ${MYMOUNT}   ${FSTYPE} ${MOUNTOPTIONS},umask=0,exec,rw  0 0" >>/etc/fstab
                                                elif echo ${FSTYPE}|grep -i ntfs-3g >/dev/null; then
                                                        MOUNTOPTIONS="locale=zh_CN.UTF8"
                                                        echo "$j   ${MYMOUNT}   ${FSTYPE} ${MOUNTOPTIONS},umask=0  0 0" >>/etc/fstab
                                                        MOUNTOPTIONS="iocharset=utf8"
                                                elif echo ${FSTYPE}|grep -i swap >/dev/null; then
                                                        echo "$j   swap        swap defaults   0 0" >>/etc/fstab
                                                else
                                                        echo "$j   ${MYMOUNT}   ${FSTYPE}   defaults   0 0" >>/etc/fstab
                                                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}"
                                chmod 777 "${MYMOUNT}"
                        fi
                        echo "/dev/$(basename $i)   ${MYMOUNT}   udf,iso9660  ${MOUNTOPTIONS},user,noauto  0 0" >>/etc/fstab
                fi
        fi
done
fi
mount -o remount -a


[ 本帖最后由 haulm 于 2012-1-6 16:05 编辑 ]
发表于 2012-1-6 15:05:35 | 显示全部楼层
这东西干啥用的?
现在是不是应该已经全面转向图形界面的 udev 和 udisk 服务挂载而不是在开机时挂载了?
回复

使用道具 举报

 楼主| 发表于 2012-1-6 15:10:52 | 显示全部楼层
这个是 initscript 里面的脚本,用来修正和建立 fstab 的。
udisk 应该也是读取 /etc/fstab,udev 我不懂它如何工作,我在不使用 MGC 自动脚本的话,分区挂成了 ext3,怎么用?
我不知道还有什么东西是生成 fstab 的,这个要问 se 兄,它把我分区挂错了。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 15:30:16 | 显示全部楼层
原帖由 jiangtao9999 于 2012-1-6 15:05 发表
这东西干啥用的?
现在是不是应该已经全面转向图形界面的 udev 和 udisk 服务挂载而不是在开机时挂载了?

这个东西是绝对有用的,现在的系统只要删除 fstab 系统立马变成只读了,对分区读写要重新挂载,会挂载还好,不懂强制读写挂载就会有麻烦。而 fsautomount 可以起到重写 fstab 的效果,LIVEDVD 我用它直接重新生成 fstab,不过MGC 的脚本只是针对系统第一次启动增加了一个开关,我可以推广一下,新增一个 /etc/fstab 的脚本开关,一旦发现不见了就补上。牛吧~!
回复

使用道具 举报

 楼主| 发表于 2012-1-6 15:32:17 | 显示全部楼层
xorg.conf 其实也可以写成开机自检的,只要配置不对删掉它系统自动重新识别。重新识别部份用 lspci 列出硬件信息,然后比对数据更换驱动,这些都是 LIVE 要做的,不是说等你重新安装系统确认这些配置的。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 15:39:52 | 显示全部楼层
该脚本最后面是我添加进去的,用于没有 xorg.conf 时自动生成开源驱动配置,好处是避开开源组件中一些有问题的默认驱动配置。/etc/sysconfig/magic-release 不存在时该脚本会在开机时运行,所以 Livecd 只要不压进 /etc/sysconfig/magic-release 就可以在每次开机时自检了。好多参与开发 MGC 的老友们都动过这个脚本。
kwrite /etc/rc.d/magic-firstboot-script
#!/bin/sh
#本脚本设计为只运行一次,对 Magic Linux 进行一些必要的初始化设置。

if [ ! -f /etc/sysconfig/magic-release ];then
/sbin/ldconfig
chmod u+s /usr/bin/smbmnt
chmod u+s /usr/bin/smbumount
chmod 1777 /tmp
#清空任何信息输出,并且关闭炫耀画面
clear
#splashy_update exit

#显示警告信息
# if [ -x /bin/bash -a -x /usr/bin/cce -a -x /usr/sbin/magic_first_boot_warning ]; then
#临时关闭终端 gpm 鼠标服务,避免屏幕上显示无效的光标
#/etc/rc.d/init.d/gpm stop >/dev/null
#切换至终端 2,便于准确显示 dialog 对话框
#chvt 2 && \
#LANG=zh_CN.GB18030 /usr/bin/cce -e /usr/sbin/magic_first_boot_warning
#fi

#设置普通用户的 sudo 权限
[ -x /usr/bin/magic_sudo_add.sh ] && /usr/bin/magic_sudo_add.sh

#修正 flash 中文字体无法显示的 bug
[ -x /usr/bin/magic-fontalias-fix.sh ] && /usr/bin/magic-fontalias-fix.sh

#自动挂载其它非系统硬盘分区
/usr/sbin/fsautomount zh_CN.UTF8

#优化系统分区所在硬盘以及光驱的速度
# ★★以下由  kde <[email protected]> 增补
#首先搜索系统使用了哪些分区
rm -f /var/tmp/real_partitions_tmp
grep "^[[:space:]]*/dev/[h|s]d"  /etc/mtab | cut -c6-8 >> /var/tmp/real_partitions_tmp
grep "^[[:space:]]*/dev/[h|s]d"  /etc/fstab | cut -c6-8 >> /var/tmp/real_partitions_tmp
cat /var/tmp/real_partitions_tmp | sort | uniq > /var/tmp/real_partitions_tmp1
mv -f /var/tmp/real_partitions_tmp1 /var/tmp/real_partitions_tmp


    if [ -s /var/tmp/real_partitions_tmp ]; then
            #为所有 SATA/PATA 接口的硬盘及光驱设置适当的优化参数,-d1 参数有时会失败,保留默认值。
            for magic_partition in `cat /var/tmp/real_partitions_tmp | grep "^[h|s]d"`; do
                    if [ -b /dev/${magic_partition} ]; then
                            MaxMultSect=`hdparm -i /dev/${magic_partition} |grep 'MaxMultSect=' | cut -d',' -f3 | cut -d'=' -f2`
                            # 如果 MaxMultSect 参数为空,说明它不是一个 SATA/PATA 设备,如果为 0,说明它是一个光驱
                            if [ -z "${MaxMultSect}" ]; then continue; fi
                            if [ "${MaxMultSect}" = "0" ]; then
                                    echo -e "EXTRA_PARAMS=\"-q -c3 -k1 -u1\"" >/etc/sysconfig/harddisk${magic_partition}
                                    hdparm -q -c3 -k1 -u1 /dev/${magic_partition} >/dev/null || :
                                    continue
                            fi
                        # 如果 MaxMultSect 参数为其他数值,说明它是一个 SATA/PATA 设备(硬盘)
                            echo -e "EXTRA_PARAMS=\"-q -A1 -c3  -k1 -m${MaxMultSect} -u1 -W1\"" >/etc/sysconfig/harddisk${magic_partition}
                            hdparm -q -A1 -c3  -k1 -m${MaxMultSect} -u1 -W1 /dev/${magic_partition} >/dev/null || :
                    fi
            done
        #为所有 SCSI 接口的硬盘及光驱设置适当的优化参数(一般不需要)

            rm -f /var/tmp/real_partitions_tmp
    fi
# ★★

# 配置网卡
#if [ -x /bin/bash -a -x /usr/bin/cce -a -x /usr/sbin/magic_network_guide ]; then
#LANG=zh_CN.UTF8 /usr/bin/cce -e /usr/sbin/magic_network_guide || chvt 1
# 切换回终端1
#chvt 1
#clear

# 重新开启终端鼠标服务 gpm
#/etc/rc.d/init.d/gpm start >/dev/null
#elif [ -x /usr/sbin/netconfig ]; then
#        /usr/sbin/netconfig
#        /etc/rc.d/init.d/network restart
#fi

# 配置编码
#if [ -x /bin/bash -a -x /usr/bin/cce -a -x /usr/sbin/locale_change.sh ]; then
#LANG=zh_CN.UTF8 /usr/bin/cce -e /usr/sbin/locale_change.sh || chvt 1
#chvt 1
#clear
#fi

#配置声卡
#[ -x /usr/sbin/alsaconf ] && /usr/sbin/alsaconf

[ -d /dev/snd ] && chmod 666 /dev/snd/*
#[ -c /dev/dsp -o -c /dev/adsp ] && amixer sset Master on 30 && amixer sset PCM on 30 && alsactl store
    if [ -c /dev/dsp -o -c /dev/adsp ] ;then
            if [ -x /usr/bin/alsaunmute ];then
                    alsaunmute -a
            else
                    amixer sset Master on 30 && amixer sset PCM on 30
            fi
            alsactl store
    fi

/sbin/depmod `uname -r`

    #修正显卡配置
    if [ ! -f /etc/X11/xorg.conf ]
    then
          if ( lspci|grep VirtualBox>/dev/null )
          then
          X -configure
          mv xorg.conf.new /etc/X11/xorg.conf
          fi
          if ( lspci|grep VGA|grep G33|grep G31>/dev/null )
          then
          X -configure
          sed -i 's/intel/vesa/g' xorg.conf.new
          mv xorg.conf.new /etc/X11/xorg.conf
          fi
          if ( lspci|grep VGA|grep nVidia>/dev/null )
          then
          X -configure
          sed -i 's/nouveau/nv/g' xorg.conf.new
          mv xorg.conf.new /etc/X11/xorg.conf
          fi
          if ( lspci|grep VGA|grep ATI>/dev/null )
          then
          X -configure
          sed -i 's/fbdev/radeon/g' xorg.conf.new
          mv xorg.conf.new /etc/X11/xorg.conf
          fi
    fi
  
echo "The file is created antomatically by MagicLinux after first ran." > /etc/sysconfig/magic-release
echo "MagicLinux 2.5" >> /etc/sysconfig/magic-release

fi

所以我现在需要一些朋友提供驱动修正,以后只要USB或光盘放进机器就可以进入系统,根本不必要装什么系统啦~!

[ 本帖最后由 haulm 于 2012-1-6 16:15 编辑 ]
回复

使用道具 举报

发表于 2012-1-6 16:58:52 | 显示全部楼层
ubuntu 也没先进到 fstab 删了还能自己恢复。
fstab 只是开机时的挂载。在 X 里面,文件管理器的分区挂载功能是不要 fstab 的。
难道你想要插个 U 盘就要重建 fstab 么?
udisk、udev 的自动挂载,是直接检测硬件的。根本就不需要 fstab 提供数据。
目前 fstab 仅仅是让系统刚进入时,告诉他那个是 / 那个是 /usr 那个是 /boot 等等分区的配置。现在其实连 SWAP 都可以不写了,写个启动脚本自动识别 SWAP 分区自动 swapon ,这个特点对于你的 live 系统要比弄个 fsautomount 更有意义。
如果你要是真的蛋疼,完全可以写一个脚本直接检测每个分区,确定挂载位置后挂载上,完全可以脱离 fstab 。fstab 不过就是开机时的一个 mount 过程的信息文件,这个 mount 你完全可以自己重写替代成别的合适的脚本。要是真替换了就不需要 fstab 文件了。
至于分区的挂载,你应该看看系统怎么实现的 U 盘挂载和卸载的。

是你已经凹凸了还是我的思想太先进了?
我的 Gentoo 只有 4 行:/boot 、/、SWAP 、/tmp。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 18:10:40 | 显示全部楼层
你说的对,fsautomount 主要还是增加一些非系统分区的挂载参数,最大的麻烦是如果删除了 fstab 那如何确认 / 应该挂载在哪个分区。这可犯愁了,要是有人喜欢把系统装在扩展分区,或者是一个系统用了几个分区,不是很不好判断。

[ 本帖最后由 haulm 于 2012-1-6 18:28 编辑 ]
回复

使用道具 举报

发表于 2012-1-6 18:42:47 | 显示全部楼层
这东西你还不赶紧淘汰?
fstab 让 MI 去生成。装好的系统 fstab 就不再需要改变了。分区挂载上图形界面里面的自动挂载吧。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 18:45:45 | 显示全部楼层
不过可以不考虑特例,如果知道把 linux 各要职目录按不同分区进行设置的用户不用我的自动脚本去分析了,他们可以自己动手了。那我的思路就简单了,比如我修改好 fstab 进行一次重新挂载,然后例出每个分区的根目录,如果同时存在 bin etc lib opt sbin usr var,我就可以把它任命为 / 了,除非有人搞笑,非要搞一堆假文件来玩弄。。。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 18:46:52 | 显示全部楼层
原帖由 jiangtao9999 于 2012-1-6 18:42 发表
这东西你还不赶紧淘汰?
fstab 让 MI 去生成。装好的系统 fstab 就不再需要改变了。分区挂载上图形界面里面的自动挂载吧。

本来就是 MI 生成的啊,有时候 fstab 也有误删的时候,那时所有分区都是只读的,任何文件都写不进去,系统就只能 single 运行了。可能我考虑多了,现在的脚本就很不错了。

[ 本帖最后由 haulm 于 2012-1-6 18:53 编辑 ]
回复

使用道具 举报

发表于 2012-1-6 18:51:39 | 显示全部楼层
fstab 误删的全都拉出去砍手。
手欠的人没必要救,让他们重装去。
回复

使用道具 举报

 楼主| 发表于 2012-1-6 18:58:35 | 显示全部楼层
照你这么说,Live 里面 fsautomount 还要删掉了,没大用途,udisks 自动识别就行了,如果在写 Live 安装工具也是要提供用户自己定义的。不过我还是觉得有必要完善一下 fsautomount 自动识别 / 分区,有时候会有用的,有些用户一点困难就坚持不了了。

[ 本帖最后由 haulm 于 2012-1-6 19:01 编辑 ]
回复

使用道具 举报

发表于 2012-1-6 23:00:54 | 显示全部楼层
你识别它干什么?
人家装多个 Linux 你怎么处理?
回复

使用道具 举报

发表于 2012-1-7 09:47:34 | 显示全部楼层
原帖由 jiangtao9999 于 2012-1-6 18:51 发表
fstab 误删的全都拉出去砍手。
手欠的人没必要救,让他们重装去。

我的看法是重要文件最好还是要保护,windows也是对重要文件有保护的。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-25 09:09 , Processed in 0.078590 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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