写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正。如有不明白的地方,愿可一起探讨。


本文主要目的


本文并不是要真正的去构建一个自己的Linux的系统,而是通过制作Linux系统的过程中,更加清晰的理解Linux系统的启动流程,实践检验真理嘛。

Linux系统启动的简要流程


为了明白制作Linux系统的简单步骤,下面给出Linux系统启动的简要流程图:

本文主要进行的步骤:

1.制作grub,编辑grub.conf配置文件;

2.编译内核并将其复制到相应目录;

3.编辑/sbin/init并配置其执行环境;

准备工作


虚拟宿主机上添加一块大小为10G的SCSI磁盘(Cl7)并将其分区格式化(具体如何添加,这里就不进行说明了,望理解):

# fdisk /dev/sdbn p 1  +50M n p 2  +512M n p 3  +512M t 3 82 w
# kpartx -af /dev/sdb
# partx -a /dev/sdb
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2
# mkswap /dev/sdb3
# mkdir /mnt/boot
# mkdir /mnt/sysroot
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot

再添一台虚拟主机(Cl7),并将虚拟宿主机中所添加的磁盘作为其启动盘

提示:在新建虚拟主机(Cl7)过程中,当到达"Select a Disk"对话框这一步时,选择"Use an existing virtual disk"选项;点击Next后点击Browse...按钮找到虚拟宿主机所添加的那块磁盘即可。

安装GRUB并编辑grub.conf配置文件


安装GRUB

[root@localhost ~]# grub-install --root-directory=/mnt/ /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/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

编辑grub.conf配置文件

[root@localhost ~]# vim /mnt/boot/grub/grub.conf

default=0
timeout=5
title Mini-Linux (3.13.6-cl7)root (hd0,0)kernel /bzImage ro root=/dev/sda2 init=/sbin/init

将数据同步到磁盘

# sync
# sync
# sync

挂起虚拟宿主机,启动Cl7这台虚拟主机看看效果

看到了吗?这红色框里就是我们在grub.conf里所编辑的title那行!

呀,怎么文件没有找到?找到了才不正常呢!因为我们根本就没有提供这个文件哦。接下来,我们就来定制、编译内核并将其添加进来。

定制并编译内核


# tar xf linux-3.13.6.tar.xz -C /usr/src/
# cd /usr/src/
# ln -sv linux-3.13.6/ linux
# cd linux
# make allnoconfig
# make menuconfig

接下来就是选择所需要的内核模块,*表示将其编译进内核,除了默认选项外,本文需要添加内容

[*] 64-bit kernelGeneral setup --->()Local version - append to kernel release-cl7[*] System V IPC
[*] Enable loadable module support --->[*] Module unloading
-*- Enable the block layer --->[*] Block layer SG support v4
Processor type and features --->[*] Symmetric multi-processing supportProcessor family (Generic-x86-64) --->(X) Core 2/newer Xeon
Bus options (PCI etc.) --->[*] PCI support
Executable file formats / Emulations --->[*] Kernel support for ELF banaries[*] Kernel support for scripts starting with #!
[*] Networking support --->[ ] Wireless ----Networking options ---><*> Unix domain sockets[*] TCP/IP networking[*] IP: multicasting[*] IP: advanced router[*] TCP: advanced congestion control --->< > The IPv6 protocol ----
Device Drivers --->Generic Driver Options --->[*] Maintain a devtmpfs filesystem to mount at /dev[*] Automount devtmpts at /dev, after the kernel mounted the rootfsSCSI device support ---><*> SCSI device support<*> SCSI disk support[*] Fusion MPT device support ---><*> Fusion MPT ScsiHost drivers for SPI[*] Fusion MPT logging facility[*] Network device support --->[*] Ethernet driver support --->[*] Intel devices<*> Intel (R) PRO/1000 Gigabit Ethernet support<*> Intel (R) PRO/1000 PCI-Express Gigabit Ethernet support其他选项全部去掉[ ] Wireless LAN ----Input device support ---><*> Mouse interface[*] Keyboards --->[*] Mice --->[*] USB support ---><*> Support for Host-side USB<*> xHCI HCD (USB 3.0) support<*> EHCI HCD (USB 2.0) support<*> OHCI HCD (USB 1.1) support<*> UHCI HCD (most Intel and VIA) support
File systems ---><*> The Extended 4 (ext4) filesystem

保存退出,编译内核

# make -j 4
# cp arch/x86_64/boot/bzImage /mnt/boot/

将数据同步到磁盘

# sync
# sync
# sync

挂起虚拟宿主机,启动Cl7这台虚拟主机看看效果

红框里的意思为:执行/sbin/init失败,究其原因在于没有找到init。这就对了,因为我们根本就没有提供这个文件,因此,接下来,我们就来提供此文件。

编辑/sbin/init并配置其执行环境


建立根文件系统文件

# cd /mnt/sysroot/
# mkdir -pv proc sys dev etc/init.d usr sbin bin root home var mnt media tmp

编辑init文件

[root@localhost ~]# vim /mnt/sysroot/sbin/init

#!/bin/bash
echo -e "Welcome to \033[35mMini-Linux\033[0m"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -n -t devtmpfs none /dev
mount -n -o remount,rw /dev/sda2/bin/bash

设置init为可执行并检查其是否有语法错误

# chmod +x /mnt/sysroot/sbin/init
# bash -n /mnt/sysroot/sbin/init

在init文件中要使用需要bash来执行程序,因此我们得为其提供执行环境。本文使用bincp.sh脚本将命令及其所以来的库复制到相应的目录中,bincp.sh脚本如下:

#!/bin/bash
#
target=/mnt/sysroot/
[ -d $target ] || mkdir $target
preCommand() {if which $1 &> /dev/null; thencommandPath=`which --skip-alias $1`return 0elseecho "No such command."return 1fi
}
commandCopy() {commandDir=`dirname $1`[ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}[ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}
libCopy() {for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; dolibDir=`dirname $lib`[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}[ -f ${target}${lib} ] || cp $lib ${target}${libDir}done
}
read -p "Plz enter a command: " command
until [ "$command" == 'quit' ]; doif preCommand $command ; thencommandCopy $commandPathlibCopy $commandPathfiread -p "Plz enter a command: " command
done

执行bincp.sh脚本,复制几个命令

[root@localhost ~]# bash bincp.sh

Plz enter a command: bash
Plz enter a command: ls
Plz enter a command: mount
Plz enter a command: umount
Plz enter a command: quit

将数据同步到磁盘

# sync
# sync
# sync

挂起虚拟宿主机,启动Cl7这台虚拟主机看看效果

在上图中,将鼠标点击进去并敲Enter键得到bash提示符

仔细查看上图,其实bash提示符在敲Enter键之前已经出现了,只是被后来的信息淹没在浩瀚的海洋中,不容易被察觉而已!!!

以上内容仅仅是提供了一个bash程序以及系init脚本,对于系统服务以及获得bash提示符之前的很多内容并没有添加进来。接下来的工作就是为这个Mini-Linux系统提供系统服务和bash执行环境等内容。

转载于:https://blog.51cto.com/muluhe/1545584

自己动手制作(DIY)一个Mini-Linux系统相关推荐

  1. 详解基于busybox、dropbear、ngnix制作完整的嵌入式Linux系统

    说明:         <一>:查看此博文,建议查看笔者上一篇博文(Linux启动过程),因为只有在完全了解Linux系统启动流程及一些配置文件的相关性,在阅读此博文才能有思路,理解起来更 ...

  2. U盘/光盘制作windows系统和linux系统

    U盘/光盘制作windows系统和linux系统 一 所需材料 1. UltraISO破解版(后附下载地址) 2. 相应的系统映象文件ISO,不同版本不一样,有自己需求的可以选择不一样,一般Windo ...

  3. mini电脑做linux,自己动手做一个Mini Linux

    今天我们来一步步手动构建一个小于10M的类嵌入式Linux系统,所谓"工欲善其事,必先利其器",所以我们得先准备一下工具才能完成Mini Linux的构建. 环境准备 1.宿主机系 ...

  4. 小型linux系统 u盘,U盘上的迷你 mini linux系统——BabyLinux 基于LFS 6.1

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 BabyLinux 说明 一,简介 欢迎下载和使用U盘上的迷你linux系统--BabyLinux (USB Key Drive Edition) Bab ...

  5. linux把2块盘挂到一个分区,linux系统如何挂载第二块硬盘

    云主机有两块硬盘,第一块硬盘盘一般为10G,用于安装系统,第二块磁盘根据云主机类型不同,大小也不相同.我们建议您在使用的时候第二块硬盘作为数据盘,存放你的网站数据,这样在您恢复系统的时候,数据盘的数据 ...

  6. 删除一个软件linux系统,linux操作系统删除软件

    linux系统可不像windows那么方法可以直接在控制页面中或程序管理中删除不要的软件了,在linux中必须使用命令方式来删除软件哦,下面学习啦小编来给大家介绍卸载Linux系统中软件具体方法. l ...

  7. win 系统下制作U盘安装 linux系统

    win 系统制作U盘安装硬盘镜像 用ultraiso_v9.5.3.2901将Centos.iso写进U盘. 安装过程全程区分大小写. 过低的ultraiso不能正确读取文件. 本文所有资料均能在网上 ...

  8. DIY一个简易查询系统

    前段时间应网友需求计划做一个简洁的"中药毒副作用查询"小工具 原料: 网友们提供了不少资料.最简洁的还属这个名单: http://www.meoncn.cn/Item/3595.a ...

  9. linux中查找某一个字符串,Linux系统下,在文件中查找某个字符串

    android获取手机信息大全 IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) ...

最新文章

  1. 2修改字段名_DevExpress ASP.NET v18.2新功能详解(二)
  2. 以太网例程_开关量转以太网的应用
  3. STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树
  4. Linux用ctrl + r 查找以前(历史)输入的命令
  5. Introduce Explaining Variable(引入解释性变量)
  6. xshess 要继续使用此程序,您必须应用最新的更新
  7. CCF201503-2 数字排序
  8. oracle修改用户密码命令_oracle 11g dba用户秘密修改其他用户密码
  9. IntelliJ IDEA 2017 MySQL5 绿色版 Spring 4 Mybatis 3 配置步骤详解(二)
  10. 多种方法去除按钮以及链接点击时虚线
  11. 基站定位php,基于Python的移动联通基站接口调用代码实例
  12. Mysql 计算年龄函数
  13. 计算机专业本科一批,本科一批招生计划
  14. 新浪微博相册图片外链限制,图床不显示解决方法总结!
  15. Share:win10的日语输入法切换快捷键
  16. 二维码之zxing二维码解析图片资源
  17. Yii框架zii.widgets.grid自定义按钮
  18. Windows桌面下面任务栏无法点击(卡住)的解决办法
  19. SylixOS 延时工作队列实现原理详解
  20. 打蚊子表情包_打蚊子表情包 - 打蚊子微信表情包 - 打蚊子QQ表情包 - 发表情 fabiaoqing.com...

热门文章

  1. java -cp ***.jar WordCount 无法找到类名解决方案记录
  2. dropout的原理
  3. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔
  4. c++和java哪个难_前端和Java开发哪个难?哪个学习容易一点?
  5. 《系统集成项目管理工程师》必背100个知识点-47质量保证人员(QA)的主要工作...
  6. Redirecting to /bin/systemctl restart sshd.service
  7. Linux系统服务(systemctl)的使用
  8. Python极简入门:数据类型、条件语句、循环语句、异常处理
  9. 从个人到团队:思维转变是关键
  10. WebService入门教程_Schema学习