制作最简化的Linux系统

本文只是为了演示Linux系统启动过程所必要的元素,并非真正意义上的功能完备的Linux系统。

我的环境是VMware虚拟机,CentOS-6.7-x86_64操作系统。

首先为虚拟机添加一块磁盘,我这里使用默认20G,其实不需要这么大,不过虚拟机嘛,你不选立即分配,它也不会真的占那么大空间。

首先对它进行分区,使用MBR分区表。规划三个分区,一个boot分区200M,一个swap分区2G,剩余空间都给根分区。

[[email protected] ~]# parted -s /dev/sdb mklabel msdos
[[email protected] ~]# parted -s /dev/sdb mkpart primary 2048s 200M
[[email protected] ~]# parted -s /dev/sdb mkpart primary 200M 2200M
[[email protected] ~]# parted -s /dev/sdb mkpart primary 2200M 100%
[[email protected] ~]# partx -a /dev/sdb
[[email protected] ~]# mkfs.ext4 /dev/sdb1
[[email protected] ~]# mkswap /dev/sdb2
[[email protected] ~]# mkfs.ext4 /dev/sdb3
[[email protected] ~]# parted -s /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number  Start   End     Size    Type     File system     Flags
 1      1049kB  200MB   199MB   primary  ext4
 2      200MB   2200MB  2000MB  primary  linux-swap(v1)
 3      2200MB  21.5GB  19.3GB  primary  ext4

在/mnt目录下建立目录作为最简化系统的根,将规划作为根分区/dev/sdb3的挂载至该目录。

[[email protected] mnt]# mkdir sysroot
[[email protected] mnt]# mount /dev/sdb3 /mnt/sysroot/

在/mnt/sysroot目录下建立FHS目录结构

[[email protected] ~]# cd /mnt/sysroot/
[[email protected] sysroot]# for d in $(ls /); do mkdir -v $d; done
mkdir: created directory `bin‘
mkdir: created directory `boot‘
mkdir: created directory `dev‘
mkdir: created directory `etc‘
mkdir: created directory `home‘
mkdir: created directory `lib‘
mkdir: created directory `lib64‘
mkdir: cannot create directory `lost+found‘: File exists
mkdir: created directory `media‘
mkdir: created directory `misc‘
mkdir: created directory `mnt‘
mkdir: created directory `net‘
mkdir: created directory `opt‘
mkdir: created directory `proc‘
mkdir: created directory `root‘
mkdir: created directory `sbin‘
mkdir: created directory `selinux‘
mkdir: created directory `srv‘
mkdir: created directory `sys‘
mkdir: created directory `tmp‘
mkdir: created directory `usr‘
mkdir: created directory `var‘

将boot分区/dev/sdb1挂载至/mnt/sysroot/boot

[[email protected] sysroot]# mount /dev/sdb1 /mnt/sysroot/boot
[[email protected] sysroot]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg0-root   20G  301M   19G   2% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             190M   36M  145M  20% /boot
/dev/mapper/vg0-usr   9.8G  2.0G  7.4G  21% /usr
/dev/mapper/vg0-var    20G  136M   19G   1% /var
/dev/sdb3              18G   45M   17G   1% /mnt/sysroot
/dev/sdb1             180M  1.6M  169M   1% /mnt/sysroot/boot

在sdb上安装grub,可以看到Grub将grub目录安装到了/mnt/sysroot/boot目录下了。其实还有部分代码是直接写入了磁盘的物理扇区上,比如stage1是直接写入了MBR的前446字节,而根据boot分区的文件类型不同,会将相应的stage1_5代码也写入磁盘的物理扇区靠前的位置,这里应该写的是e2fs_stage1_5。

[[email protected] sysroot]# grub-install --root-directory=/mnt/sysroot/ /dev/sdb
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/sysroot//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
[[email protected] ~]# ls /mnt/sysroot/boot/grub/
device.map     ffs_stage1_5      minix_stage1_5     stage2           xfs_stage1_5
e2fs_stage1_5  iso9660_stage1_5  reiserfs_stage1_5  ufs2_stage1_5
fat_stage1_5   jfs_stage1_5      stage1             vstafs_stage1_5

直接使用CentOS-6的内核和伪根文件系统,不搞那么复杂了,版本号都不要了。

[[email protected] boot]# cd /mnt/sysroot/boot
[[email protected] boot]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 ./vmlinuz
[[email protected] boot]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img ./initramfs
[[email protected] boot]# ls
grub  initramfs  lost+found  vmlinuz

内核启动完成后,还需要启动系统初始化程序,不过真的完成整个系统初始化过程,需要很多其他程序协作,太过复杂。其实也可以随便指定一个别的程序,这里我们为了简化,直接启动一个bash,所以需要把bash移植过去。

[[email protected] ~]# which bash
/bin/bash
[[email protected] ~]# cp /bin/bash /mnt/sysroot/bin/

仅是这样还不够,bash是运行不起来的,它还依赖一些库文件,因此这些库文件也需要移植。

[[email protected] ~]# ldd /bin/bash 
linux-vdso.so.1 =>  (0x00007ffe8fbba000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003e81000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003e76c00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003e77000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003e76800000)
[[email protected] ~]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
[[email protected] ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/

现在还缺一个grub的配置文件,可以自己动手一个。因为我们是准备把这块硬盘拆下来,挂到另一个新建的虚拟机上,所以那个新建的虚拟机只有这一块盘,(hd0,0)和/dev/sda3就是这么来的。另外CentOS启动时默认就会加载SELinux,而这个简化的系统什么都没有,所以它会影响启动,要把它关掉。

[[email protected] ~]# cat /mnt/sysroot/boot/grub/grub.conf 
default 0
timeout 5
title MiniLinux
	root (hd0,0)
	kernel /vmlinuz root=/dev/sda3 selinux=0 init=/bin/bash
	initrd /initramfs

所有这些做完之后,执行N遍sync命令,通知内核将改变立即写入磁盘,然后关机或挂起。

新建一个虚拟机,使用在选择磁盘处选择使用刚刚修改的这块磁盘,然后启动。

可以看到grub正常启动了。

bash也正常启动起来了。

可以看到,除了bash的内建命令外,其他的命令都无法执行,所以说这只是一个演示系统启动流程的最简化的Linux系统,距离拥有完备功能的Linux系统还很远。

时间: 2024-10-14 08:17:19

制作最简化的Linux系统的相关文章

编译内核制作一个小型的linux系统

前言 今天我将会给大家带来如何定制一个属于自己linux系统,也就是编译内核,那为什么要编译内核呢? 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统管理,决定着系统的性能和稳定性.Linux作为一个自由软件,在广 大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一 个更高效,更稳定的内核,就需要重新编译内核 对开源操作系统(主要是指Linux)的内核源代码在本机进行

制作busybox完成自制Linux系统及远程登录和nginx安装测试

前言系统定制在前面的博文中我们就有谈到过了,不过那个裁减制作有简单了点,只是能让系统跑起来而,没有太多的功能,也没的用户登录入口,而这里我们将详细和深入的来谈谈Linux系统的详细定制过程和实现用户例如.远程登录和Nginx安装过程.一步一步从头开始定制属于我们自己的系统. 正文首先我们先来简单的介绍一下我们这里定制属于自己的Linux系统的基本元素,其中一些相关的信息也可以参考我前面写过的博文 一个定制的linux内核+一个定制的busybox就可以定制一个小型的Linux操作系统了,安装Dr

bash编程之 ~制作Mini Linux系统~

说明1:在一个Linux宿主机系统上,通过以上步骤,可以制作一个微小的Linux系统(可以放置在U盘中等),然后在其它的主机(虚拟机或者物理机)上运行,以实现最小化定制系统的目的. 说明2:上图中黑色部分是主要流程,蓝色部分是详细流程,棕色部分是注释说明等 对于上图中几点细节的详解: 阶段 说明 目标磁盘分区格式化挂载 目标磁盘是/dev/sdb,大小为1G,分区sdb1:100M,sdb2:500M即可 安装grub至目标磁盘 无 复制内核和initrd文件 VERSION是内核版本,如2.6

linux系统应用层基础面试题目(很完整,暂时没看)

一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标识. 4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块. 5. 链接分为: 硬链接 和 符号链接 . 6. 超级块包含了i节点表 和 空闲块表 等重要的文件系统信息. 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为: 64

Linux系统运维常见面试题汇总

一.填空题 1.?在Linux?系统 中,以文件方式访问设备 . 2. Linux?内核引导时,从文件/etc/fstab中读取要加载的文件系统 . 3. Linux?文件系统中每个文件用indoe节点来标识. 4.?全部磁盘块由四个部分组成,分别为引导块?.专用块?.?i?节点表块?和?数据存储块?. 5.?链接分为:硬链接?和?符号链接?. 6.?超级块包含了i?节点表?和?空闲块表?等重要的文件系统信息. 7.?某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数

制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统

转自网络,供学习记录使用,红色部分是我实验时,这篇文章和网站稍有出入的地方. 目的:制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统 在http://wiki.analog.com/resources/eval/user-guides/ad-fmcomms2-ebz/quickstart/zynq(姑且把这个链接成为链接1吧)链接中找到 图1 点击绿色字体的链接,下载镜像原始文件.这里有不同时期的版本,本说明中选择 图2 下载的原始文件为:2014_R2-

手把手带你自制Linux系统之二 简易Linux制作

手把手带你自制Linux系统之二 简易Linux制作 本文利用CentOS5.5自带内核制作一个Mini Linux. 打开准备工作中创建的CentOS,为另一个虚拟机MiniLinux添加一个最小Linux所需要的文件. 1. 创建分区 为准备好的磁盘创建两个主分区,大小分别为20M和512M. 使用fdisk命令创建分区详细过程: fdisk /dev/hda 创建第一个20M分区依次输入: n --> p --> 1 --> <Enter> --> +20M 这几

linux系统移植和根文件系统制作

1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRAVERSION = .1 其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4.2.5.

在Linux系统下用dd命令制作ISO镜像U盘启动盘

http://os.51cto.com/art/201510/494762.htm 首先在 Linux 系统中打开终端,确认 U 盘路径: sudo fdisk -l 使用 dd 命令,格式如下: sudo dd if=xxx.iso of=U盘路径 完整示例: sudo dd if=~/images/ubuntu.iso of=/dev/sdb 向 sdb 磁盘写入位于-/images目录下的 ubuntu.iso 镜像文件 输完上述DD命令后回车执行,系统就开始制作启动盘了,期间终端命令窗口