九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
使用 linux kernel +busybox 定制linux系統(tǒng)

目的:

了解linux的啟動(dòng)過(guò)程

主要內(nèi)容:

1.grub 是啟動(dòng)程序的bootloader
2.linux-kernel 是linux的開(kāi)源內(nèi)核
3.busybox 是linux的工具集合

啟動(dòng)順序:

grub-> bzimage > initrd > init > chroot sbin/init (從內(nèi)存鏡像轉(zhuǎn)換成rootfs)>/etc/inittab > fstab>etc/init.d/rcS

實(shí)驗(yàn)環(huán)境:

操作系統(tǒng)(編譯使用): CentOS 7.4Kernel 版本 :5.5.2
1.編譯linux kernel

  1. 下載及解壓:
https://www.kernel.org/目前最新版本5.5.2https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.2.tar.xz復(fù)制文件到 /usr/src/linux-5.5.2.tar.xz解壓 tar -xvf linux-5.5.2.tar.xz

2)編譯linux kernel:

1 yum install ncusres‐devel # 按照需要編譯的一些包2 cd /usr/src/linux‐5.5.2 # 切換到linux源代碼目錄3 make menuconfig #配置內(nèi)核編譯內(nèi)容,配置一些信息 ,由于是演示,默認(rèn)就可以了4 make ‐j4 #執(zhí)行多cpu方式編譯5 midir /usr/src/modules6 make modules_install INSTALL_MOD_PATH=/usr/src/modules #將modules安裝在這里

2.編譯busybox

  1. 下載及解壓:
https://busybox.net/目前最新版本1.31.1https://busybox.net/downloads/busybox-1.31.1.tar.bz2復(fù)制文件到 /usr/src/busybox-1.31.1.tar.bz2解壓 tar -jxvf busybox-1.31.1.tar.bz2
  1. 編譯busybox
1 yum install glibc‐static # 按照需要編譯的靜態(tài)庫(kù)包2 cd /usr/src/busybox‐1.31.1 # 切換到busybox源代碼目錄3 make menuconfig # 配置 Settings‐>Build Options‐>Build static binary4 make install

3.根據(jù)busybox 制作initrd.gz文件

1 make /usr/src/initrd # 創(chuàng)建初始化目錄2 cd /usr/src/initrd # 進(jìn)入工作目錄3 cp /usr/src/busybox‐1.31.1/_install/* ‐a . #復(fù)制所有busybox文件4 mkdir proc sys mnt/sysroot dev tmp etc ‐pv #創(chuàng)建必要的目錄5 mknod dev/console c 5 1 # 創(chuàng)建console設(shè)備6 mknod dev/null c 1 3 # 創(chuàng)建null設(shè)備7 rm linuxrc # 刪除軟連接,這個(gè)文件沒(méi)啥用看著不舒服而已8 touch init # 創(chuàng)建init 引導(dǎo)程,具體內(nèi)容見(jiàn)下面信息9 chmod +x init # 設(shè)置可運(yùn)行程序10 find . | cpio ‐H newc ‐‐quiet ‐o | gzip ‐9 > /usr/src/initrd.gz #打包initrd

init 文件內(nèi)容:

1 #!/bin/sh23 echo "Mounting proc and sys..."4 mount ‐t sysfs sysfs /sys5 mount ‐t proc proc /proc67 echo "Detect and export hardware infomation..."8 mdev ‐s910 echo "Mount real rootfs to /mnt/sysroot..."11 mount ‐t ext4 ‐o ro /dev/sda2 /mnt/sysroot1213 echo "Switch to real rootfs..."14 exec chroot /mnt/sysroot /sbin/init

4.根據(jù)linux kernel 編譯輸出整理成 vmlinuz

1 cp /usr/src/linux‐5.5.2/arch/x86/boot/bzImage /usr/src/vmlinuz #復(fù)制內(nèi)核

5.根據(jù)busybox 制作rootfs 系統(tǒng)真正的linux目錄

1 make /usr/src/sysroot #創(chuàng)建工作目錄2 cd sysroot #進(jìn)入工作目錄3 cp /usr/src/busybox‐1.31.1/_install/* ‐a . #復(fù)制所有busybox文件4 rm linuxrc # 刪除軟連接,這個(gè)文件沒(méi)啥用看著不舒服而已5 # 創(chuàng)建目錄6 mkdir dev var sys mnt etc proc lib home tmp root boot7 mkdir var/{log,run,lock}8 mkdir lib/modules9 mknod dev/console c 5 1 # 創(chuàng)建console設(shè)備10 mknod dev/null c 1 3 # 創(chuàng)建null設(shè)備11 vim etc/inittab #創(chuàng)建rootfs啟動(dòng)文件,內(nèi)容見(jiàn)下圖12 vim etc/init.d/rcS #創(chuàng)建啟動(dòng)腳本13 chmod +x rcS14 vim etc/fstab #當(dāng)執(zhí)行mount ‐a 的時(shí)候就會(huì)執(zhí)行這個(gè)文件里的掛載

inittab 文件內(nèi)容:

1 ::sysinit:/etc/init.d/rcS2 ::askfirst:‐/bin/sh3 ::ctrlaltdel:/sbin/reboot4 ::shutdown:/bin/umount ‐a ‐r5 ::restart:/sbin/init

rcS 文件內(nèi)容:

1 #!/bin/sh23 echo ‐e "Welcome To My Linux"45 echo "Remount the rootfs..."6 mount ‐t ext4 ‐o remount,rw /dev/sda2 /7 echo "Detect and export hardware infomation..."8 mdev ‐s9 echo "Mount the other filesystem...fstab"10 mount ‐a

fstab:

1 # device mount‐point type options dump fsck2 sysfs /sys sysfs defaults 0 03 proc /proc proc defaults 0 04 /dev/sda1 /boot ext4 defaults 0 05 /dev/sda2 / ext4 defaults 1 1

6.經(jīng)過(guò)上面的步驟已經(jīng)實(shí)現(xiàn)了 vmlinuz(linux 內(nèi)核) initrd.gz(內(nèi)存系統(tǒng)盤) sysroot (真正的linux rootfs系統(tǒng)) 都已經(jīng)準(zhǔn)備好了,接下來(lái)開(kāi)始準(zhǔn)備一塊磁盤。
通過(guò)virtual box 創(chuàng)建一塊sata磁盤10G 并分成兩個(gè)區(qū).

1 [root@centos ~]# lsblk2 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT3 sda 8:0 0 100G 0 disk4 ├─sda1 8:1 0 1G 0 part /boot5 └─sda2 8:2 0 99G 0 part6 ├─cl‐root 253:0 0 50G 0 lvm /7 ├─cl‐swap 253:1 0 2G 0 lvm [SWAP]8 └─cl‐home 253:2 0 47G 0 lvm /home9 sdb 8:16 0 10G 0 disk10 sr0 11:0 1 1024M 0 rom11 ###############################################12 [root@centos ~]# fdisk /dev/sdb #開(kāi)始格式化13 Welcome to fdisk (util‐linux 2.23.2).1415 Changes will remain in memory only, until you decide to write them.16 Be careful before using the write command.1718 Device does not contain a recognized partition table19 Building a new DOS disklabel with disk identifier 0x3f5d5436.2021 Command (m for help): n22 Partition type:23 p primary (0 primary, 0 extended, 4 free)24 e extended25 Select (default p): p26 Partition number (1‐4, default 1): 127 First sector (2048‐20971519, default 2048): 204828 Last sector, +sectors or +size{K,M,G} (2048‐20971519, default 20971519):+5G29 Partition 1 of type Linux and of size 5 GiB is set3031 Command (m for help): n32 Partition type:33 p primary (1 primary, 0 extended, 3 free)34 e extended35 Select (default p): p36 Partition number (2‐4, default 2):37 First sector (10487808‐20971519, default 10487808):38 Using default value 1048780839 Last sector, +sectors or +size{K,M,G} (10487808‐20971519, default 20971519):40 Using default value 2097151941 Partition 2 of type Linux and of size 5 GiB is set4243 Command (m for help): p4445 Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors46 Units = sectors of 1 * 512 = 512 bytes47 Sector size (logical/physical): 512 bytes / 512 bytes48 I/O size (minimum/optimal): 512 bytes / 512 bytes49 Disk label type: dos50 Disk identifier: 0x3f5d54365152 Device Boot Start End Blocks Id System53 /dev/sdb1 2048 10487807 5242880 83 Linux54 /dev/sdb2 10487808 20971519 5241856 83 Linux5556 Command (m for help): w57 The partition table has been altered!5859 Calling ioctl() to re‐read partition table.60 Syncing disks.61 [root@centos ~]#

開(kāi)始掛載分好區(qū)的盤,并將文件復(fù)制到這兩分區(qū)中,第一個(gè)分區(qū)定義為boot,第二個(gè)分區(qū)定義為sysroot ;

1 mkdir /mnt/boot /mnt/sysroot # 在centos系統(tǒng)上創(chuàng)建兩個(gè)目錄2 [root@centos src]# lsblk # 查看剛剛分好區(qū)的sdb 盤3 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT4 sda 8:0 0 100G 0 disk5 ├─sda1 8:1 0 1G 0 part /boot6 └─sda2 8:2 0 99G 0 part7 ├─cl‐root 253:0 0 50G 0 lvm /8 ├─cl‐swap 253:1 0 2G 0 lvm [SWAP]9 └─cl‐home 253:2 0 47G 0 lvm /home10 sdb 8:16 0 10G 0 disk11 ├─sdb1 8:17 0 5G 0 part12 └─sdb2 8:18 0 5G 0 part13 sr0 11:0 1 1024M 0 rom1415 [root@centos mnt]# mkfs.ext4 /dev/sdb1 #創(chuàng)建文件系統(tǒng)格式16 mke2fs 1.42.9 (28‐Dec‐2013)17 Filesystem label=18 OS type: Linux19 Block size=4096 (log=2)20 Fragment size=4096 (log=2)21 Stride=0 blocks, Stripe width=0 blocks22 327680 inodes, 1310720 blocks23 65536 blocks (5.00%) reserved for the super user24 First data block=025 Maximum filesystem blocks=134217728026 40 block groups27 32768 blocks per group, 32768 fragments per group28 8192 inodes per group29 Superblock backups stored on blocks:30 32768, 98304, 163840, 229376, 294912, 819200, 8847363132 Allocating group tables: done33 Writing inode tables: done34 Creating journal (32768 blocks): done35 Writing superblocks and filesystem accounting information: done3637 [root@centos mnt]# mkfs.ext4 /dev/sdb238 mke2fs 1.42.9 (28‐Dec‐2013)39 Filesystem label=40 OS type: Linux41 Block size=4096 (log=2)42 Fragment size=4096 (log=2)43 Stride=0 blocks, Stripe width=0 blocks44 327680 inodes, 1310464 blocks45 65523 blocks (5.00%) reserved for the super user46 First data block=047 Maximum filesystem blocks=134217728048 40 block groups49 32768 blocks per group, 32768 fragments per group50 8192 inodes per group51 Superblock backups stored on blocks:52 32768, 98304, 163840, 229376, 294912, 819200, 8847365354 Allocating group tables: done55 Writing inode tables: done56 Creating journal (32768 blocks): done57 Writing superblocks and filesystem accounting information: done5859 [root@centos mnt]# blkid60 /dev/sda1: UUID="cbf299b0‐d76d‐4efe‐8643‐c900502683d4" TYPE="xfs"61 /dev/sda2: UUID="L416ib‐7Z3D‐rtXt‐FqTb‐ChsW‐j6zH‐heeuF2" TYPE="LVM2_member"62 /dev/mapper/cl‐root: UUID="12c02980‐3012‐4884‐8a7d‐437195398fdb" TYPE="xfs"63 /dev/mapper/cl‐swap: UUID="c4ea26e2‐7424‐4a52‐aa34‐8d9fb4f3fbd2" TYPE="swap"64 /dev/mapper/cl‐home: UUID="7be941f2‐fcf6‐44b7‐b673‐f999f1c876b0" TYPE="xfs"65 /dev/sdb1: UUID="78df7716‐e32f‐421e‐a756‐8fe89407e9ec" TYPE="ext4"66 /dev/sdb2: UUID="c905f4d2‐ae58‐41f8‐85e6‐69d1f0237ad2" TYPE="ext4"67 [root@centos mnt]#68 [root@centos mnt]# mount /dev/sdb1 /mnt/boot69 [root@centos mnt]# mount /dev/sdb2 /mnt/sysroot70 [root@centos mnt]# df ‐h71 Filesystem Size Used Avail Use% Mounted on72 /dev/mapper/cl‐root 50G 27G 24G 53% /73 devtmpfs 910M 0 910M 0% /dev74 tmpfs 920M 0 920M 0% /dev/shm75 tmpfs 920M 8.5M 912M 1% /run76 tmpfs 920M 0 920M 0% /sys/fs/cgroup77 /dev/sda1 1014M 185M 830M 19% /boot78 /dev/mapper/cl‐home 47G 33M 47G 1% /home79 tmpfs 184M 0 184M 0% /run/user/080 /dev/sdb1 4.8G 20M 4.6G 1% /mnt/boot81 /dev/sdb2 4.8G 20M 4.6G 1% /mnt/sysroot

開(kāi)始復(fù)制之前編譯好的文件

1 cp /usr/src/vmlinuz /mnt/boot/ #linux kernel2 cp /usr/src/initrd.gz /mnt/boot/ #ramdisk 內(nèi)存鏡像(來(lái)自于busybox改造)3 cp ‐a /usr/src/sysroot/* /mnt/sysroot/ #系統(tǒng)目錄集合(來(lái)自于busybox改造)4 [root@centos /]# tree mnt ‐L 25 mnt6 ├── boot7 │ ├── initrd.gz8 │ └── vmlinuz9 └── sysroot10 ├── bin11 ├── boot12 ├── dev13 ├── etc14 ├── home15 ├── lib16 ├── mnt17 ├── proc18 ├── root19 ├── sbin20 ├── sys21 ├── tmp22 ├── usr23 └── var

7.安裝grub引導(dǎo)程序到sdb1中

1 yum install grub2‐install #由于centos7以后采用的是grub2 所以直接安裝了這個(gè)2 [root@centos mnt]# grub2‐install ‐‐boot‐directory=/mnt/boot /dev/sdb #安裝到boot目錄下3 Installing for i386‐pc platform.4 Installation finished. No error reported.5 [root@centos boot]# ll6 total 92487 drwxr‐xr‐x. 5 root root 4096 Feb 6 08:25 grub28 ‐rw‐r‐‐r‐‐. 1 root root 1484989 Feb 6 08:03 initrd.gz9 ‐rw‐r‐‐r‐‐. 1 root root 7975904 Feb 6 08:04 vmlinuz10 [root@centos boot]#grub2‐mkconfig ‐o /mnt/boot/grub2/grub.cfg #為了方便我采用了先根據(jù)系統(tǒng)自動(dòng)生成,然后再編輯這個(gè)文件11 [root@centos boot]# vim /mnt/boot/grub2/grub.cfg #編輯內(nèi)容見(jiàn)下圖,去掉很多用不到的內(nèi)容

grub.cfg 文件內(nèi)容,僅僅保留了幾個(gè)核心的信息

1 # relay display2 set timeout=53 # entry4 menuentry 'My Linux' {5 insmod gzio6 insmod part_msdos7 insmod xfs8 set root='hd0,msdos1'9 linux16 /vmlinuz root=/dev/sda210 initrd16 /initrd.gz11 }

8.通過(guò)virtual 將剛剛創(chuàng)建的虛擬硬盤加載進(jìn)來(lái),并啟動(dòng)虛擬機(jī)。。。開(kāi)始見(jiàn)證奇跡的時(shí)候。
歡迎界面出現(xiàn),成功引導(dǎo)系統(tǒng)。


出錯(cuò)啦。。。

估計(jì)猜測(cè)分析:
由于系統(tǒng)啟動(dòng)的時(shí)候需要掛載/dev/sda2 這塊真正的rootfs 系統(tǒng),可是在加載內(nèi)存鏡像initrd.gz 后,想啟動(dòng)掛載rootfs的時(shí)候,找不到硬盤分區(qū)了。
這里有個(gè)我們打包的時(shí)候,在涉及 第三方模塊如ext4 驅(qū)動(dòng)的時(shí)候,是沒(méi)有打包到內(nèi)核中的,但是默認(rèn)是支持?jǐn)U展掛載的,所以采用修改initrd.gz 這個(gè)文件,這個(gè)時(shí)候就需要用到modules了(前面只是生成了,還沒(méi)有用到,所以需要先把這個(gè)modules打包進(jìn)initrd.gz中,讓他能找到ext4驅(qū)動(dòng))同時(shí)也順便把rootfs 的目錄中也一并處理成鏡像的樣子。
sysroot 和initrd 兩個(gè)目錄一樣操作:

1 cd /mnt/sysroot2 cp ‐a /usr/src/modules/lib usr/ #復(fù)制modules進(jìn)入這個(gè)文件夾3 mkdir usr/lib64 #創(chuàng)建空文件夾,只是為了規(guī)范一點(diǎn)4 ln ‐s usr/lib64 lib645 ln ‐s usr/lib lib6 #initrd 同樣操作7 cd /usr/src/initrd8 cp ‐a /usr/src/modules/lib usr/ #復(fù)制modules進(jìn)入這個(gè)文件夾9 mkdir usr/lib64 #創(chuàng)建空文件夾,只是為了規(guī)范一點(diǎn)10 ln ‐s usr/lib64 lib6411 ln ‐s usr/lib lib12 # 重新生成initrd.gz 由于模塊我沒(méi)有精簡(jiǎn)所以耗時(shí)比較久13 find . | cpio ‐H newc ‐‐quiet ‐o | gzip ‐9 > /usr/src/initrd.gz14 # 替換 舊的initrd.gz15 cp initrd.gz /mnt/boot/

通過(guò)修改init文件,我雖然進(jìn)去了鏡像系統(tǒng),但是由于始終沒(méi)有找到硬盤,導(dǎo)致rootfs沒(méi)有能進(jìn)入,也請(qǐng)各位大神幫忙解開(kāi)這個(gè)結(jié),我不知道哪里出了問(wèn)題。
開(kāi)始修改 init 不進(jìn)行rootfs轉(zhuǎn)換,直接進(jìn)入內(nèi)存系統(tǒng):

1 #!/bin/sh23 echo "Mounting proc and sys..."4 mount ‐t sysfs sysfs /sys5 mount ‐t proc proc /proc67 echo "Detect and export hardware infomation..."8 mdev ‐s910 exec /bin/sh11 把項(xiàng)目?jī)删湓捵⑨尩?,改成直接?zhí)行 exec /bin/sh 作為主進(jìn)程1213 echo "Mount real rootfs to /mnt/sysroot..."14 #mount ‐t ext4 ‐o ro /dev/sda2 /mnt/sysroot1516 echo "Switch to real rootfs..."17 # exec chroot /mnt/sysroot /sbin/init

這個(gè)時(shí)候內(nèi)存系統(tǒng)進(jìn)去了:



但是根本但是在/dev/ 下根本沒(méi)有sdaX的硬盤分區(qū)。首先驅(qū)動(dòng)也是有的,通過(guò)grub也是能看到的。

cat /proc/filesystems


進(jìn)入剛剛啟動(dòng)時(shí)候的grub界面,是能看到硬盤分區(qū)的:


---硬盤找不到的問(wèn)題已經(jīng)解決,補(bǔ)充進(jìn)去:
通過(guò)修改配置linux kernel 已經(jīng)解決硬盤找不到的問(wèn)題:

Device Drivers > SCSI device Support >SCSI Disk SupportSCSI generic support


以上通過(guò)修改內(nèi)核kernel配置后,終于找到了硬盤:

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
自制簡(jiǎn)單的Linux
手把手帶你自制Linux系統(tǒng)之六 編譯內(nèi)核及busybox完成系統(tǒng)定制
[轉(zhuǎn)]利用BusyBox ~私人定制 My LINUX~ - 姜名則
純手工打造mini linux實(shí)例
PHP5研究室 - 制作Linux的U盤啟動(dòng)盤 - Powered By phpv.net
linux用busybox制作ramdisk的腳本分享
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服