当前位置 : 主页 > 操作系统 > centos >

制作微型linux

来源:互联网 收集:自由互联 发布时间:2022-06-20
----更新:一个脚本可以一键制作这个小Linux,功能没有写的那么多,基本的开机可以了,见附件mklinux---- 先简述一下开机原理: 机器加电--bios读取cmos设定--把控制权交给第一个开机装置

----更新:一个脚本可以一键制作这个小Linux,功能没有写的那么多,基本的开机可以了,见附件mklinux----

 

先简述一下开机原理:

机器加电--bios读取cmos设定--把控制权交给第一个开机装置MBR,如如果第一个开机装置MBR中没有bootloader则交给第二个,依次类推--MBR中的bootloader程序根据在硬盘中的设置读取内核与一个叫initrd的虚拟文件系统,因为现在的硬盘大都是SATA与SCSI的,内核中不集成这个驱动,通过加载Initrd这个虚拟的文件系统来加载SCSI的驱动,又有同学问了:为什么不把驱动做到内核中呢?这个是因为SCSI的驱动很多,做进去内核会很臃肿--毕竟是虚拟的文件系统,所以要切换到真实的文件系统上来,内核来完成根切换--完成根切换后内核把控制权交给init程序--init读取/etc/inittab它的配置文件,根据配置文件完成初始化。通过看配置文件我们可知inittab完成这些工作1.默认开机级别 2.调用/etc/rc.d/rc.sysinit完成环境初始化 3.根据默认的开机级别启动不同的服务脚本 /etc/rc.d/rc 这个脚本完成的任务 4.设定Ctrl+Alt+Del键的作用 5.设定电源UPS管理 6.调用/sbin/mingetty启动6个终端 。6.如果是5级别的话启动图形界面。OK  下面再来说说rc.sysinit完成的工作:1.初始化网络,设定主机名 2.启动SELinux 3.加密装置 4.设置系统时钟 5.加载驱动 6.启动软raid与LVM 7.启用quota 8.可写方式重新挂载/ 9.启动日志     基本原理就是这样的

下面在vmware上来制作一个微型的Linux系统,能基于passwd认证,网络可用,iptables可用,ssh可用,vi可用,其它的都舍去了,其实它就是一个tiny防火墙。

环境:vmware8.0  redhat5.8(宿主机) 内核2.6

一.为宿主机添加一块2G大小scsi硬盘,开机。

这个我就不演示了。

二.在新建的硬盘上建立系统

1.对新建的硬盘分区

  • fdisk /dev/sdb              ##这个是新加的那个硬盘 
  • +50M                         ##新建一个分区为/boot分区 
  • [回车] 
  • +1G                          ##新建一个分区为/分区 
  • w                              ##保存 
  • # partprobe /dev/sdb    ##不用重启机器,立马分区生效 
  • # mke2fs –j /dev/sdb1 
  • # mke2fs –j /dev/sdb2  ##格式化两个分区 
  • # mkdir –pv /mnt/{boot,sysroot}   ##建立两个目录,用于挂载sdb1,sdb2 
  • # mount /dev/sdb1 /mnt/boot  
  • # mount /dev/sdb2 /mnt/sysroot    ##挂载它们   
  • 2.提供内核

  • # cp /boot/vmlinuz-`uname -r` /mnt/boot/vmlinuz-tiny    ##用宿主机的内核 
  • 3.提供Initrd这个用于切换根分区的文件,这个文件不同系统是不一样的,下面我们修改原来的。

  • # cp /boot/initrd-`uname -r`.img /tmp/initrd.gz 
  • # cd /tmp 
  • # gzip –d initrd.gz     ##解压后type initrd可知为cpio压缩的,下面用cpio解压 
  • # mkdir init 
  • # cd init 
  • # cpio –ivcdu < ../initrd     ##cpio解压 
  • # vi init     ##编辑它 
  • #resume LABEL=SWAP-sda3   ##注释这个swap分区,因为我们没有启用swap 
  •  
  • mkrootdev -t ext3 -o defaults,ro /dev/sda2    ##把我们新建的第二个分区将来当作根分区,看好是sda2
  • ##因为把这个磁盘放到新机器上它就是sda2 
  • 保存,退出

  • # find . | cpio –ovcB | gzip –9 > /mnt/boot/initrd-tiny 
  • 3.为磁盘安装grub,分两个步骤,先安装/boot/grub这个配置部分,再安装MBR中的程序部分

  • # grub-install –root-directory=/mnt /dev/sdb    ##程序会到/mnt下找boot目录,在boot下生成grub的配置目录,
  • ##/dev/sdb代表安装到MBR中 
  •  
  • # ls /mnt/boot 查看是否生成了grub目录 ,如果有则继续 
  • # grub 
  • >root (hd1,0)/         ##输入 root (hd1,0)/ 按TAB查看有没有刚才拷贝的vmlinuz-tiny,有的话继续 
  • >setup (hd2)           ##安装到MBR中 
  • 为grub建立配置文件/mnt/boot/grub/grub.conf 
  • # vi /mnt/boot/grub/grub.conf 
  •  
  • default=0 
  • timeout=3 
  • title A Tiny Linux  
  •     root (hd0,0) 
  •     kernel /vmlinuz-tiny 
  •     initrd /initrd-tiny 
  • 到此grub安装完毕

    4.在/mnt/sysroot 下建立必备的目录

  • # mkdir -pv /mnt/sysroot/{root,sbin,bin,usr/{lib,sbin,bin},etc/rc.d,var,\
  • proc,sys,tmp,dev,lib,home} 
  • 5.移植init这个程序到/mnt/sysroot下

  • # which init    #可知Init在/sbin/下 
  • # ldd /sbin/init 查看依赖的库文件  
  • 把init与下面显示的库文件复制到相对应的位置

  • # cp /sbin/init /mnt/sysroot/sbin/init 
  • # cp /lib/libsepol.so.1 /mnt/sysroot/lib 
  • # cp /lib/libselinux.so.1 /mnt/sysroot/lib 
  • # cp lib/libc.so.6  /mnt/sysroot/lib 
  • # cp /lib/libdl.so.2 /mnt/sysroot/lib 
  • # cp /lib/ld-linux.so.2 /mnt/sysroot/lib  
  • 6.以同样方式移植bash,方法同上,我就不写了

    7.有了这两个程序,在添加如下配置文件系统就可以启动了

  • # vi /mnt/sysroot/etc/inittab 
  •  
  • id:3:initdefault: 
  • si::sysinit:/etc/rc.d/rc.sysinit 
  • # vi /etc/rc.d/rc.sysinit 
  •  
  • #!/bin/bash 
  • export PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  • echo "Welcome to Tiny Linux" 
  • /bin/bash 
  • chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit 
  • 到此系统基本可以启动了,下面测试

    休眠宿主机,新建虚拟机,选择磁盘时选已存在的磁盘,用刚才的磁盘

    测试能否启动到bash,如果能则继续

    三.添加一些命令,并支持密码认证,hostname,并支持网络

    你是否发现copy命令与库时很麻烦,下面提供个脚本cp.sh,用来copy命令与库的,关闭tinylinux,打开宿主机继续吧

  • # vi cp.sh 
  •  
  • function cpbin { 
  •         if which $1 &> /dev/null; then 
  •                  local binpath=$(which --skip-alias $1)  
  •         else 
  •                  return 10 
  •         fi   
  •         if [ ! -d /mnt/sysroot${binpath%/*} ];then 
  •                  mkdir -p /mnt/sysroot${binpath%/*} 
  •         fi   
  •         if [ ! -e /mnt/sysroot/$binpath ];then 
  •                 cp $binpath /mnt/sysroot/$binpath 
  •         else 
  •                 return 11 
  •         fi   
  •  
  • function cplib { 
  •         if which $1 &>/dev/null;then 
  •                 local binpath=$(which --skip-alias $1) 
  •         else 
  •                 return 10 
  •         fi   
  •         modules=$(ldd $binpath | grep -o '[^[:space:]]*/lib/[^[:space:]]\+') 
  •         for I in $modules 
  •         do   
  •                 [ ! -e /mnt/sysroot$I ]&& cp $I /mnt/sysroot/$I 
  •         done 
  • while : ;do 
  •         read -p "A command (q to exit): " cmd 
  •         if [ $cmd != "q" ];then 
  •                 stat
  •                 cpbin $cmd 
  •                 stat=$? 
  •                 if [ $stat == "10" ] ;then 
  •                         echo "No such Command" 
  •                 elif [ $stat == "11" ];then 
  •                         echo "$cmd have been existed " 
  •                 else 
  •                         cplib $cmd 
  •                 fi 
  •         else 
  •                break; 
  •         fi 
  • done 
  • 给个执行权限,就拷贝需要的命令吧!!

    1.拷贝 ls mv cat cp ifconfig ping vi iptables mingetty login depmod modprobe hostname mount shudown reboot sync halt poweroff

  • # sh cp.sh 输入以上命令即可 
  • 2.修改/mnt/sysroot/etc/inittab 如下 

  • id:3:initdefault: 
  • si::sysinit:/etc/rc.d/rc.sysinit 
  • 1:2345:respawn:/sbin/mingetty tty1        ##就添加了几个虚拟终端 
  • 2:2345:respawn:/sbin/mingetty tty2 
  • 3:2345:respawn:/sbin/mingetty tty3 
  • init 调用mingetty来启动虚拟终端,mingetty会调用login来让用户登陆,而login会调用pam接口来认证用户的账号密码,pam对这个tinylinux来说,显的太大了,于是我们用修改过的login程序直接调用/etc/passwd /etc/shadow 来认证吧,上面移植那个login是为了库文件,修改过的login在附件中

    4.下载login,copy到/mnt/sysroot/bin下,并给执行权限

  • # chmod +x /mnt/syroot/bin/login 
  • 5.建立/etc/passwd /etc/shadow  /etc/group ,直接用系统上的吧

  • # grep ^root /etc/passwd > /mnt/sysroot/etc/passwd 
  • # grep ^root /etc/group > /mnt/sysroot/etc/group 
  • # grep ^root /etc/shadow > /mnt/sysroot/etc/shadow 
  • # chmod 400 /mnt/sysroot/etc/shadow 
  • 或许你以为认证应该完了,其实login会调用/lib/libnss开头的库文件,把它们与它们的配置文件/etc/nsswitch.conf 移植过去

  • # cp /etc/nsswitch.conf /mnt/sysroot/etc/ 
  • # cp /lib/libnss* /mnt/sysroot/lib/ 
  • 6.一般内核编译时网卡驱动被编译成模块,比如vmware需要的pcnet32模块,所以我们要移植过去,当然还有它依赖的mii模块。iptables需要的模块有很多,我们不可能一个个的加载. # find /lib/modules/2.6.18-308.el5/kernel/ | grep netfilter  发现netfilter的模块的主要目录,移植过去。

  • # modinfo pcnet32    ##查看pcnet32的位置,及依赖模块 
  • # modinfo mii    ##查看mii的位置,没有依赖任何模块 
  • 移植它们

  • # mkdir -pv /mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ipv4 
  •  
  • # cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko \
  • /mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ 
  •  
  • # cp  /lib/modules/2.6.18-308.el5/kernel/drivers/net/mii.ko \
  • /mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ 
  •  
  • # cp /lib/modules/2.6.18-308.el5/kernel/net/netfilter/   \
  • /mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ 
  •  
  • # cp /lib/modules/2.6.18-308.el5/kernel/net/ipv4/netfilter/ \
  • /mnt/sysroot/lib/modules/2.6.18-308.el5/kernel/drivers/net/ipv4/ 
  • # chroot /mnt/sysroot/ 
  • # depmod              ##生成依赖关系以便modprobe加载 
  • iptables 依赖/lib/iptables 下的模块,移植过去

  • # cp /lib/iptables /mnt/sysroot/lib/ 
  • 7.修改/mnt/sysroot/etc/rc.d/rc.sysinit,如下

  • #!/bin/bash 
  •  
  • export PATH=/bin:/sbin:/usr/bin:/usr/sbin 
  • echo "Welcome to Tiny Linux" 
  • modprobe pcnet32 
  • modprobe iptable_filter 
  • modprobe iptable_nat 
  • mount -o rw / 
  • ifconfig eth0 172.16.1.2/16 
  • hostname www.laoguang.me 
  • export PS1='[\u@\h \W]\$' 
  • 休眠宿主机,启动tinylinx,哇,需要验证了,输入你宿主机root的账号密码,登陆成功,这时ifconfig 你会发现eth0有ip了,世界立马美好了好多。

    8.移植/etc/sysctl.conf 并修改ip_forward的值

  • # cp /etc/sysctl.conf /mnt/sysroot/etc/ 
  • # vi /mnt/sysroot/etc/sysctl.conf 
  •  
  • net.ipv4.ip_forward = 1 
  • 开机测试

  • # iptables -A INPUT -p icmp -j DROP  
  • ping 一下别的主机测试

    头疼,移植Dropbear实现ssh有空再写。。。。。。。。

    网友评论