Chinaunix首页 | 论坛 | 博客
  • 博客访问: 333294
  • 博文数量: 106
  • 博客积分: 1115
  • 博客等级: 少尉
  • 技术积分: 806
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-04 08:06
文章分类

全部博文(106)

文章存档

2015年(4)

2014年(48)

2013年(15)

2012年(38)

2011年(1)

我的朋友

分类: LINUX

2012-01-21 14:47:01

打造自己的专属Linux(二)的链接http://blog.csdn.net/deansrk/article/details/6664558
      跟着马哥学Linux已经快一个月了,在前几天创建一个小型Linux,大小不足10M,萌生了一个想法:DIY一个自己的Linux,所以准备写一个 系列篇,通过宿主机的方式,一步一步创建一个小型Linux,并慢慢增加它的功能模块:网络,服务,ssh,图形界面等等~如果你有兴趣,那么我们一起来 学习吧!
如果你对linux的启动流程不熟悉的话可以读我的文章:
深入浅出:linux启动流程刨析    http://blog.csdn.net/deansrk/article/details/6659421


我的linux版本:redhat 5.4
虚拟机客户端:Vmware Workstation 6.5
我们分步骤来实现这个小型linux

第一步:在虚拟机上添加一块新硬盘到linux,大小20G (可以自定)



第二步:1)打开终端,使用fdisk格式化分区刚才挂载的新硬盘/dev/sdb,划分出一个50M大小的主分区和一个512M大小的主分区。
  1. [root@server69 ~]# fdisk /dev/sdb  
  2. The number of cylinders for this disk is set to 2610.  
  3. There is nothing wrong with that, but this is larger than 1024,  
  4. and could in certain setups cause problems with:  
  5. 1) software that runs at boot time (e.g., old versions of LILO)  
  6. 2) booting and partitioning software from other OSs  
  7.    (e.g., DOS FDISK, OS/2 FDISK)  
  8.   
  9. Command (m for help): p  
  10.   
  11. Disk /dev/sdb: 21.4 GB, 21474836480 bytes  
  12. 255 heads, 63 sectors/track, 2610 cylinders  
  13. Units = cylinders of 16065 * 512 = 8225280 bytes  
  14.   
  15.   
  16.    Device Boot      Start         End      Blocks   Id  System  
  17. /dev/sdb1               1           7       56196   83  Linux  
  18. /dev/sdb2               8          70      506047+  83  Linux  
  19. /dev/sdb3              71         102      257040   82  Linux swap / Solaris  
  20.   
  21. Command (m for help): n  
  22. Command action  
  23.    e   extended  
  24.    p   primary partition (1-4)  
  25. p  
  26. Selected partition 4  
  27. First cylinder (103-2610, default 103):   
  28. Using default value 103  
  29. Last cylinder or +size or +sizeM or +sizeK (103-2610, default 2610): +50M    
  30.   
  31. Command (m for help): w    
[root@server69 ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 2610. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sdb: 21.4 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 7 56196 83 Linux /dev/sdb2 8 70 506047+ 83 Linux /dev/sdb3 71 102 257040 82 Linux swap / Solaris Command (m for help): n Command action e extended p primary partition (1-4) p Selected partition 4 First cylinder (103-2610, default 103): Using default value 103 Last cylinder or +size or +sizeM or +sizeK (103-2610, default 2610): +50M Command (m for help): w
2)重读下分区表
  1. [root@server69 ~]# partprobe /dev/sdb  
[root@server69 ~]# partprobe /dev/sdb格式化刚建立的分区为ext3文件系统
  1. [root@server69 ~]# mke2fs -j /dev/sdb1  
  2. [root@server69 ~]# mke2fs -j /dev/sdb2  
[root@server69 ~]# mke2fs -j /dev/sdb1 [root@server69 ~]# mke2fs -j /dev/sdb2

第三步:将刚格式化好的分区/dev/sdb1挂载到/mnt/boot  /dev/sdb2挂载到/mnt/sysroot,如果你没有这两个文件夹,请手动建立,如果你挂载了其他设备,可以换其他路径。
  1. [root@server69 LX]# mount /dev/sdb1 /mnt/boot  
  2. [root@server69 LX]# mount /dev/sdb2 /mnt/sysroot  
[root@server69 LX]# mount /dev/sdb1 /mnt/boot [root@server69 LX]# mount /dev/sdb2 /mnt/sysroot

第四步:1)安装grub到/dev/sdb
  1. [root@server69 mnt]# grub-install --root-directory=/mnt/ /dev/sdb  
  2. Installation finished. No error reported.  
  3. This is the contents of the device map /mnt//boot/grub/device.map.  
  4. Check if this is correct or not. If any of the lines is incorrect,  
  5. fix it and re-run the script `grub-install'.  
  6.   
  7. (fd0) /dev/fd0  
  8. (hd0) /dev/sda  
  9. (hd1) /dev/sdb  
  10.   
  11. 2)修改/mnt/boot/grub/device.map  
  12. [root@server69 mnt]# vim /mnt/boot/grub/device.map   
  13. (fd0)   /dev/fd0                               //去掉这一行  fd指的是软盘  
  14. (hd0)   /dev/sda  
  15. (hd1)   /dev/sdb                            //去掉这一行  
[root@server69 mnt]# grub-install --root-directory=/mnt/ /dev/sdb Installation finished. No error reported. This is the contents of the device map /mnt//boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb 2)修改/mnt/boot/grub/device.map [root@server69 mnt]# vim /mnt/boot/grub/device.map (fd0) /dev/fd0 //去掉这一行 fd指的是软盘 (hd0) /dev/sda (hd1) /dev/sdb //去掉这一行

第五步:拷贝kernel和initrd到小linux里,如果对kernel和initrd没有概念的话也请看我的文章,里面有详细的说明
深入浅出:linux启动流程刨析

1)拷贝kernel文件,并且重命名方便记忆。
  1. [root@server69 LX]# cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot/vmlinuz     
[root@server69 LX]# cp /boot/vmlinuz-2.6.18-164.el5 /mnt/boot/vmlinuz
2)拷贝initrd文件,并且重命名方便记忆。
  1. [root@server69 LX]# cp /boot/initrd-2.6.18-164.el5.img /mnt/boot/initrd  
[root@server69 LX]# cp /boot/initrd-2.6.18-164.el5.img /mnt/boot/initrd

第六步:解压缩initrd, 编辑里面的init文件,然后重新压缩封装。
  1. [root@server69 mnt]# mv initrd initrd.gz                                                  //刚其改名,否则gzip不识别  
  2. [root@server69 mnt]# gzip -d initrd.gz                                                     //解压  
  3. [root@server69 mnt]# cpio -id < initrd.gz                                                 //释放归档  
  4. 14731 blocks  
  5. [root@server69 mnt]# ls  
  6. bin  boot  dev  etc  init   lib  proc    sbin  sys  sysroot  
  7. //看到了吗?initrd几乎具有所有的linux文件目录,简直就是一个小linux  
  8. [root@server69 mnt]# vim init  
  9.  99 mkrootdev -t ext3 -o defaults,ro /dev/vol0/root                               // 修改为  mkrootdev -t ext3 -o defaults,ro /dev/sda2   
  10. [root@server69 mnt]#find. | cpio -H newc -o quiet   | gzip -9              //重新归档并压缩  
[root@server69 mnt]# mv initrd initrd.gz //刚其改名,否则gzip不识别 [root@server69 mnt]# gzip -d initrd.gz //解压 [root@server69 mnt]# cpio -id < initrd.gz //释放归档 14731 blocks [root@server69 mnt]# ls bin boot dev etc init lib proc sbin sys sysroot //看到了吗?initrd几乎具有所有的linux文件目录,简直就是一个小linux [root@server69 mnt]# vim init 99 mkrootdev -t ext3 -o defaults,ro /dev/vol0/root // 修改为 mkrootdev -t ext3 -o defaults,ro /dev/sda2 [root@server69 mnt]#find. | cpio -H newc -o quiet | gzip -9 //重新归档并压缩

第七步:创建小型linux的文件目录结构
  1. [root@server69 mnt]# cd /mnt/sysroot/  
  2. [root@server69 sysroot]# mkdir -pv root bin sbin usr/{bin,sbin} lib dev tmp proc sys home mnt media boot   
[root@server69 mnt]# cd /mnt/sysroot/ [root@server69 sysroot]# mkdir -pv root bin sbin usr/{bin,sbin} lib dev tmp proc sys home mnt media boot
第八步:拷贝命令到小型linux里去
1)怎么样拷贝命令?
  1. [root@server69 sysroot]# which bash                                             //使用which命令查看命令所在路径  
  2. /bin/bash  
  3. [root@server69 sysroot]# ldd /bin/bash                                           //ldd 加命令路径可以显示出这个命令所依赖的库文件  
  4. linux-gate.so.1 =>  (0x008e6000)                                                      //这个文件不用拷贝  
  5. libtermcap.so.2 => /lib/libtermcap.so.2 (0x0041e000)  
  6. libdl.so.2 => /lib/libdl.so.2 (0x003ef000)  
  7. libc.so.6 => /lib/libc.so.6 (0x002a7000)  
  8. /lib/ld-linux.so.2 (0x00284000)  
  9. [root@server69 sysroot]# cp /lib/lidkl.so.2 /mnt/sysroot/lib/               //将上面的库文件都复制到小linux对应的目录  
[root@server69 sysroot]# which bash //使用which命令查看命令所在路径 /bin/bash [root@server69 sysroot]# ldd /bin/bash //ldd 加命令路径可以显示出这个命令所依赖的库文件 linux-gate.so.1 => (0x008e6000) //这个文件不用拷贝 libtermcap.so.2 => /lib/libtermcap.so.2 (0x0041e000) libdl.so.2 => /lib/libdl.so.2 (0x003ef000) libc.so.6 => /lib/libc.so.6 (0x002a7000) /lib/ld-linux.so.2 (0x00284000) [root@server69 sysroot]# cp /lib/lidkl.so.2 /mnt/sysroot/lib/ //将上面的库文件都复制到小linux对应的目录 2)拷贝init 和bash ,mount , ls 这几个个命令去linux   注意,init和bash必须拷贝。


第九步:创建 /mnt/etc/fstab文件和/mnt/etc/inittab 文件,(这个文件的说明可以在我的启动流程文章里找到)
  1. [root@server69 ~]# vim /mnt/sysroot/etc/fstab  
  2. /dev/sda2            /                          ext3               defaults                                  0   0  
  3. /dev/sda1            /boot                      ext3               defaults                                  0   0  
  4. sysfs                /sys                       sysfs              defaults                                  0   0                                               
  5. proc                 /proc                      proc               defaults                                  0   0  
  6. [root@server69 ~]# vim /mnt/sysroot/etc/inittab  
  7. id:3:initdefault:  
  8. si::sysinit:/etc/rc.d/rc.sysinit  
[root@server69 ~]# vim /mnt/sysroot/etc/fstab /dev/sda2 / ext3 defaults 0 0 /dev/sda1 /boot ext3 defaults 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@server69 ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit
第十步:创建/mnt/boot/grub/grub.conf 和 /etc/rc.d/rc.sysinit,并给rc,sysyinit 赋执行权限
  1. [root@server69 ~]# vim /mnt/boot/grub/grub.conf   
  2. default=0  
  3. timeout=10  
  4. title Little Linux                                                                                           //grub的标题,可以自己写  
  5.                      kernel /vmlinuz  ro  root=/dev/sda2 quiet                       //加载内核,只读方式挂载根文件系统  
  6.                      initrd /initrd.gz                                                                       //加载内存文件系统  
  7.   
  8. [root@server69 ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit  
  9. #!/bin/bash  
  10. echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux"                     //这里可以写自己想写的欢迎界面 ^^  
  11.   
  12. mount -n -o remount.rw /                                                                           //以读写方式重启挂载根文件系统  
  13. mount -n -a                                                                                                    //挂载所有设备,并不记录  
  14.   
  15. /bin/bash                                                                                                        //加载bash shell  
[root@server69 ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=10 title Little Linux //grub的标题,可以自己写 kernel /vmlinuz ro root=/dev/sda2 quiet //加载内核,只读方式挂载根文件系统 initrd /initrd.gz //加载内存文件系统 [root@server69 ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/bash echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux" //这里可以写自己想写的欢迎界面 ^^ mount -n -o remount.rw / //以读写方式重启挂载根文件系统 mount -n -a //挂载所有设备,并不记录 /bin/bash //加载bash shell
  1.  "code" class="cpp" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">[root@server69 ~]# chmod +x /etc/rc.d/rc.sysinit                //给rc.sysinit赋执行权限     
 
[root@server69 ~]# chmod +x /etc/rc.d/rc.sysinit             
    //给rc.sysinit赋执行权限      好了,大功告成,新建一个虚拟机,选择linux2.6xx ,挂载上这块硬盘看下效果吧~
这是我的grub界面微笑很朴素吧~你可以自己更改背景哈
启动完成的效果,很简陋吧,注意Little偷笑 ##更新:第十步最后要给rc.sysinit赋执行权限,否则可能系统加载时无法执行
阅读(846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~