基于宿主机制作微型linux

在宿主机上添加一个磁盘, 分区格式化该磁盘,把这个磁盘分为 3 个分区:根分区, swap 分区和内核所在的 boot 分区。
 [root@localhost ~]# fdisk /dev/sdb            # 分区新磁盘
  磁盘分区为如下所示:
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1                1          13      104391   83  Linux
/dev/sdb2              14          45      257040   82  Linux swap / Solaris
/dev/sdb3              46         168      987997+  83  Linux
格式化 sdb1 sdb3
[root@localhost ~]# mke2fs -j /dev/sdb1
[root@localhost ~]# mke2fs -j /dev/sdb3
格式化 sdb2
[root@localhost ~]# mkswap /dev/sdb2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
安装 grub
准备工作:把磁盘挂载到指定目录:
[root@localhost ~]# mkdir /mnt/{boot,sysroot}  # 准备两个挂载目录
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/   # 为微 linux 准备 boot
[root@localhost ~]# mount /dev/sdb3 /mnt/sysroot/    # 为微 linux 准备跟
  安装 grub
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb
注意:安装成功后, /dev/sdb 被识别成了 hd1
[root@localhost ~]# ls /mnt/boot/grub/   # 查看 grub 是否安装成功
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
准备内核和 initrd
[root@localhost ~]# cd /mnt/boot/       
[root@localhost boot]# cp /boot/vmlinuz- 2.6.18 -164.el5 ./vmlinuz
# 把宿主主机上的内核复制到 /mnt/boot 下,为微 linux 准备内核,并命名为 vmlinuz
 
initrd 的制作比较麻烦,最好切换到临时目录 /tmp 下制作,并新建一个目录,这里就把此新建目录命名为 linux
[root@localhost boot]# cd /tmp/
[root@localhost tmp]# mkdir linux
开始制作 initrd
[root@localhost tmp]# cd linux /
[root@localhost linux]# zcat /boot/initrd- 2.6.18 -164.el5.img | cpio �Cid
# 把宿主主机上的 initrd 复制并展开到当前 目录下
编辑当前目录下的 init 文件把文件后面的一行 mkrootdev -t ext3 -o defaults,ro /dev/vol0/root 改为 mkrootdev -t ext3 -o defaults,ro /dev/sda3
注释:当 sdb 这个磁盘被放到微 linux 当做系统磁盘使用时,它就是 sda
[root@localhost linux]# find . | cpio -o -H newc --quiet | gzip -9 > /mnt/boot/initrd.gz  # 封装并强力压缩当前所有然后把它输送到 /mnt/boot/
好了,准备好了 grub ,内核和 initrd ,就可以把小磁盘放到微 linux 上实现启动了,不过要编辑 grub 的配置文件使它实现自动启动。
准备 grub 的配置文件:
[root@localhost linux]# cd /mnt/boot/  # 切换到 boot 目录
[root@localhost boot]# vim grub/grub.conf
default=0                # 指定默认启动内核
timeout=3                # 设定等待时间
title lhf_linux               # 命名
        root (hd0,0)              # 指定 root
        kernel /vmlinuz ro root=/dev/sda3 quiet   # 指定内核
        initrd /initrd.gz             # 指定 initrd
此时如果启动微 linux ,虽然能够启动成功,但不能执行任何除了系统自带的命令,接下来。为微 linux 准备一些系统常用目录。
[root@localhost boot]# cd /mnt/sysroot/
[root@localhost sysroot]# mkdir -pv ./{etc/rc.d,bin,sbin,dev,usr,home,root,lib,proc, sys,mnt,media,var,tmp,opt}
++++++++++++++++++++++++++++++++++++++++++++++++++++++
准备配置文件 /etc/inittab,/etc/rc.d/rc.sysinit
[root@localhost sysroot]# cd etc/
[root@localhost etc]# vim inittab
id:3:initdefault:            # 指定默认启动级别
si::sysinit:/etc/rc.d/rc.sysinit        # 系统初始化
l0:0:wait:/etc/rc.d/rc.sysdone      # 当进入级别 0 时,执行关机脚本
1:2345:respawn:/sbin/mingetty tty1   # 启动 6 个虚拟终端
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
注意:启动虚拟终端需要 mingetty 命令,在下面复制命令时不要忘记添加
准备系统初始化文件:
[root@localhost etc]# vim rc.d/rc.sysinit
#!/bin/bash
#
echo -e "\tWelcome to lhf_linux"
echo "insert pcnet32 module..."   # 模块初始化
insmod /lib/modules/mii.ko    # 载入 mii 模块,它被 pcnet32 模块所依赖
insmod /lib/modules/pcnet32.ko      # 载入网卡的驱动模块并指定模块存放路径
ifconfig lo 127.0.0.1/8      # 设定本地回环地址
[root@localhost etc]# chmod +x rc.d/rc.sysinit  # 给此文件一个执行权限
接下来需要复制 pcnet32 的模块,而 pcnet32 模块又依赖于 mii 模块,所以都要复制过来。
[root@localhost etc]# modinfo pcnet32   # 查看此模块的详细信息,包括路径和所依赖的模块
复制之前,新建一个目录:
[root@localhost sysroot]# mkdir lib/modules
复制 pcnet32 模块和它所依赖的 mii 模块:
[root@localhost sysroot]# cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/mii.ko lib/modules/
[root@localhost sysroot]# cp /lib/modules/ 2.6.18 -164.el5/kernel/drivers/net/pcnet32.ko lib/modules/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
接下来就需要复制各种常用的命令和文件了:
对于一些常用的命令的使用,如: init,bash,insert,ifconfig,ping,mount,ls,vim,hostname,halt,reboot,sync,sleep,mingetty ,,它们各自依赖于不止一个的库文件,所以,把命令复制响应的目录下后,还需把它所需的库文件全部复制过来。“ which command ”命令查看 command 所在位置,然后把它复制到微 linux 的响应位置;“ ldd command 命令可以查看这个命令所依赖的库文件。例如:
[root@localhost sysroot]# which ls             # 查看 ls 命令所在位置
alias ls='ls --color=tty'       # 输出的别名信息
      /bin/ls                 # 显示 ls 命令所在位置
[root@localhost sysroot]# cp /bin/ls bin/   # 把宿主机上的 ls 复制到微 linux
但是此时 ls 命令不能用,还需复制它所依赖的库文件。
[root@localhost sysroot]# ldd /bin/ls  # 查看 ls 命令所依赖的库文件
      linux-gate.so.1 =>  (0x0027f000)
      librt.so.1 => /lib/librt.so.1 (0x00c71000)
      libacl.so.1 => /lib/libacl.so.1 (0x00c7c000)
      libselinux.so.1 => /lib/libselinux.so.1 (0x00818000)
      libc.so.6 => /lib/libc.so.6 (0x00ae1000)
      libpthread.so.0 => /lib/libpthread.so.0 (0x00c58000)
      /lib/ld-linux.so.2 (0x00abe000)
      libattr.so.1 => /lib/libattr.so.1 (0x008d8000)
      libdl.so.2 => /lib/libdl.so.2 (0x00c29000)
      libsepol.so.1 => /lib/libsepol.so.1 (0x00832000)
上面输出的所有库文件都要复制到微 linux 上,例如:
[root@localhost sysroot]# cp /lib/librt.so.1 lib/
显然这样做的速度会很慢,下面就提供了一个脚本,脚本执行时,它会提示你输入你想要复制的命令,它会把命令及其所依赖的库文件复制到相应路径下,当输入“ q “时则退出脚本执行,脚本内容如下:
#!/bin/bash
#
function BCP {
  TARGET=/mnt/sysroot
 
  COMMAND=`which $1 | grep -o "/.*"`
  CMDPATH=${COMMAND%/*}
 
  [ -d $TARGET$CMDPATH ] || mkdir -p $TARGET$CMDPATH
  [ -e $TARGET$COMMAND ] || cp $COMMAND $TARGET$CMDPATH
 
  for LIBFILE in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`; do
    LIBPATH=${LIBFILE%/*}
    [ -d $TARGET$LIBPATH ] || mkdir -p $TARGET$LIBPATH
    [ -e $TARGET$LIBFILE ] || cp $LIBFILE $TARGET$LIBPATH
  done
}
 
while true; do
  read -p "A Command: " MYCMD
  case $MYCMD in
  q|Q)
     echo "Quit..."
     exit 0
     ;;
  *)
    ! which $MYCMD &> /dev/null && echo "Wrong command..." && continue
    BCP $MYCMD
    ;;
  esac
done
执行脚本如下:
[root@localhost sysroot]# bash bcp.sh
A Command: vim
A Command: hostname
A Command: reboot
A Command: q
Quit...
[root@localhost sysroot]#sync        # 使同步生效
编辑关键脚本:
[root@localhost sysroot]# vim etc/rc.d/rc.sysdone   # 命名为 rc.sysdone
#!/bin/bash            
#
sync             # 执行同步命令
sleep 3                                    # 睡眠 3 秒钟       
sync
exec /sbin/halt �Cp             # 执行关闭电源命令
[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysdone  # 给此脚本一个执行权限
多次执行 sync 命令,注意一定要在宿主机的根目录下执行同步命令,如下:
[root@localhost ~]# sync
新建一个虚拟机,让它使用一个已存在的磁盘,也就是刚才准备的宿主机上的 sdb, 。启动测试。
 
 

本文出自 “小李的学习之旅” 博客,谢绝转载!

你可能感兴趣的:(linux,职场,制作,休闲,微型)