實戰自制Linux操作系統

實戰自制Linux操作系統



自制linux系統

步驟概述:

1、新建一個硬盤
2、在該新硬盤上新建兩個分區,一個當boot分區,一個當/分區
3、格式化并且掛載兩個分區
4、安裝grub至目標磁盤
5、為grub提供配置文件
6、復制內核文件和initrd文件
7、創建目標主機根文件系統
8、移植bash命令和其庫文件到根文件系統
9、裝載模塊,實現網絡功能
10、啟動測試

具體操作步驟如下:

  1)為CentOS 6系統添加一塊新的硬盤,然后啟動,演示如下:

wKioL1fanDvzxq6sABaUN8GC7PE230.gif

 2)查看新添加的硬盤,并為添加好的磁盤分區,創建文件系統;

[root@CentOS6 ~]# fdisk -l /dev/sd[a-z]

Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0007eba7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            7860        9165    10490445   83  Linux
/dev/sda4            9166       10443    10265535    5  Extended
/dev/sda5            9166        9819     5253223+  83  Linux

Disk /dev/sdb: 21.5 GB, 21474836480 bytes   #可以看到新添加的硬盤 sdb
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

    分三個主分區,分別作為為根分區,swap分區和boot分區,并創建對應的文件系統,操作如下:

[root@CentOS6 ~]# fdisk /dev/sdb #創建分區,
#創建文件系統如下命令:
[root@CentOS6 ~]# mkfs.ext4 /dev/sdb1
[root@CentOS6 ~]# mkswap /dev/sdb2
[root@CentOS6 ~]# mkfs.ext4 /dev/sdb3
#查看創建好的分區
[root@CentOS6 ~]# blkid 
/dev/sdb1: UUID="f4921d76-f089-4cb6-8f47-aff34711cb7a" TYPE="ext4" 
/dev/sdb2: UUID="3eaa649e-a5c0-4f9c-8887-453368419238" TYPE="swap" 
/dev/sdb3: UUID="286c857d-8f52-465f-9ed6-8eeaa3363743" TYPE="ext4"

 3)創建一個boot目錄,并把boot分區(sdb1)掛載上;

[root@CentOS6 ~]# mkdir /mnt/boot
[root@CentOS6 ~]# mount /dev/sdb1 /mnt/boot
[root@CentOS6 ~]# df
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/mapper/vg0-root  20511356 1112808  18349972   6% /
tmpfs                   502068       0    502068   0% /dev/shm
/dev/sda1               194241   34199    149802  19% /boot
/dev/mapper/vg0-usr   10190136 2473060   7192788  26% /usr
/dev/mapper/vg0-var   20511356  489148  18973632   3% /var
/dev/sda5              5039592   10352   4766580   1% /home
/dev/sdb1               104769    1550     97598   2% /mnt/boot  # 掛載的設備sdb1

 4)創建grub,并查看;

[root@CentOS6 ~]# ls /mnt/boot/
lost+found
[root@CentOS6 ~]# grub-install --root-directory=/mnt /dev/sdb #創建grub
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)	/dev/fd0
(hd0)	/dev/sda
(hd1)	/dev/sdb
[root@CentOS6 ~]#  ls /mnt/boot/
grub  lost+found
[root@CentOS6 ~]#  ls /mnt/boot/grub/
device.map     fat_stage1_5  iso9660_stage1_5  minix_stage1_5     stage1  ufs2_stage1_5    xfs_stage1_5
e2fs_stage1_5  ffs_stage1_5  jfs_stage1_5      reiserfs_stage1_5  stage2  vstafs_stage1_5

    5)要想成為一個真正的系統,還需要內核文件,initrd以及grub/grub.conf這些文件;

[root@CentOS6 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
[root@CentOS6 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img
[root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf  #手動編寫配置文件
 default=0
 timeout=5
 title CentOS (Express)
         root (hd0,0) # 在當前下為第二塊磁盤應為(hd1,0),但是如果自其它設備上使用為(hd0,0)
     kernel /vmlinuz ro root=/dev/sda3  #加載的根目錄所在的分區,因為在其他設備上為第一塊磁盤所以為 /dev/sda3
     initrd /initramfs.img #內核匹配的ramfs文件

 6)要把/dev/sda3當做根文件系統,就需要掛載,并創建根文件系統下想對應的子目錄:

[root@CentOS6 ~]# mkdir /mnt/sysroot
[root@CentOS6 ~]# mount /dev/sdb3 /mnt/sysroot/
[root@CentOS6 ~]# cd /mnt/sysroot/
[root@CentOS6 sysroot]# ls
lost+found
[root@CentOS6 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys mnt var usr home root tmp media
mkdir: created directory `etc'
mkdir: created directory `bin'
mkdir: created directory `sbin'
mkdir: created directory `lib'
mkdir: created directory `lib64'
mkdir: created directory `dev'
mkdir: created directory `proc'
mkdir: created directory `sys'
mkdir: created directory `mnt'
mkdir: created directory `var'
mkdir: created directory `usr'
mkdir: created directory `home'
mkdir: created directory `root'
mkdir: created directory `tmp'
mkdir: created directory `media'
[root@CentOS6 sysroot]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usr  var

 7)根文件系統的目錄有了,但是要想運行還需要程序,還需要bash,以及基于動態編譯的共享庫文件

[root@CentOS6 sysroot]# cp /bin/bash /mnt/sysroot/bin  #復制bash
[root@CentOS6 sysroot]# ldd /bin/bash # 查看庫文件
	linux-vdso.so.1 =>  (0x00007ffd127d9000)
	libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003278e00000)
	libdl.so.2 => /lib64/libdl.so.2 (0x000000326f200000)
	libc.so.6 => /lib64/libc.so.6 (0x000000326f600000)
	/lib64/ld-linux-x86-64.so.2 (0x000000326ee00000)
 # 復制共享庫中的文件到創建的根目錄中的lib64下
[root@CentOS6 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64
[root@CentOS6 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64
[root@CentOS6 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64
[root@CentOS6 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64

 8)如上,基本的操作已經完成,使用 chroot 切換根,進行測試,如下:

[root@CentOS6 sysroot]# chroot /mnt/sysroot/    # 切換根
bash-4.1# 
bash-4.1# 
bash-4.1# ls  # 因為沒有復制命令,所以只能使用內建命令,如果需要使用外部命令,就把命令以及以依賴的庫復制過去就可以了。
bash: ls: command not found
bash-4.1# pwd                
/
bash-4.1# exit
exit

 9)最后,我們在編輯一下配置文件/mnt/boot/grub/grub.conf

[root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS (Express)
     root (hd0,0)   
     kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash  # 表示要求限定運行的的是/bin/bash 而不是 /sbin/init 這樣就直接把bash當做用戶空間的第一個進程來使用了
     initrd /initramfs.img

 10)最后同步一下

[root@CentOS6 ~]# sync

 11)我們新建一個虛擬機,把硬盤改為新創建好的磁盤,測試系統能否啟動?

wKiom1fbXj3BezK9AACC8PyI_Jc126.png

   啟動此虛擬機,如下圖:按e鍵可以看到我們創建的系統文件,選定內核,按b鍵啟動

wKioL1fbXraQpDp-ABToss86vNM266.gif

   選定內核,按b鍵啟動,發現系統報錯,什么原因呢?可能是沒有添加selinux策略

wKiom1fbYTHSmxD2AAAwuZm83uM581.png   選定內核,按e鍵,進入編輯模式,添加selinux=0 ,重新啟動,發現可以正常啟動

wKiom1fbYuTC4EwrAAAtjQb-BJQ839.png


到此,一個迷你版的Linux誕生了,可以裝在自己移動U盤等設備上面,這里不做過多解釋

原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/47762

(0)
zhumengxiaotaozhumengxiaotao
上一篇 2016-09-19
下一篇 2016-09-19

相關推薦

  • 數據結構知識點(list,tuple,冒泡法)

    分類 數值型 int、float、complex、bool 序列對象 字符串str、列表list、tuple 鍵值對 集合set、字典dict 數值型 complex:有實數和虛數部分組成 float:有整數和小數組成。只有雙精度 類型轉換 int(X) 返回一個整數 float(x) 返回一個浮點數 complex(x)、complex(x,y) 返回一個…

    2017-09-25
  • RAID各級別的特性及使用介紹(8.3博客作業)

    RAID各級別的特性及使用介紹 介紹: 獨立硬盤冗余陣列(RAID:Redundant Array of Independent Disks),舊稱廉價磁盤冗余陣列,簡稱磁盤陣列。 組成: 多塊磁盤,RAID控制器(硬件RAID、軟件RAID)     硬件RAID:自帶CPU的RAID卡,不消耗服務器資源,可通過備份…

    Linux干貨 2016-07-16
  • linux基礎知識

    基本命令,man自助使用手冊,linux文件目錄。

    Linux干貨 2017-12-11
  • 常見RAID級別原理, Linux中軟RAID實現方式詳解

    RAID簡介     RAID(Redundant Arry of Independent Disks)獨立冗余陣列,舊稱(Redundant Arry of Inexpensive Disks)廉價冗余陣列,其主要目的是將多個硬盤組成在一起來達到提高I/O、讀寫、冗余性。 RAID分為硬件RAID和軟件RAID &n…

    Linux干貨 2016-03-09
  • linux進程及作業管理

    linux進程及作業管理 cpu指令權限等級: 特權級也叫hierarchical protection domains, 有的也叫用戶態. 是一種用來保護數據和阻止惡意行為的機制. 電腦操作系統提供不同權限訪問級別的資源. 特權級分為四級, 特權級0,1,2,3. 在windows中只使用特權級0和特權級3, 特權最高的是特權級0, 可以直接操作硬件, 如…

    Linux干貨 2016-09-19
  • Linux 下的幫助及文件管理

    1、whatis     whatis command 或 man -f command     僅能提供命令基本的介紹。不提具體用法。     基于數據庫的查找,優點:檢索速度快;缺點:缺乏實時性    &n…

    2017-07-15
欧美性久久久久