基於busybox裁剪的minilinux

詳解基於busybox的minilinux製作
這裏製作的小linux中的initrd及filesystem是基於busybox製作的

製作環境:
[root@localhost kernels]# uname -a
Linux localhost.localdomain 2.6.18-308.el5 #1 SMP Fri Jan 27 17:21:15 EST 2012 i686 i686 i386 GNU/Linux
#安裝開發環境所需的軟件組
yum groupinstall -y "Development Libraries" "Development Tools"


一、製作minilinux所需的硬盤
 1.新裝一塊10G的IDE硬盤,作爲製作minilinux的硬盤
 [root@localhost ~]# fdisk -l /dev/hdb

 Disk /dev/hdb: 10.7 GB, 10737418240 bytes
 15 heads, 63 sectors/track, 22192 cylinders
 Units = cylinders of 945 * 512 = 483840 bytes

 Disk /dev/hdb doesn't contain a valid partition table
 #這裏我的硬盤是/dev/hdb

 2.創建三個分區並格式化
 #linux對中文的支持不好,並且本人的英文也不好,所以腳本中的備註都是中式英語,莫見笑!
 [root@localhost ~]# cat scripts/partdisk.sh
 #!/bin/bash
 #
 #show warnning information
 echo "initial a disk..."
 echo -e "\033[31mWarnning:\033[0m"
 #show harddisk list
 fdisk -l 2>/dev/null | grep -o "Disk /dev/[sh]d[a-z]"
 #Choose to hard disk
 read -p "Your choose:" partdisk
 #when the user select q,then quit this script
 if [ $partdisk = q ];then
  echo "quit"
  exit 7
 fi

 until fdisk -l 2>/dev/null | grep -o "Disk /dev/[sh]d[a-z]" | grep "^Disk $partdisk$" &>/dev/null;do 
  read -p "wrong option,choose again:" partdisk
 done
 #show confirm information
 read -p "Are you sure?" choose

 until [ $choose = y -o $choose = n -o $choose = q ];do
  read -p "Wrong choose,choose again?" choose
 done

 if [ $choose = n -o $choose = q ];then
  echo "quit"
  exit 9
 else
  echo "partition..."
 #umount the disk
  for i in `mount | grep "$choose" | awk "{print $1}"`;do
   fuser -km $1
   umount $1
   echo "$1 unmonut ok"
  done
 #Delete the partition table
 dd if=/dev/zero of=$partdisk bs=512 count=1
 sync
 sleep 3
 sync
 sleep 3
 #partition
 echo "n
 p
 1

 +20M
 n
 p
 2

 +512M
 n
 p
 3

 +128M
 t
 3
 82
 w
 " | fdisk $partdisk >/dev/null
 wait
 sleep 2
 sync
 partprobe $partdisk
 sleep 2
 sync
 #Notice the kernel re-reads the partition table
 cat /proc/partitions
 #Format the partition
 mke2fs -j ${partdisk}1 &>/dev/null
 wait
 mke2fs -j ${partdisk}2 &>/dev/null
 wait
 mkswap ${partdisk}3 &>/dev/null

 fi
 #驗證分區是否成功
 [root@localhost scripts]# cat /proc/partitions
 major minor  #blocks  name

    3     0   10485760 hda
    3     1     104391 hda1
    3    64   10485760 hdb
    3    65      19813 hdb1
    3    66     500377 hdb2
    3    67     125685 hdb3
    8     0  125829120 sda
    8     1   41945683 sda1
    8     2    1052257 sda2
  253     0   30703616 dm-0
 #驗證格式化是否成功
 [root@localhost scripts]# blkid
 /dev/mapper/vol0-home: UUID="be16484a-5354-404d-8052-8a74509f63e8" TYPE="ext3"
 /dev/mapper/vol0-root: UUID="f5849c49-0eb0-4f77-a0fd-31a36c5ba822" TYPE="ext3"
 /dev/sda2: LABEL="SWAP-sda2" TYPE="swap"
 /dev/hdc: LABEL="RHEL/5.8 i386 DVD" TYPE="iso9660"
 /dev/hda1: LABEL="/boot1" UUID="15c3a850-6521-459a-9a9a-ff548e4e0000" TYPE="ext3"
 /dev/vol0/root: UUID="f5849c49-0eb0-4f77-a0fd-31a36c5ba822" TYPE="ext3"
 /dev/hdb1: UUID="9cd3b7bb-3906-489e-adb2-f209d35e2b57" SEC_TYPE="ext2" TYPE="ext3"
 /dev/hdb2: UUID="1f26afe4-0969-4735-8b44-b52d40eb1498" SEC_TYPE="ext2" TYPE="ext3"
 /dev/hdb3: TYPE="swap"

 #創建目錄並掛載分區
 #這裏創建兩個目錄/mnt/boot,/mnt/sysroot其中boot作爲minilinux的boot分區,sysroot作爲minilinux的根分區
 #boot和sysroot對應的設備文件分別是/dev/hdb1,/dev/hdb2
 mkdir /mnt/{boot,sysroot};mount /dev/hdb1 /mnt/boot;mount /dev/hdb2 /mnt/sysroot
 #驗證掛載是夠成功
 [root@localhost scripts]# mount
 /dev/mapper/vol0-root on / type ext3 (rw)
 proc on /proc type proc (rw)
 sysfs on /sys type sysfs (rw)
 devpts on /dev/pts type devpts (rw,gid=5,mode=620)
 /dev/mapper/vol0-home on /home type ext3 (rw)
 /dev/hda1 on /boot type ext3 (rw)
 tmpfs on /dev/shm type tmpfs (rw)
 none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
 sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
 /dev/hdb1 on /mnt/boot type ext3 (rw)
 /dev/hdb2 on /mnt/sysroot type ext3 (rw)

二、製作minilinux的boot分區
 1.爲minilinux安裝grub,此處的/dev/hdb爲目標系統所在的那塊新磁盤
 grub-install --root-directory=/mnt  /dev/hdb
 #檢查grub是否安裝成功
 [root@localhost ~]# tree /mnt/boot/
 /mnt/boot/
 |-- grub
 |   |-- device.map
 |   |-- e2fs_stage1_5
 |   |-- fat_stage1_5
 |   |-- ffs_stage1_5
 |   |-- iso9660_stage1_5
 |   |-- jfs_stage1_5
 |   |-- minix_stage1_5
 |   |-- reiserfs_stage1_5
 |   |-- stage1
 |   |-- stage2
 |   |-- ufs2_stage1_5
 |   |-- vstafs_stage1_5
 |   `-- xfs_stage1_5
 `-- lost+found

 2 directories, 13 files

 #接下來爲grub建立配置文件
 [root@localhost ~]# vim  /mnt/boot/grub/grub.conf
 [root@localhost ~]# cat /mnt/boot/grub/grub.conf
 default        0
 timeout        3
 color    light-green/black light-magenta/black
 title    MageEdu-lixiaobo Mini Linux (2.6.38.5)
  root (hd0,0)
  kernel /linuz ro root=/dev/hda2
  initrd /initrd.gz

2.製作minilinux所需的內核
#下載並解壓內核源文件及cp當前系統的.config文件
cd /usr/src/kernels
#進入kernels目錄下載並解壓內核源文件,這裏使用的是2.6.38版本的內核
wget ftp://192.168.0.254/pub/Sources/kernel/linux-2.6.38.5.tar.bz2
tar xf linux-2.6.38.5.tar.bz2
cd /usr/src/kernels/linux-2.6.38.5
cp /usr/src/kernel/$release/.config ./
#根據您的實際和規劃選擇所需要的功能;本實例計劃製作一個具有網絡的功能的微型linux且不打算使用內核模塊,因此,這裏選擇把本機對應的網卡驅動直接編譯進了內核。作者使用的是vmware Workstation虛擬機,所以,所需的網上驅動是pcnet32的,其它的均可按需要進行選擇。選擇完成後需要保存至當前目錄下.config文件中。
提示:爲了實現後面的功能,請務必將文件系統中的ext3和網卡的驅動程序直接編譯進內核;否則,就需要手動裝載這些相關文件系統的模塊;
make menuconfig
#製作
make SUBDIR=arch/


#copy內核到/mnt/boot/linuz
cp arch/x86/boot/bzImage /mnt/boot/linuz

3.製作initrd
#下載並解壓busybox以及編譯安裝
cd /usr/src
tar xf busybox-1.20.2.tar.bz2
cd  busybox-1.20.2
mkdir include/mtd
cp  /usr/src/linux/include/mtd/ubi-user.h  include/mtd/
make menuconfig
#說明:
1、此處需要選擇 Busybox Settings --> Build Options -->  Build BusyBox as a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的靜態二進制文件,從而避免了對宿主機的共享庫產生依賴;但你也可以不選擇此項,而完成編譯後把其依賴的共享庫複製至目標系統上的/lib目錄中即可;這裏採用後一種辦法。
2、修改安裝位置爲/mnt/sysroot;方法爲:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值爲/mnt/sysroot,作者選擇的是默認安裝路徑。

#拷貝busybox中所有文件到/tmp/initrd,因這裏需要製作initrd,安裝後的文件均位於./_install目錄中;但爲了創建initrd,並實現讓其啓動以後將真正的文件系統切換至目標系統分區上的rootfs,需要複製一份剛編譯安裝busybox至另一個目錄,以實現與真正的根文件系統分開製作。我們這裏選擇使用/tmp/initrd目錄;
mkdir /tmp/initrd
cp -a busybox-1.20.2/_install/* /tmp/initrd
#建立initrd所需的目錄
cd /tmp/initrd
mkdir -pv  proc  sys  etc tmp  dev  mnt/sysroot

#創建兩個必要的設備文件:
mknod  dev/console  c  5  1
mknod  dev/null  c  1  3

#爲initrd製作init程序,此程序的主要任務是實現rootfs的切換,因此,可以以腳本的方式來實現它:

rm -f linuxrc
[root@localhost initrd]# vim  init
[root@localhost initrd]# cat init
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
mount -t ext3 /dev/hda2  /mnt/sysroot
exec  switch_root  /mnt/sysroot  /sbin/init

#給此腳本執行權限:
chmod  +x  init

#製作initrd
find  .  | cpio  --quiet  -H newc  -o  | gzip  -9 > /mnt/boot/initrd.gz

4.製作minilinux真正的根分區/mnt/sysroot
#拷貝busybox中所有文件到/mnt/sysroot
cp -a busybox-1.20.2/_install/* /mnt/sysroot
#創建minilinux所需的目錄
mkdir -pv /mnt/{boot/grub,sysroot/{boot,proc,sys,bin,sbin,lib/modules,usr/{bin,sbin,lib},var/{run,log,lock},etc/{init.d,rc.d},dev/pts,home,root,tmp}}
#創建兩個必要的設備文件:
mknod  dev/console  c  5  1
mknod  dev/null  c  1  3
#配置init所需的inittab配置文件
cd  /mnt/sysroot
rm  -f  linuxrc

[root@localhost sysroot]# vim etc/inittab
[root@localhost sysroot]# cat etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 9600 tty1
::respawn:/sbin/getty 9600 tty2
::respawn:/sbin/getty 9600 tty3
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
#配置系統初始化腳本etc/rc.d/rc.sysinit
[root@localhost sysroot]# vim  etc/rc.d/rc.sysinit
[root@localhost sysroot]# cat etc/rc.d/rc.sysinit
#!/bin/sh
echo -e "\tWelcome to  \033[31mMageEdu\033[0m Linux"

echo -e "Remounting the root filesystem ..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o  remount,rw  /

echo -e "Creating the files of device ..."
mdev -s

echo -e "Mounting the filesystem ..."
mount -a
swapon -a

echo -e "Starting the log daemon ..."
syslogd
klogd

echo -e "Configuring loopback interface ..."
ifconfig  lo  127.0.0.1/24
ifconfig eth0 172.16.100.100/16
#而後讓此腳本具有執行權限:
chmod +x  etc/rc.d/rc.sysinit

#爲系統準備一個“文件系統表”配置文件etc/fstab
[root@localhost sysroot]# vim  etc/fstab
[root@localhost sysroot]# cat etc/fstab
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/hda1               /boot                   ext3    defaults        0 0
/dev/hda2               /                       ext3    defaults        1 1


#手動爲minilinux添加一個root用戶
[root@localhost sysroot]# grep  "^root"  /etc/shadow  > etc/shadow
[root@localhost sysroot]# grep  "^root"  /etc/passwd  > etc/passwd
[root@localhost sysroot]# grep  "^root"  /etc/group  > etc/group
#注:等目標主機啓動時,root用戶的口令也是宿主機的root用戶的口令。您可以在目標主機啓動以後再動手更改root用戶的口令。

#在系統登錄時提供banner信息
[root@localhost sysroot]# vim  etc/issue
[root@localhost sysroot]# cat etc/issue
Welcome to MageEdu Linux(http://www.magedu.com)...
minilinux
Kernel \r

#由於在rc.sysinit文件中啓動了日誌進程,因此係統在運行中會產生大量日誌並將其顯示於控制檯;這將會經常性的打斷正在進行的工作,爲了避免這種情況,我們這裏爲日誌進程建立配置文件,爲其指定將日誌發送至/var/log/messages文件;
[root@localhost sysroot]# vim  etc/syslog.conf
[root@localhost sysroot]# cat etc/syslog.conf
*.info    /var/log/messages

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章