構建自己的Linux 之一 基本架構

來源:互聯網
上載者:User
構建自己的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 ,掛載上這塊硬碟。效果如所示:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.