实战自制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.178linux.com/47762

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

相关推荐

  • 高可用keepalived结合haproxy代理WordPress(动静分离)

    (1)A  B两台服务器做keepalived高可用,同时作为haproxy动静分离后端代理。         (keepalived时主备模型,haproxy轮询调度) (2)C 服务器搭建apache作为动态资源服务器 (3)D 服务器搭建nginx作为静态资源服务器 (4)VIP:172.18.0.42…

    2017-05-20
  • M22 Centos6上编译安装httpd2.4并实现HTTPS浏览

    随着网络技术的发展,人们对信息安全越来越重视,传统的http浏览互联网的方式由于未经加密,其安全性广为人们诟病,https协议作为加密的互联网解决方案解决了这一问题。下面我就简要说明下如何实现通过https发布web页面的。   实验目的: 模拟Centos6上安装httpd2.4,并实现https加密访问主页 实验器材: Centos6.8虚拟机…

    Linux干货 2017-04-20
  • 设计模式(十一)代理模式Proxy(结构型)

    1.概述        因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供…

    Linux干货 2015-07-09
  • 树 非线性结构 树是n(n >= 0)个元素的集合: (1)每个元素称为结点(node); (2)有一个特定的结点,称为根结点或根(root); (3)除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子集又都是一棵树(称为原树的子树Subtree) 注意 n = 0时,称为空树 树只有一个特殊的没有前驱的元素,称为树的根(Ro…

    2017-10-16
  • MairaDB之基于openssl的主从复制

    一、配置openssl   1、   在master server(node0)上根CA的搭建(及生成自签名证书) [root@node0 ~]# cd /etc/pki/CA/ [root@node0 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Gen…

    2016-11-19
  • 第十八周博客作业

    1、为LNMP架构添加memcached支持,并完成对缓存效果的测试报告; 操作系统: CentOS 7.210.0.0.51 nginx+php+mysql10.0.0.52 memcached 一. 环境准备: 搭建LNMP编译安装环境 1. 配置163的yum源和阿里云的epel源 [root@localhost ~]# mv /etc/yum.rep…

    2017-07-12