·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux文档 | Linux论坛 | Linux下载 | Linux博客 | Linux搜索
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 安装启动
 
USB上的Linux(三)
来源: ChinaUnix博客  日期: 2008.06.02 11:38 (共有条评论) 我要评论
 

5.7 系统初始化的脚本
       上面说到rcS文件时,涉及到了/etc/init.d/rc.nic,/etc/init.d/rc.network,/etc/init.d/rc.usb,/etc/init.d/rc.local四个初始化脚本文件。下面来说说它们的作用。
5.7.1   /etc/init.d/rc.nic
此文件用来自动加载网卡对应的模块(驱动),并且删除没有用到的网卡驱动模块。
#!/bin/sh
#
# detect network cards shell  
#
dmesg  -n 1  #prevent  the messages from appearing on the console
ERR_DEV=/dev/null                # redirect verbose messages
NetcardPath=/lib/modules/2.4.20-8custom/kernel/drivers/net/
loaded=4  #the kernel already detected card,you may want to change it
           #according to file `/proc/net/dev`
# invoked by the init script or by the user?
[ "`basename $0`" = "rc.nic" ] && MODE=init || MODE=user

# number of NICs already detected
NICs=$((`cat /proc/net/dev | wc -l` -$loaded))

# when init, skip auto probing if we already found some NIC(s)
if [ $NICs -ge 1 -a "$MODE" = "init" ]; then
  echo "Found $NICs network card(s). Skip auto probing ..."
  exit 0
fi

# official NIC modules
NET_MODs=`find /lib/modules/\`uname -r\`/kernel/drivers/net/    \
                -type f -printf "%f\n" 2>$ERR_DEV               \
        | cut -d "." -f1`
# save the original dmesg messages first
[ -e /var/log/dmesg ] || dmesg > /var/log/dmesg

echo "Probing network cards ... "
CUR_NICs=$NICs
for i in $NET_MODs ; do
  ORG_MODs=`cat /proc/modules | wc -l`
  ORG_NICs=$CUR_NICs

  echo -en "\r\t$i        \t"
  #if  modprobe fail we think that this module is not needed
  #so we delete it to save the space
  if ! modprobe $i 1>$ERR_DEV 2>$ERR_DEV
  then
        temp=`find  $NetcardPath  -name $i.o`
        if [ -f $temp ]
        then
                rm  -rf $temp
        fi
  fi

  CUR_MODs=`cat /proc/modules | wc -l`
  CUR_NICs=$((`cat /proc/net/dev | wc -l` -$loaded))
  
  if [ $CUR_NICs -eq $ORG_NICs ]; then   
if [ $CUR_MODs -gt $ORG_MODs ]; then  #it  is not a netcard module
                                                                             #so we delete it      
      RMMODs=`head -$(($CUR_MODs-$ORG_MODs)) /proc/modules | cut -d" " -f1`
      for m in $RMMODs ; do
        rmmod $m 1>$ERR_DEV 2>$ERR_DEV
      done
    fi
  else
    echo " ($(($CUR_NICs-$ORG_NICs)))"
  fi
done
echo -e "\r                       \rFound $(($CUR_NICs-$NICs)) card(s), done."
rmmod -as
exit $(($CUR_NICs-$NICs))
看懂这个脚本就需要你熟悉shell编程了。由于比较大,我这里不作解释。
这个脚本的内容大部分是从cdlinux上面copy过来的,但是对其进行了修改,其中最大的修改就是添加了删除没有用到的模块的功能,这主要是为了节省空间所用。
      
5.7.2   /etc/init.d/rc.network
       这个脚本主要是初始化网络配置,
#!/bin/sh
#/sbin/ifconfig eth1    218.199.20.98  up
/sbin/ifconfig eth0    192.168.0.3   up
/sbin/ifconfig lo      127.0.0.1     up
route add default gw  192.168.0.1  dev eth0
这个脚本需要根据不同的环境进行修改。接触过linux的人相信这个不难看懂。
5.7.3   /etc/init.d/rc.usb
加载usb驱动模块,当然如果你的内核是静态编译进usb模块的,那就没有必要在这里多此一举了,不过如果我们要做个网关服务器,还是把它做成动态的模块比较好,因为网关服务器基本上不需要用到u盘,我们大可删除掉usb驱动模块,以节省空间。我们之所以需要usb的驱动模块,不要忘了我们的usbinux是放在u盘上面运行的。当然并不是说要在u盘上面运行linux,一定需要内核支持usb才行,不管是硬盘,u盘,还是软盘都只是个载体,第一章已经说了,我们的文件系统是在ramdisk中的,因此只要内核和文件系统被载入内存,我们就不再需要载体(存储设备)。但是我们很多东西可以放在u盘上面,以节省ramdisk的存储空间,所以还是需要内核识别u盘,等系统启动之后再把需要的东西从u盘拷贝到ram里面。
   rc.usb内容如下:  
#!/bin/sh
##            This script is to initilize usb controller and
##                  The driver module usb-storage
##            To use usb under linux the module usbcore,scsi_mod
##                  and sd_mod are needed,in this
##                  system they are complied in kernel

#/sbin/usb is the small script to start or stop  usb support
/sbin/usb start
#script  rc.usb  end
这个脚本里面用到了/sbin/usb这个程序,其实并不是一个真正的程序,它是我写的一个加载和卸载usb模块的shell脚本。/sbin/usb脚本内容如下:
#!/bin/sh
#
#A simple startup script to start usb for linux
#
case "$1" in
start)
         /sbin/modprobe usbcore
              /sbin/modprobe usb-uhci
              /sbin/modprobe usb-storage
              ;;
stop)
      /sbin/rmmod    usbcore
              /sbin/rmmod    usb-uhci
              /sbin/rmmod    usb-storage
              ;;
        *)
               echo "Usage: $0 {start|stop}"
               exit 1
        esac
#script /sbin/usb  end
我之所以写了这个usb脚本,是因为我发现,启动usblinux后,当机子用过一个u盘时,即使这个u盘umount掉了,再使用另外一个u盘的时候就会出现问题。也许是我的哪边配置有误,不过不管怎么说,这个脚本还是有用的。
注意:虽然上面只列出了,usbcore,usb-uhci,usb-storage三个模块,要能够成功挂载u盘,还需要scsi的支持,也就是需要scsi_mod.o  sd_mode.o两个模块,我的内核是把这两个模块静态编译进内核的,因此也就不需要再手动加载了。我之所以把对scsi支持的功能静态编译进内核,是为了测试方便的原故,我测试工具使用的是vmware虚拟机,因为vmware基本上使用scsi硬盘,为了避免添加linuxrc文件,我把vmware的硬盘驱动BusLogic.o静态编译进了内核,所以上面的scsi的两个模块也要编译进内核。
5.7.4   /etc/init.d/rc.local
这个shell脚本没有什么好说的,主要是初始化本地的一些服务,比如sshd,syslogd等等
我的rc.local脚本内容如下:
    #!/bin/sh
       #/sbin/sshd
/sbin/syslogd
在本地启动syslogd服务。
5.8  添加额外的应用程序
5.8.1  前言
       虽然busybox支持大多数应用程序,但是往往我们需要的程序它并不支持,这时候我们就只有copy我们的宿主机上的了,第一章说了,我们的usblinux需要能够fdisk存储设备,能够mkfs文件系统,能够使用grub安装grub到指定存储设备。busybox有fdisk,但是mkfs.*在我使用的busybox版本里面还不支持,另外ldconfig这个必须的应用程序busybox里面好像也没有。另外我们也许想在usblinux里面临时使用一下ftp服务器,用来传输文件用,调试的时候strace是必不可少的工具,加进硬盘检测工具smartmontools也是不错的主意,充当网关服务器sshd必不可少吧,虽然可以用其它的比如telnetd等代替,但是它们并没有sshd来的安全,因此我还是选择了sshd。
       上面说了这么多的应用程序,如果不采取任何措施直接copy到rootfs里面的话,可想而知,根文件系统的大小会相当大,sshd一个就会净增文件系统3M多的空间。因此我们必须想出一个好办法来处理这个问题。
5.8.2  如何节省ramdisk空间?
         有些应用程序譬如sshd,mkfs*,grub,strace等等,我们平时很少用到,因此如果我们能想出一个办法需要这个应用程序的时候调度出来,不需要的时候把它删掉,那就解决了问题。方法也许有很多,我使用的方法是把这些应用程序及其依赖的库文件压缩,然后把它们的压缩文件安装到opt目录下,需要的时候解压就行了,不需要的时候把解压出来的文件删除掉。我opt目录文件内容如下:
   #ls  opt
   ldconfig.tar.gz  rz.tar.gz             strace.tar.gz
   grub.tar.gz      mkfs.tar.gz      smartmontools.tar.gz
   iptables.tar.gz  pureftpd.tar.gz  sshd.tar.gz
   我之所以把ldconfig压缩,是因为ldconfig有536k之大,rz是学校校园上网认证的一个程序,strace是个调试程序,grub,mkfs不用说了吧,smartmontools是硬盘坏道检测工具,iptables做网关服务器所必须的,pureftpd一个很方便的ftp服务器程序,sshd远程登陆工具,包括服务端和客户端的。
5.8.3  调入调出的shell脚本
下面使用两个脚本来调入和调出/opt下的指定应用程序。
1.       调入脚本expand
#!/bin/sh
TOOL=$1
if [ ! -f /opt/$TOOL.tar.gz ]
then
        echo "No such tool!"
        exit
fi
mkdir /tmp/tool
cp  /opt/$TOOL.tar.gz    /tmp/tool
cd  /tmp/tool
tar  zxf  $TOOL.tar.gz
rm -rf $TOOL.tar.gz
cp  -dpR  /tmp/tool/$TOOL/etc/*    /usr/local/etc   2>/dev/null
cp  -dpR  /tmp/tool/$TOOL/sbin/*   /usr/local/sbin  2>/dev/null
cp  -dpR  /tmp/tool/$TOOL/bin/*   /usr/local/bin    2>/dev/null
cp  -dpR  /tmp/tool/$TOOL/lib/*   /usr/local/lib    2>/dev/null
rm -rf /tmp/tool
echo  "done"
2.       调出脚本/sbin/depand
#!/bin/sh
path=/usr/local
case  $1  in
"ldconfig")
        rm -rf $path/sbin/ldconfig
        echo  "done";;
"grub")
        rm -rf  $path/sbin/grub
        echo  "done";;
"smartmontools")
        rm -rf  $path/sbin/smartctl
        echo  "done";;
"strace")
        rm  -rf $path/bin/strace
        echo  "done";;
"rz")
        rm -rf  $path/bin/rz
        rm -rf  $path/etc/rz.conf
        rm -rf  $path/lib/libpcap*
        echo  "done";;
"mkfs")
        rm -rf  $path/sbin/mkfs*
        rm -rf  $path/lib/libext2*
        rm -rf  $path/lib/libe2p*
        rm -rf  $path/lib/libcom_err*
        rm -rf  $path/lib/libuuid*
        echo  "done";;
"pureftpd")
        rm -rf  $path/sbin/*pure*
        echo "done";;
*)
        echo  "this tool is not installed!"
esac

譬如要调入grub这个工具,只需要在命令行敲入expand grub即可,使用完grub之后,只要depand grub就可释放grub占有的ram空间。
(注意:expand和depand并不适用与iptables与sshd这两个应用程序,对它们我们需要额外编写脚本,因此expand应该加上对这两个程序的拒绝执行动作,但是我这里没有加,为了安全起见,建议还是应该加上)
5.8.4  opt目录下的应用程序压缩文件制作原则
       opt目录下的压缩文件并不是随便做的,我们必须遵循一定的规范,下面我们以制作mkfs工具来说明制作过程。
#cd  /mnt/rootfs/opt
#mkdir mkfs
#cd  mkfs
#mkdir bin sbin etc lib
#cp  -dpR  /lib/libext2fs.so.2*   ./lib
#cp  -dpR  /lib/libe2p.so.2*     ./lib
#cp  -dpR  /lib/libuuid.so.1*    ./lib
#cp  -dpR  /lib/libcom_err.so.2* ./lib
#cp  -dpR  /sbin/mkfs*        ./sbin
#cd  ..
#tar  zcf  mkfs.tar.gz  mkfs
#rm -rf mkfs
至此一个mkfs的压缩文件mkfs.tar.gz就做好了。
通过这个过程再配备上面的expand脚本你应该知道制作的规则了吧。   
下面用目录树了来表示这个架构:

                        $TOOL
                  
bin        sbin       lib       etc
5.8.5  sshd.tar.gz的制作
sshd以及ssh这两个程序依赖的库文件比较多,而且涉及的其它文件也比较多。然而它却是网关服务器所必不可少的。
要正确运行sshd要做以下几件事情
1.       安装sshd所依赖的库文件
2.       安装/lib/security目录
3.       安装/etc/pam.d文件夹
4.       安装/etc/ssh文件夹
5.       创建sshd帐号
6.       创建/var/empty/sshd目录
  下面是整个流程
  #cd   opt
  #mkdir sshd
  #cd  sshd
  #mkdir bin etc lib
  #cp  /usr/bin/ssh    bin
  #cp  /usr/sbin/sshd  bin
  #ldd  /usr/sbin/sshd
        libwrap.so.0 => /usr/lib/libwrap.so.0 (0x40026000)
        libpam.so.0 => /lib/libpam.so.0 (0x4002f000)
        libdl.so.2 => /lib/libdl.so.2 (0x40037000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x4003a000)
        libutil.so.1 => /lib/libutil.so.1 (0x4004c000)
        libz.so.1 => /usr/lib/libz.so.1 (0x4004f000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x4005e000)
        libcrypto.so.4 => /lib/libcrypto.so.4 (0x40073000)
        libkrb5.so.3 => /usr/kerberos/lib/libkrb5.so.3 (0x40164000)
        libk5crypto.so.3 => /usr/kerberos/lib/libk5crypto.so.3 (0x401c2000)
        libcom_err.so.3 => /usr/kerberos/lib/libcom_err.so.3 (0x401d2000)
        libc.so.6 => /lib/tls/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libgssapi_krb5.so.2 => /usr/kerberos/lib/libgssapi_krb5.so.2 (0x401d5000)
  (把这里面列出的库文件拷贝到lib目录下,注意拷贝的时候加上dpR参数,把原文件和链接文件全部拷贝过来)
  #cp  -dpR   /lib/security  ./ (拷贝pam认证时需要的库文件)
  #cp -R  /etc/ssh   etc/  (拷贝ssh以及sshd的配置文件)
  #mkdir   etc/pam.d
  #cp  /etc/pam.d/system-auth   etc/pam.d
  #cp  /etc/pam.d/sshd           etc/pam.d
  (把宿主机上的这两个文件拷贝过来,然后加以适当的修改,修改之后两个文件内容如下)
  #cat  etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        required      /lib/security/pam_deny.so

account     required      /lib/security/pam_unix.so

password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so

session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so
#cat  etc/pam.d/sshd
#%PAM-1.0
#auth       required    /lib/security/pam_securetty.so
auth       required     /lib/security/pam_stack.so service=system-auth
auth       required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
session    optional     /lib/security/pam_console.so
(根据这两个文件所用到的/lib/security目录下的库文件,对上面拷贝过来的库文件做适当的裁减,下面是我裁减了的security下的库文件列表)
#ls -l  security
-rwxr-xr-x  1 root root  9684 12月 19 15:21 pam_access.so
-rwxr-xr-x  1 root root 47584 12月 19 15:21 pam_console.so
-rwxr-xr-x  1 root root 12936 12月 19 15:21 pam_cracklib.so
-rwxr-xr-x  1 root root  3404 12月 19 15:21 pam_deny.so
-rwxr-xr-x  1 root root 11592 12月 19 15:21 pam_env.so
-rwxr-xr-x  1 root root  8468 12月 19 15:21 pam_lastlog.so
-rwxr-xr-x  1 root root 12324 12月 19 15:21 pam_limits.so
-rwxr-xr-x  1 root root  4856 12月 19 15:21 pam_nologin.so
-rwxr-xr-x  1 root root  3708 12月 19 15:21 pam_permit.so
-rwxr-xr-x  1 root root  6544 12月 19 15:21 pam_securetty.so
-rwxr-xr-x  1 root root 11132 12月 19 15:21 pam_stack.so
lrwxrwxrwx  1 root root    11 12月 25 20:10 pam_unix_acct.so -> pam_unix.so
lrwxrwxrwx  1 root root    11 12月 25 20:10 pam_unix_auth.so -> pam_unix.so
lrwxrwxrwx  1 root root    11 12月 25 20:10 pam_unix_passwd.so -> pam_unix.so
lrwxrwxrwx  1 root root    11 12月 25 20:10 pam_unix_session.so -> pam_unix.so
-rwxr-xr-x  1 root root 48520 12月 19 15:21 pam_unix.so
(注意就是动态链接库,它也有一定的依赖关系,因此最好对lib/security目录下的库文件依次检查其依赖关系,然后检查/mnt/rootfs/opt/sshd/lib目录下是否有其缺少的库文件,如果缺少的需要拷贝相应的动态链接库到/mnt/rootfs/opt/sshd/lib目录下.)

到这里,前4步已经做完了,第5步已经在前面的配置文件一节做完了。最后一步
#mkdir -p  /mnt/rootfs/var/empty/sshd
下面我们把opt目录下的sshd文件夹打包压缩。
#cd  /mnt/rootfs/opt/
#tar   zcf  sshd.tar.gz   sshd
#rm  -rf  sshd

到这里sshd工具就做完了,下面我们写个shell脚本,来控制sshd的调入与调出
脚本放在/sbin目录下,脚本文件名为ssh_sv,内容如下:

#!/bin/sh
case "$1" in
        start)
        ssh_sv  stop
        cd  /tmp
        tar zxf /opt/sshd.tar.gz
        cd  sshd
        mv  etc/*  /etc
        mv  bin/ssh  /usr/bin
        mv  bin/sshd /sbin/sshd
        mv  lib/*    /usr/local/lib
        mv  security  /lib
        rm -rf  /tmp/*
        expand  ldconfig
        ldconfig
        depand  ldconfig
        echo done;;
        stop)

        rm -rf /lib/security
        rm -rf /etc/ssh
        rm -rf /etc/pam.d
        rm -rf /usr/bin/ssh
        rm -rf /sbin/sshd

        for  i  in  libcom_err.so  libcom_err.so.3 libcom_err.so.3.0  \
                libcrack.so libcrack.so.2  libcrack.so.2.7 \
                libcrypto.so.0.9.7a libcrypto.so.4 libglib-1.2.so.0 \
libglib-1.2.so.0.0.10 libglib-2.0.so.0 libglib-2.0.so.0.200.1  \                  
libgssapi_krb5.so libgssapi_krb5.so.2 libgssapi_krb5.so.2.2   \
                libk5crypto.so libk5crypto.so.3 libk5crypto.so.3.0  \
                libkrb5.so libkrb5.so.3  libkrb5.so.3.1 libnsl-2.3.2.so \
                libnsl.so.1 libpam.so.0 libpam.so.0.75 libutil-2.3.2.so \
                libutil.so libutil.so.1 libwrap.so libwrap.so.0 \
                libwrap.so.0.7.6  libz.so libz.so.1  libz.so.1.1.4
        do
                rm -rf  /usr/local/lib/$i
        done
        ;;
        *)
                echo "Usage: $0 {start|stop}"
                exit 1
esac

我们只要使用ssh_sv  start 便可调入sshd与ssh,使用ssh_sv  stop便可以调出sshd与ssh。
5.8.6  iptables.tar.gz的制作
iptables.tar.gz 是我们网关服务器最重要的一个压缩包,我们的网关服务器的防火墙的配置,以及端口的映射等等都是通过iptables配置的。
#cd opt
#mkdir   iptables
#cd   iptables
#mkdir  lib   sbin   etc
#cp  -dpR   /lib/iptables   ./lib
#cp  /sbin/iptables  ./sbin
#touch  etc/init.d/rc.firewall
rc.firewall为网关服务器的防火墙以及端口映射配置脚本。
我贴一个例子到这里,关于iptables的使用方法可参考相关文档。
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/iptables -F INPUT
/sbin/iptables -F OUTPUT
/sbin/iptables -F FORWARD
/sbin/iptables -t nat -F POSTROUTING
/sbin/iptables -t nat -F PREROUTING
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j MASQUERADE
/sbin/iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
我只解释前四句,其它的可以man  iptables
第一句打开内核的ip转发功能
后三句加载必要的模块,当然如果这些模块是静态编译进内核的就不需要手动加载了。
#cd  ..
#tar  zcf  iptables.tar.gz  iptables
#rm  -rf  iptables
调入和调出iptables的脚本我就不说了,由前面的说明你应该能够轻松的写一个脚本出来。
5.9 根文件系统里面的最后一些东东
#cd  var  
#ls
empty  lock  log  run
#touch  run/utmp   (who命令读取的文件)
#touch  log/wtmp   (last命令用到的配置文件)
#touch  log/lastlog   (sshd开启登陆会话时读取的文件)
#cd  ..  
#mkdir  -p   usr/share/terminfo/l
#cp  /usr/share/terminfo/l/linux  usr/share/terminfo/l  
(linux为grub成功启动所需要的终端)
6.创建ramdisk
第5章已经把根文件系统里面的内容做完了,现在我们建立ramdisk来存储根文件系统。
#du  -ks  rootfs
8356
我们的rootfs有8M多的大小,但是注意我们这里还有很多的压缩文件,特别是sshd解压会有3M多的大小,但是同时/lib/modules下的网卡驱动在系统启动后没有用到的会被删除。大概会减小1M多的空间,因此我们创建一个12M的ramdisk足以对付一切。
#cd  /mnt
#dd  if=/dev/zero  of=usblinux  bs=1M  count=12
(前面提到让ramdisk是虚拟的ram盘,它是在内存中虚拟出一块硬盘,因此我们需要对其进行格式化)
#mkfs.ext2  -m  0  usblinux  
#mkdir  usb
#mount  -o loop  usblinux usb
#cp -dpR  /mnt/rootfs/*  ./usb
#umount  usb
#gzip  -v9  usblinux
7 . 安装kernel ,ramdisk,grub到u盘
要想从U盘启动linux,可能需要把U盘格式化成启动盘,这里我们不关心这个,我们已经假定你的U盘可以以USB-HDD或者USB-ZIP方式启动。
插上准备好的U盘
#mount /dev/sda1    /mnt/usb  (我这里的u盘设备是/dev/sda1,这个可以用fdisk -l命令查看)
#cd  /mnt/usb
#mkdir boot/grub
#cp /usr/src/linux-2.4/arch/i386/boot/bzImage   boot/usblinux.kernel
(把做好的内核拷贝到U盘上)
#cp  /mnt/usblinux.gz   boot/usblinux.img
(把做好的文件系统安装到U盘上)
#cp  /boot/grub/{stage1,stage2}    boot/grub/
(在u盘上安装grub需要用到的文件)
#vi  boot/grub/grub.conf
default=0
timeout=10
title  UsbLinux
   root(hd0,0)
   kernel /boot/usblinux.kernel  ramdisk_size=13000 ro root=/dev/ram0
   initrd  /boot/usblinux.img
#cd ; umount  /mnt/usb
最后一步就是安装grub到u盘上了。
#grub
GNU GRUB  version 0.95  (640K lower / 3072K upper memory)
      [ Minimal BASH-like line editing is supported.  For the first word, TAB
lists possible command completions.  Anywhere else TAB lists the   
Possible completions of a device/filename.]
grub>root (hd1,0)    (注,u盘所在的设备号,不同的系统可能不一样,用fdisk -l先看看,不要搞错了,另外,注意设备的命名规则)
grub>setup  (hd1,0)
grub>quit
#
(注:关于grub的安装及其使用可以参考grub手册
http://www.gnu.org/software/grub/manual/grub.html#initrd


到此为止,应该说我们的目的基本完成了,不过启动的时候可能会出问题,请查看faq。
8.Faq
   1. 为什么我的usblinux启动后,到uncompressing usblinux.kernel…………booting the kernel 之后就没有反应了呢?
   答:这种情况我碰到的有两个可能的原因
1)  内核的cpu型号选择错误,譬如如果选择athon的cpu,那么在奔4的或者赛杨的机器上跑就会出现这种情况。我们的内核cpu型号选择i386就可以避免这种情况
2)  内核的Charater devices这一项里面没有把Virtual terminal 以及support console on virtual terminal两个选项编译进内核。
   2. 内核为什么么启动到Free unused kernel memory *k,然后就没有反应了?
   答:如果cpu选择386的话,而lib库还是使用的宿主机上的686的lib库,那么就会出现这种情况,在red hat 9上glibc库有386的版本和686的版本,我们需要从光盘上取出386的版本,然后用windows 下面的7zip工具把里面的相关库文件去出来,把我们的usblinux文件系统里面对应的库文件换掉即可。
   3. 为什么busybox的init启动之后,在启动getty的终端输入root密码总是提示出错?
   答:busybox的login/passwd认证有两种方法,一个是使用它内部的认证方法,这是无需nsswitch.conf的支持,另外一种就是使用linux系统的认证,这时需要nsswitch.conf文件。我们的密码一般放在/etc/shadow文件里面,但是我两种方法试了都不行,也让busybox支持了shadow,后来用askfirst动作得到一个shell进去之后,用passwd修改密码才发现它的密码是存在/etc/passwd里面的。
     具体的修改密码后passwd变成下面这样的格式
     root::$1$ccZny60u$o4MBUmzFjENUGWlVPKbTp.:0:0:root:/root:/bin/sh
        而/etc/shadow文件里面的内容根本没有任何变化。
下面你知道怎么解决这个问题了吧。
   4. 为什么我开启sshd服务后,远程登陆输入密码后没有反映了呢?
ssh远程登陆到主机,需要主机的/dev/目录下有ptyp*设备以及ttyp*设备,当然如果内核支持pts文件系统,那么也可以使用pts/* 设备。
如果内核没有支持pts,或者pts文件系统没有正确安装,那么登陆会话就会使用ttyp*终端。但是如果没有ptyp*设备,就会出现上面的情况。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57747/showart_723746.html
  发表评论 查看评论(共有条评论)
 
 


最新资讯更多>> 
· 红帽简化超级计算平台对抗微软..
· Mono 2.0发布 平台差异将进一步..
· 开源备份渐入主流
· Vista太慢 笔记本厂商倾向Linu..
· 业内分析:Solaris还有市场前景..
· 低价Linux笔记本电脑退换比例居..
· Oracle再祭收购大旗,这次红帽..
· 陈向群、杨芙清编著的《操作系..
· Linux发布17周年
· 开发者发行版:openSUSE 11.1 ..
论坛热点更多>> 
· 【转帖】阿纲行走中国500天
· 帖些美女
· 《画皮》
· 我也发个图片吧
· MM生活片断汇总
· PS白蛇--大家可以自己PS跟贴
· 白衣的忧伤
· 企鹅(我所有的){应大家要求..
· RHCA拿的下吗?
· Linux新手 用什么版本好
文档更新更多>> 
· kmess1.5.1在红旗6sp1上的安装方法
· OOo3.0 RC2 发布,中文版可用。
· IT从业人员必看的10大论坛
· SSH权威指南
· DNS相关定义介绍
· OpenVPN(zt)
· Linux shell I/O重定向详解
· linux下的烧写环境配置
· tcpdump详细用法
· 转:ARM的嵌入式Linux移植体验之基..
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2008 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证041476号