構建自己的Linux 之一 基本架構
自己動手構建一個Linux不僅可以加深對Linux的理解,對嵌入式Linux的學習也有很大的協助。構建一個自己的Linux(核心的編譯,檔案系統的製作,圖形介面,驅動等)和開發嵌入式Linux的過程基本一樣。
1開發環境
RedFlag Linux 6.0
VMware 7.1.3build-324285
2 添加磁碟
添加一個新的虛擬硬碟,硬碟類型選擇“IDE”,如所示:
注意:一定選擇IDE類型的虛擬磁碟,否則系統無法識別磁碟,會無法掛載檔案系統!,在initrd.img中還要插入相應的核心模組。
3查看磁碟
啟動虛擬機器,在終端下查看剛剛添加的硬碟
[root@localhost ~]# fdisk -l...Disk /dev/sdc: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280bytes Disk /dev/sdc doesn't contain a validpartition table
4給硬碟分區
[root@localhost ~]# fdisk /dev/sdcDevice contains neither a valid DOSpartition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel. Changes willremain in memory only,until you decide to write them. After that,of course, the previouscontent won't be recoverable. The number of cylinders for this disk isset to 1044.There is nothing wrong with that, but thisis larger than 1024,and could in certain setups cause problemswith:1) software that runs at boot time (e.g.,old versions of LILO)2) booting and partitioning software fromother OSs (e.g., DOS FDISK, OS/2 FDISK)Warning: invalid flag 0x0000 of partitiontable 4 will be corrected by w(rite) Command (m for help): n //添加一個新的分區Command action e extended p primary partition (1-4)p //選擇主要磁碟分割Partition number (1-4): 1 First cylinder (1-1044, default 1): 1Last cylinder or +size or +sizeM or +sizeK(1-1044, default 1044): +100M//boot分區為100M Command (m for help): nCommand action e extended p primary partition (1-4)p //添加一個新的分區Partition number (1-4): 2First cylinder (14-1044, default 14): 14Last cylinder or +size or +sizeM or +sizeK(14-1044, default 1044): +2048M//主要磁碟分割為2G Command (m for help): w //寫入分區表The partition table has been altered! Calling ioctl() to re-read partition table.Syncing disks.
5查看分區
[root@localhost ~]# fdisk -l Disk /dev/sdc: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280bytes Device Boot Start End Blocks Id System/dev/sdc1 1 13 104391 83 Linux/dev/sdc2 14 263 2008125 83 Linux
6格式化為ext3格式
[root@localhost ~]# mke2fs -j /dev/sdc1[root@localhost ~]# mke2fs -j /dev/sdc2
7安裝grub
[root@localhost ~]#mkdir /mnt/boot[root@localhost ~]#mkdir /mnt/sysroot[root@localhost ~]# mount /dev/sdc1/mnt/boot //掛載分區[root@localhost ~]# mount /dev/sdc2/mnt/sysroot//掛載分區[root@localhost ~]# grub-install--root-directory=/mnt/ /dev/sdc //安裝grub
修改/mnt/boot/grub/device.map,只留下(hd0) /dev/sda
8修改initrd
關於initrd的更多的資料,可以參看我前面寫的文章(linux 2.6核心initrd.img檔案分析)。
[root@localhost ~]#cp /boot/vmlinuz-2.6.23.1-4/mnt/boot/vmlinuz[root@localhost ~]#cp /boot/initrd-2.6.23.1-4.img/mnt/boot/initrd.img[root@localhost ~]#mkdir /mnt/boot/1 //建立一個臨時目錄[root@localhost ~]#cp /mnt/boot/initrd.img /mnt/boot/new/initrd.img[root@localhost ~]#cd /mnt/boot/1[root@localhost 1]#gzip -dc initrd.img |cpio –idvm //解壓initrd.img[root@localhost 1]#cp/lib/modules/2.6.23.1-4/kernel/drivers/scsi/ide-scsi.ko/mnt/boot/1/lib
修改/mnt/boot/1/init如下:
#!/bin/nash mount -t proc /proc /procsetquietecho Mounting proc filesystemecho Mounting sysfs filesystemmount -t sysfs /sys /sysecho > /sys/power/suspend2/do_resumeecho Creating /devmount -o mode=0755 -t tmpfs /dev /devmkdir /dev/ptsmount -t devpts -o gid=5,mode=620 /dev/pts/dev/ptsmkdir /dev/shmmkdir /dev/mapperecho Creating initial device nodesmknod /dev/null c 1 3mknod /dev/zero c 1 5mknod /dev/systty c 4 0mknod /dev/tty c 5 0mknod /dev/console c 5 1mknod /dev/ptmx c 5 2mknod /dev/rtc c 10 135mknod /dev/tty0 c 4 0mknod /dev/tty1 c 4 1mknod /dev/tty2 c 4 2mknod /dev/tty3 c 4 3mknod /dev/tty4 c 4 4mknod /dev/tty5 c 4 5mknod /dev/tty6 c 4 6mknod /dev/tty7 c 4 7mknod /dev/tty8 c 4 8mknod /dev/tty9 c 4 9mknod /dev/tty10 c 4 10mknod /dev/tty11 c 4 11mknod /dev/tty12 c 4 12mknod /dev/ttyS0 c 4 64mknod /dev/ttyS1 c 4 65mknod /dev/ttyS2 c 4 66mknod /dev/ttyS3 c 4 67echo Setting up hotplug.hotplugecho Creating block device nodes.mkblkdevsecho "Loading uhci-hcd.ko module"insmod /lib/uhci-hcd.koecho "Loading ohci-hcd.ko module"insmod /lib/ohci-hcd.koecho "Loading ehci-hcd.ko module"insmod /lib/ehci-hcd.komount -t usbfs /proc/bus/usb /proc/bus/usbecho "Loading jbd.ko module"insmod /lib/jbd.koecho "Loading ext3.ko module"insmod /lib/ext3.koecho "Loading BusLogic.ko module"insmod /lib/BusLogic.koecho "Loading libata.ko module"insmod /lib/libata.koecho "Loading ata_piix.ko module"insmod /lib/ata_piix.koecho Waiting for driver initialization.stabilized --hash --interval 250/proc/scsi/scsiecho "Loading ide-core.ko module"insmod /lib/ide-core.koecho "Loading ide-disk.ko module"insmod /lib/ide-disk.koecho "Loading ide-scsi.ko module"//添加SCSI硬碟驅動模組,增加IDE裝置對SCSI的類比,否則無法掛載檔案系統insmod /lib/ide-scsi.komkblkdevsecho Creating root device.mkrootdev -t ext3 -o defaults,rw sda2 // 產生根目錄裝置 注意:一定要以rw(可讀寫)方式掛載,否則系統啟動後無法修改和建立檔案echo Mounting root filesystem.mount /sysrootecho Setting up other filesystems.setuprootecho Switching to new root and runninginit.switchroot
修改完成後,下面產生新的initrd.img,先刪除舊的initrd.img。
[root@localhost 1]#del initrd.img[root@localhost 1]# find ./ | cpio -c -o> initrd.img26626 blocks[root@localhost 1]# gzip -9 initrd.img[root@localhost 1]# mv initrd.img.gzinitrd.img[root@localhost 1]#cp initrd.img /mnt/boot/initrd.img
9再次修改grub
[root@localhost ~]#cp /boot/message/mnt/boot/message //引導畫面,可以去掉[root@localhost ~]#cp /boot/grub/grub.conf/mnt/boot/grub/grub.conf
修改如下:
default=0timeout=20gfxmenu (hd0,0)/messagetitle EmbeddedCE123 root(hd0,0) kernel/vmlinuz ro root=/dev/sda2 initrd/initrd.img
10構建檔案系統10.1命令移植
[root@localhost~]# cd /mnt/sysroot/[root@localhostsysroot]# mkdir -pv root bin sbin usr/{bin,sbin} lib dev tmp proc sys home mnt media boot //建立檔案系統的基本架構
複製基本的命令 init bash。
[root@localhost sysroot]#cp /bin/bash /bin/bash[root@localhostsysroot]#cp/sbin/init /sbin/init
查看命令所依賴的可檔案:
[root@localhost sysroot]# ldd/bin/bash linux-gate.so.1 => (0xb7f2d000) libtermcap.so.2 =>/lib/libtermcap.so.2 (0xb7f12000) libdl.so.2 => /lib/libdl.so.2 (0xb7f0d000) libc.so.6 => /lib/libc.so.6(0xb7db6000) /lib/ld-linux.so.2 (0xb7f2e000)
在宿主機中找到這些檔案並拷貝到相應的目錄下。同理,移植init命令。最後,這兩個命令所需的庫檔案如下:
libc-2.6.so libdl.so.2 libtermcap.so.2ld-2.6.so libc.so.6 libselinux.so.1 libtermcap.so.2.0.8ld-linux.so.2 libdl-2.6.so libsepol.so.1
10.2設定檔(/etc目錄下的檔案)
inittab檔案的內容如下:
id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinit
fstab檔案的內容如下:
/dev/sda2 / ext3 defaults 0 0/dev/sda1 /boot ext3 defaults 0 0sysfs /sys sysfs defaults 0 0proc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0tmpfs /dev tmpfs defaults 0 0var /dev tmpfs defaults 0 0
rc.d/rc.sysinit檔案的內容如下:
#!/bin/bash echo -e " Welcome to EmbeddedCE123 Linux"/bin/bash
給rc.sysinit賦執行許可權
[root@localhostsysroot]# chmod +x /etc/rc.d/rc.sysinit
11測試
建立一個虛擬機器,選擇linux2.6xx ,掛載上這塊硬碟。效果如所示: