感谢支持
我们一直在努力

VMware中打造自己的最小Linux系统

一. 最小系统要求
1. 接受键盘输入,能显示字符信息
2. 能处理普通linux发行版中的大部分基本命令,如:ls, mv…
3. 具有网络功能
4. 不使用ramdisk, 所需驱动全部编译进内核


二. 主机环境
1. VMware 7.0 / windows 7
2. 主机系统Ubuntu 10.04 x86
3. 最小系统内核版本 linux-2.6.38


三. 详细构建过程
1. 下载linux-2.6.38内核


  1. #cd /usr/src  
  2. #wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.gz  
  3. #tar xvf linux-2.6.38.tar.gz  
  4. #cd linux-2.6.38  



2.编译内核
这一步主要就是内核的配置,如果配置错了可能导致系统无法启动,因此需要非常仔细。


  1. #make mrproper               
  2. #make allnoconfig  
  3. #make menuconfig  



首先利用lspci查看硬件信息:


  1. #lspci  

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX – 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
00:11.0 PCI bridge: VMware PCI bridge (rev 02)
00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01)
………………. ……………………. …………………..
00:18.6 PCI bridge: VMware PCI Express Root Port (rev 01)
00:18.7 PCI bridge: VMware PCI Express Root Port (rev 01)
02:00.0 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB
02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
02:02.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)
02:03.0 USB Controller: VMware USB2 EHCI Controller

根据查到的硬件型号配置.config文件

以下详细介绍内核的配置

General setup —>
[*] System V IPC
[*] Enable loadable module support —>
Processor type and features —>
Processor family (Pentium Pro) —>
[*] Generuc x86 support
Bus options (PCI etc.) —>
[*] PCI support
PCI access mode (Any) —>
Executable file formats / Emulations —>
[*] Kernel support for ELF binaries
[*] Write ELF core dumps with partial segments
[*] Networking support  —>
Networking options —>
<*> Packet socket
<*> Unix domain sockets (NEW)
[*] TCP/IP networking
<*>   IP: IPsec transport mode (NEW)
<*>   IP: IPsec tunnel mode (NEW)
<*>   IP: IPsec BEET mode (NEW) 
<*>   Large Receive Offload (ipv4/tcp) (NEW)
<*>   INET: socket monitoring interface (NEW) 
Device Drivers  —>
[*] Block devices —>
<*> Loopback device support
SCSI device support —>
<*> SCSI device support
[*] legacy /proc/scsi/ support (NEW)
<*> SCSI disk support
[*] SCSI low-level drivers (NEW) —>
<*> BusLogic SCSI support
[*] Fusion MPT device support —>
<*> Fusion MPT ScsiHost drivers for SPI
<*> Fusion MPT ScsiHost drivers for FC
<*> Fusion MPT ScsiHost drivers for SAS
<*> Fusion MPT misc device (ioctl) driver
[*] Network device support —>
[*] Ethernet (10 or 100Mbit) —>
[*] EISA, VLB, PCI and on board controllers
<*> AMD PCnet32 PCI support
Graphics support  —>
<*> Support for frame buffer devices —>
File systems  —>
<*> Second extended fs support
[*]   Ext2 extended attributes 
[*]     Ext2 POSIX Access Control Lists  
[*]     Ext2 Security Labels
[*] Ext2 execute in place support
<*> Ext3 journalling file system support 
[*]   Default to ‘data=ordered’ in ext3 (NEW)
[*]   Ext3 extended attributes (NEW)  
[*]     Ext3 POSIX Access Control Lists   
[*]     Ext3 Security Labels   
CD-ROM/DVD Filesystems —>
<*> ISO 9660 CDROM file system support
<*> Native language support —>
<*> Codepage 437 (United States, Canada)
<*> Simplified Chinese charset (CP936, GB2312)
配置完成后就可以开始编译了:



  1. #make bzImage  

注意:在make menuconfig的时候一定要选对磁盘驱动,否则会出现kernel panic — VFS error:
这里我用的是SCSI的磁盘,IDE的要做相应修改。3. 制作根文件系统
为简单起见,我们利用busybox制用根文件系统。


  1. #wget http://busybox.net/downloads/busybox-1.18.4.tar.bz2  
  2. #tar xvf busybox-1.18.4.tar.bz2  
  3. #cd busybox-1.18.4  
  4. #make menuconfig    

下面是需要编译进busybox的功能选项。
  General Configuration应该选的选项
   Don’t use /usr

      这个选项一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令。
  Build Options
   Build BusyBox as a static binary (no shared libs)
  这个选项也是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使它正常工作。

其它选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了,配置好后退出并保存。
编译并安装busybox


  1. #make  
  2. #make install  

make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向它的链接。


接下来给虚拟机添加一块SCSI磁盘并分区,假设根分区为sdb1


  1. #mount /dev/sdb1 /mnt       将根分区挂载到/mnt  
  2. #cp _install/* /mnt/            将_install下的文件全复制到sdb1  
  3. #rm -f linuxrc  
  4. #cp -r ./examples/bootfloppy/etc /mnt       将etc下的配置文件拷到sdb1下  
  5. #cd /mnt/  
  6. #mkdir proc mnt usr var tmp dev sys         创建目录  
  7. #cp -a /dev/{console,tty,tty2} dev/  

最后重启一下


  1. #reboot  

如果一切顺利,就会出现下图的信息, —– 启动成功。

在上一节中,我们制作的内核已经具有网络功能,但是需要经过手动配置。


 


配置过程如下:


首先,我的VMware nat方式上网,并且开启了dhcp功能。nat网段为192.168.130.0/255.255.255.0 网关为192.168.130.2


 


于是在my linux-2.6.38中输入以下命令




  1. #ifconfig eth0 192.168.130.22 netmask 255.255.255.0 broadcast 192.168.130.255 up                  设置IP地址  

  2. #route add default gw 192.168.130.2            添加到网关的默认路由  

  3. #ping 74.125.71.99                测试外网地址(www.linuxidc.com)  


如果能ping通说明网络设置成功。


注意,这里ping的时候不能ping www.linuxidc.com,因为还没有设置nameseaver


 


 


如果每次启动系统都要手动配置网络上很不方便的。因此,我们考虑做一个网络初始化脚本。当然,直接在脚本中执行上面手动配置的命令也是可以的,但我不想那么做。


参考CentOS 5.4的网络初始化过程,我们可以写一个简化版的: 



 


  1. #!/bin/sh  

  2.  

  3. # network       Bring up/down networking  

  4. #  

  5. # config: /etc/network.conf  

  6. #               /etc/network.d/ifcfg-[devname]   

  7.   

  8. if [ ! -f /etc/network.conf ]; then   

  9.     exit 0   

  10. fi   

  11.   

  12. . /etc/network.conf   

  13.   

  14. “${NETWORKING}” = “no” ] && exit 0   

  15.   

  16.   

  17. case “$1” in  

  18. start)   

  19.     for i in /etc/network.d/ifcfg-*   

  20.     do  

  21.         if [ -r “$i” ]; then   

  22.             . $i   

  23.             if [ “$DHCP” = “yes” ]; then   

  24.                 echo -n “Starting DHCP for interface $INTERFACE: “  

  25.                 udhcpc -b -i “$INTERFACE” \   

  26.                     -p “/var/run/udhcpc.$INTERFACE.pid” \   

  27.                     > /dev/null  

  28.             else  

  29.                 echo -n “Setting up interface $INTERFACE: “  

  30.                 ifconfig “$INTERFACE” “$IPADDRESS” \   

  31.                     netmask “$NETMASK” \   

  32.                     broadcast “$BROADCAST” up   

  33.             fi   

  34.         fi   

  35.     done   

  36.        

  37.     if [ “$USE_GATEWAY” = “yes” -a -n “$GATEWAY” ]; then   

  38.         echo -n “Setting default route: “  

  39.         route add default gw $GATEWAY   

  40.     fi   

  41.     ;;   

  42. stop)   

  43.     if [ “$USE_GATEWAY” = “yes” -a -n “$GATEWAY” ]; then   

  44.         echo -n “Removing default route: “  

  45.         route del -net 0.0.0.0   

  46.     fi   

  47.   

  48.     for i in /etc/network.d/ifcfg-*   

  49.     do  

  50.         if [ -r “$i” ]; then   

  51.             . $i   

  52.             echo -n “Shutting down interface $INTERFACE: “  

  53.             ifconfig $INTERFACE down   

  54.             if [ “$DHCP” = “yes” ]; then   

  55.                 kill `cat “/var/run/udhcpc.$INTERFACE.pid”`   

  56.                 sleep 1   

  57.             fi   

  58.         fi   

  59.     done   

  60.     ;;   

  61. restart)   

  62.     $0 stop   

  63.     $0 start   

  64.     ;;   

  65. status)   

  66.     ifconfig   

  67.     ;;   

  68. *)   

  69.     echo “Usage: $0 {start|stop|restart|status}”  

  70.     exit 1   

  71. esac  


以上脚本需要:


1.    /etc/network.conf配置文件


 


  1. NETWORKING=yes   

  2. USE_GATEWAY=yes   

  3. GATEWAY=192.168.130.2  


2.    /etc/network.d/ifcfg-eth0    eth0接口的配置文件


  1. DHCP=no   

  2. INTERFACE=eth0   

  3. IPADDRESS=192.168.130.22   

  4. NETMASK=255.255.255.0   

  5. BROADCAST=192.168.130.255  


3.    新建/var/run/目录


 


注意:如果你是在windows编辑以上文件,请注意完成之后将windows下的回车换行符(\r\n)替换为linux下的换行符(\n),否则脚本执行可能会出错。


 


好了,需要的文件都编写好了,现在将文件拷到相应的目录下,在/etc/init.d/rcS文件中加入一行




  1. /etc/network start  


就可以了。


 


重启




  1. #reboot  



测试网络



  1. #ifconfig  

  2. #ping 74.125.71.99  


赞(0) 打赏
转载请注明出处:服务器评测 » VMware中打造自己的最小Linux系统
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏