usblinux  把linux系统安装到u盘里


加电
BIOS    找启动方式,找设备
MBR
grub
vmlinux  initrd
产生init
/etc/inittab -->找到应该启动的级别
按照不同的级别启动不同类型的服务   /etc/rcX.d/
/etc/rc.sysinit
/etc/rc.local
产生终端  可以登录


ls /root/install.log


 livecd   不用安装,直接可以使用系统的CD,DVD

 

回顾开机启动的过程:

开机-->bios(配置主板的程序,basic input and output system,加电自检,找到启动设备的编号)-->找到mbr(master bootloader record,它是属于硬盘的0磁盘0扇区)-->grub-->通过grub找到vmlinuz和initrd(驱动硬件)--> 内核启动,产生init进程-->/etc/inittab(确定系统的启动级别)-->/etc/rc.sysinit(获取主机的网络环境和主机类型,测试与载入设备,是否启动selinux,模块的加载,设置系统时间.................)-->/etc/rc.local


与USB有关的模块
[root@li ~]# lsmod  |grep ci
uhci_hcd               25421  0
ohci_hcd               24553  0
ehci_hcd               33869  0


--因为U盘分区在windows下不认,所以我这里两G的U盘,直接都用来做usblinux

 

1,首先删除U盘里原有分区


第一种:用fdisk /dev/sdb,然后用d命令去删除

第二种:dd if=/dev/zero of=/dev/sdb   bs=1024  count=1  --删除磁盘分区信息


重新按照规划的去分区:
Disk /dev/sdb: 2000 MB, 2000570368 bytes
62 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 3844 * 512 = 1968128 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1  *            1         763     1466455   83  Linux
/dev/sdb2             764        1016      486266   82  Linux swap / Solaris

Command (m for help): w

--或者分为1G做usblinux,500m做swap,500m留给fat32
Disk /dev/sdb: 2000 MB, 2000570368 bytes
62 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 3844 * 512 = 1968128 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1         509      978267   83  Linux
/dev/sdb2             510         764      490110   82  Linux swap / Solaris
/dev/sdb3             765        1016      484344    b  W95 FAT32


Command (m for help): w


[root@li ~]# partprobe

--有些U盘报kerenl相关的两到三段信息,就不要使用多分区,就分一个分区。

 

2,格式化分区,并挂载


[root@li www]# partprobe   --fdisk分区后,都要用此命令刷新

--这一步,有很多U盘会报错,如果报错的话最好去windows虚拟机下全格一下,再重新在linux下来做  


[root@li www]# mkfs -t ext3 /dev/sdb1
[root@li www]# mkswap /dev/sdb2


[root@li www]# mkdir /usb 
[root@li www]# mount /dev/sdb1 /usb/  --建立一个目录,挂载/dev/sdb1

 

3,安装基本的目录结构

准备光盘iso文件,挂载到一个目录去
[root@li www]# mount /share/iso/rhel-5.4-server-i386-dvd.iso /yum/ -o loop

[root@li www]# cd /yum/Server/

[root@li Server]# rpm -qip filesystem-2.4.0-2.i386.rpm
Description :
filesystem 软件包是安装在红帽 Linux 系统上的一个基本
软件包。filesystem 含有一个 Linux 操作系统的基本目录布局,
包括各目录的正确许可权限。


要使用--nodeps脱离依赖性才可以安装
[root@li Server]# rpm -ivh --root=/usb/ --nodeps filesystem-2.4.0-2.i386.rpm

或者先装setup包,再装filesystem包
[root@li ~]# rpm -ivh --root=/usb /share/yum/Server/setup-2.5.58-7.el5.noarch.rpm
[root@li ~]# rpm -ivh --root=/usb /share/yum/Server/filesystem-2.4.0-2.i386.rpm

 

[root@li ~]# ls /usb --一个基本的目录布局就已经装好了
bin   etc   lost+found  opt   sbin     sys  var
boot  home  media       proc  selinux  tmp
dev   lib   mnt         root  srv      usr

 

4,安装相应的软件包,也就是定制功能

下面最主要的一步就是安装系统的软件包,首先要思考安装的这个USB系统需要什么功能,比如最基本的命令ls,cd等


这里可以选择使用busybox(是一个基本命令工具集),但如果对其不是特别熟悉,还是按基本命令一个一个的来选


首先要装bash包,包含50多个内部命令
[root@dns Server]# chroot /usb     --不装bash无法 chroot进去
chroot: cannot run command `/bin/bash': No such file or directory


[root@dns Server]# rpm -qf /bin/ls
coreutils-5.97-23.el5

[root@dns Server]# rpm -qf `which vi`
vim-minimal-7.0.109-6.el5

[root@dns Server]# rpm -qf `which vim`
vim-enhanced-7.0.109-6.el5

[root@dns Server]# rpm -qf `which ping`
iputils-20020927-46.el5

[root@dns Server]# rpm -qf `which mount`
util-linux-2.13-0.52.el5

[root@dns Server]# rpm -qf `which tar`
tar-1.15.1-23.0.1.el5

[root@dns Server]# rpm -qf `which rpm`
rpm-4.4.2.3-18.el5

[root@dns Server]# rpm -qf `which man`
man-1.6d-1.1

[root@dns Server]# rpm -qf `which ssh`
openssh-clients-4.3p2-36.el5

[root@dns Server]# rpm -qf `which awk`
gawk-3.1.5-14.el5

[root@dns Server]# rpm -qf `which sed`
sed-4.1.5-5.fc6

[root@dns Server]# rpm -qf `which grep`
grep-2.5.1-55.el5

[root@dns Server]# rpm -qf `which find`
findutils-4.2.27-6.el5

[root@dns Server]# rpm -qf `which locate`
mlocate-0.15-1.el5.2

[root@dns Server]# rpm -qf `which useradd`
shadow-utils-4.0.17-14.el5


[root@dns Server]# rpm -qf `which passwd`
passwd-0.73-1

[root@dns Server]# rpm -qf `which init`
SysVinit-2.86-15.el5

[root@dns Server]# rpm -qf `which clear`
ncurses-5.5-24.20060715

[root@dns Server]# rpm -qf `which ps`
procps-3.2.7-11.1.el5

[root@dns Server]# rpm -qf /usr/bin/which
which-2.16-7

[root@dns Server]# rpm -qf `which ifconfig`
net-tools-1.60-78.el5

[root@dns Server]# rpm -qf `which fdisk`
util-linux-2.13-0.52.el5

[root@dns Server]# rpm -qf `which partprobe`
parted-1.8.1-23.el5


[root@li ~]# rpm -qf `which showmount`
nfs-utils-1.0.9-42.el5

[root@li ~]# rpm -qf `which service`
initscripts-8.45.30-2.el5

[root@li Server]# rpm -qf `which bzip2`
bzip2-1.0.3-4.el5_2

[root@li Server]# rpm -qf `which gzip`
gzip-1.3.5-10.el5

 


--经过上面对基本命令的包查找,最终安装下列这些基本包
[root@dns Server]# yum install --installroot=/usb  bash coreutils vim-minimal vim-enhanced iputils util-linux tar rpm man openssh-clients gawk sed  grep findutils mlocate  shadow-utils passwd  SysVinit ncurses procps which net-tools util-linux parted nfs-utils initscripts bzip2 gzip

 

--如果上面步骤安装完后,有忘记安装的包,再使用yum装不上去
[root@li ~]# yum install --installroot=/usb iptables
Loaded plugins: downloadonly, rhnplugin, security
This system is not registered with RHN.
RHN support will be disabled.
Setting up Install Process
No package iptables available.
Nothing to do


--所以再安装的话使用rpm去安装
[root@li ~]# rpm -ivh --root=/usb /share/yum/Server/iptables-1.3.5-5.3.el5.i386.rpm

 


5,安装启动引导文件和模块


[root@li Server]# chroot /usb    --使用此命令,就是以/usb目录为根目录了

bash-3.2# ls /boot/   --可以看到现在usblinux里的/boot目录没有任何文件

bash-3.2# exit    --用exit退出chroot模式
exit

[root@li ~]# cp /etc/skel/.bash* /usb/root/  -rf
--拷环境变量模版过去


定制支持usb存储启动的ramdisk(initrd文件)
[root@li Server]# mkinitrd --with usb_storage /usb/boot/initrd.img `uname -r`

从真机上拷贝vmlinuz到usblinux对应目录
[root@li Server]# cp /boot/vmlinuz-2.6.18-164.el5 /usb/boot/vmlinuz

从真机上拷贝内核模块到usblinux对应目录
[root@li Server]# cp /lib/modules/2.6.18-164.el5/ /usb/lib/modules/   -rf


拷内核源码,可选步骤
[root@li Server]# mkdir /usb/usr/src/kernels/
[root@dns Server]# cp /usr/src/kernels/2.6.18-164.el5-i686/   /usb/usr/src/kernels/ -rf

 

 

6,安装并手动写grub  
--如果是用真实机分区来代替U盘做usblinux的话,这一步不用做,只需要把这个分区的引导信息加入到真实机的配置文件里就可以了


安装grub包,用--nodeps脱离依赖性
[root@li Server]# rpm -ivh --nodeps --root=/usb grub-0.97-13.5.i386.rpm

--脱离依赖安装,会没有splash.xpm.gz图片,可以从真机拷一个


也可以按下面安装
[root@li ~]# rpm -ivh --root=/usb /share/yum/Server/*logos*
warning: /share/yum/Server/redhat-logos-4.9.16-1.noarch.rpm
[root@li ~]# rpm -ivh --root=/usb /share/yum/Server/grub-0.97-13.5.i386.rpm


--但这样安装完后,grub目录下只有一个背景图片

[root@dns Server]# ls /usb/boot/grub/
splash.xpm.gz

 

grub-install安装到/dev/sdb
[root@li Server]# grub-install --root-directory=/usb --recheck /dev/sdb

--如果是用真实机分区来做的话,这里/dev/sdb改成/dev/sda


--grub-install之后,grub目录的基本文件就有了(除了配置文件grub.conf)
[root@dns Server]# ls /usb/boot/grub/
device.map     iso9660_stage1_5   splash.xpm.gz  vstafs_stage1_5
e2fs_stage1_5  jfs_stage1_5       stage1         xfs_stage1_5
fat_stage1_5   minix_stage1_5     stage2
ffs_stage1_5   reiserfs_stage1_5  ufs2_stage1_5


修改device.map
[root@li Server]# vim /usb/boot/grub/device.map
  (hd0)   /dev/sdb

--如果是用真实机分区来做的话,这里/dev/sdb改成/dev/sda

 


手动写grub.conf文件
--下面是以u盘来做的写法
[root@li Server]# vim /usb/boot/grub/grub.conf

default=0
timeout=-1

splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz

title   usblinux
        root (hd0,0)
        kernel /boot/vmlinuz ro root=/dev/sdb1
        initrd /boot/initrd.img

 

=============================================

 

--因为我这次是使用真实机的/dev/sda14来做根./dev/sda15做swap

上面的第6步不用做,只做这一小段就好了


所以把下面这段加到真实机的/boot/grub/grub.conf里

title   usblinux
        root (hd0,13)  --因为我模拟的这个usblinux的根为sda14,所以这里写13
        kernel /boot/vmlinuz ro root=/dev/sda14
        initrd /boot/initrd.img

 

# grub-install /dev/sda  --加完后,就grub-install安装一下


--------------------------------------------------


7,拷贝密码文件,拷贝环境变量

--这一步可以不拷,因为现在usblinux上默认有passwd和group文件,没有shadow和gshadow
--里面默认有root用户和系统用户
[root@li Server]# cp /etc/passwd   /usb/etc/passwd

[root@li Server]# chroot /usb/   --再次chroot到/usb目录,提示符就变了


[root@li /]# pwconv   --同步/etc/passwd和/etc/shadow
[root@li /]# grpconv  --同步/etc/group和/etc/gshadow
[root@li /]# passwd root   --修改root的密码,到时候登录需要

 

8,手动编写fstab文件

[root@li /]# vim /etc/fstab    --注意这里是usblinux系统里的fstab,因为已经chroot进来了

/dev/sdb1               /                       ext3  defaults  0 0
/dev/sdb2               swap                    swap  defaults  0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0


--用真实机的/dev/sda14来做根./dev/sda15做swap的话,就把上面的sdb1换成sda14,sdb2换成sda15,其它的不变

 

9,让usblinux支持网络

从真机拷贝eth0的配置文件到usblinux对应目录中:

[root@li Server]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /usb/etc/sysconfig/network-scripts/

修改网络配置文件,可以改成静态IP
[root@li Server]# vim /usb/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

从真机拷贝全局网络配置文件到usblinux对应目录中
[root@li Server]# cp /etc/sysconfig/network /usb/etc/sysconfig/


从真机拷贝modprobe.conf到usblinux对应目录中
[root@li Server]# cp /etc/modprobe.conf /usb/etc/
  alias eth0 8139too  --注意这一句在不同的系统里可能要修改,现在这里的网卡模块是8139too,所以这里是8139too就可以;这个在虚拟机里为pcnet32

 

然后重启系统,在bios选择使用usb引导进入系统,去验证功能


--如果是真实机分区做的,就不用改bios,直接在grub选择菜单选择usblinux引导进入就可以了

-------------------------------------------------------------

 

上面的步骤里还没有去加的功能有  动态获取IP   (需要安装dhclient包)
 没有yum命令,没有图形界面 (有需要的话,自己使用rpm安装yum命令后,使用yum安装图形包的两个组)


启动时有大量无用信息, 可以在grub.conf里加rhgb quiet来解决

但重启后还会有一个错误信息:
(会有一个usb_storage的报错信息,但此信息没有影响,是mkinitrd --with usb_storage时造成的)

如果一定要除掉这句报错,可以手工修改initrd文件

# cd /tmp
# cp /usb/boot/initrd.img /tmp/initrd.img.gz
# gunzip initrd.img.gz
# cpio -i --make-directories < initrd.img
# rm initrd.img
# vim init    --打开,删除以下的几行
 echo "loading usb-storage.ko module"
 insmod /lib/usb-storage.ko
 echo waiting for dirver initialization
 stabilized /proc/bus/usb/devices
 echo waiting for driver initializtin

# find . | cpio -c -o > ../initrd.img
# gzip -9 ../initrd.img
# cp ../initrd.mg.gz /usb/boot/initrd.img