Linux系统启动流程(4)制作自定义linux之一
Linux系统启动流程(4)制作自定义linux之一
平时使用的服务器类型的linux系统一般都会装载各种软件与服务,而在某些情况下,并不能一直直接使用公司管理的系统,一是可能会出现故障,二是在处理一些小问题下可能无需如此庞大的linux。于是根据前几篇所讲的linux中的Centos6版本的系统启动流程,可以对其仿制一个微型的linux系统,里面只添加以下需要的工具即可。
以CentOS6为模板为例:
1、准备环境:VM的操作
这里以VM虚拟机模拟,所有直接对安装了CentOS的虚拟机添加一个新硬盘
需要添加一块新磁盘
注:要制作的虚拟硬盘文件路径要注意,这里新硬盘文件名为 lab2_1.vmdk
[root@mzf ~]# echo "- - -" >> /sys/class/scsi_host/host2/scan
[root@mzf ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 3.7G 0 rom sda 8:0 0 20G 0 disk ├─sda1 8:1 0 200M 0 part /boot ├─sda2 8:2 0 10G 0 part / ├─sda3 8:3 0 2G 0 part ├─sda4 8:4 0 1K 0 part └─sda5 8:5 0 7.8G 0 part /testdir sdb 8:16 0 20G 0 disk
说明:这里显示了sdb,为刚刚添加的第二块硬盘,下面需要对此进行新建分区。
#可以使用fdisk命令来创建两个分区(boot分区、根分区)
[root@mzf ~]# fdisk -l /dev/sdb | grep '^/dev/sdb[0-9]' /dev/sdb1 1 17 136521 83 Linux /dev/sdb2 18 83 530145 83 Linux
注意:两个分区的大小分别为/dev/sdb1:128M,/dev/sdb2:512M即可。
[root@mzf ~]# lsblk /dev/sdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 20G 0 disk ├─sdb1 8:17 0 133.3M 0 part └─sdb2 8:18 0 517.7M 0 part
for dev in `fdisk -l /dev/sdb | grep -o '^/dev/sdb[0-9]\>'`; do mke2fs -t ext4 ${dev} &> /dev/null; done
[root@mzf ~]# blkid /dev/sdb[0-9] /dev/sdb1: UUID="ba63b06d-ebc4-434f-9651-a357b274f30b" TYPE="ext4" /dev/sdb2: UUID="f5f15759-e8de-4e4b-bde8-3910d3e91228" TYPE="ext4"
#对刚才创建的分区(/dev/sdb{1,2})进行挂载 [root@mzf ~]# mkdir /mnt/boot && mount /dev/sdb1 /mnt/boot [root@mzf ~]# mkdir /mnt/sysroot && mount /dev/sdb2 /mnt/sysroot
[root@mzf ~]# mount | grep '^/dev/sdb[0-9]' /dev/sdb1 on /mnt/boot type ext4 (rw) /dev/sdb2 on /mnt/sysroot type ext4 (rw)
2、拷贝当前系统下的vmlinuz和initramfs.img文件
[root@mzf ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz [root@mzf ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img
[root@mzf ~]# grub-install --root-directory=/mnt /dev/sdb
4、在生成的/mnt/boot/grub目录下添加grub.conf文件
[root@mzf ~]# cat /mnt/boot/grub/grub.conf default=0 timeout=3 title Mini Linux root (hd0,0) kernel /vmlinuz or root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img
解析:这里需要设置内核参数selinux=0,然后将对应的kernel和initrd执行刚才拷贝的新问问文件路径及文件名。
[root@mzf ~]# ls -R /mnt/boot/ /mnt/boot/: grub initramfs.img lost+found vmlinuz/mnt/boot/grub: device.map fat_stage1_5 grub.conf jfs_stage1_5 reiserfs_stage1_5 stage2 vstafs_stage1_5 e2fs_stage1_5 ffs_stage1_5 iso9660_stage1_5 minix_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5/mnt/boot/lost+found:
说明:这里boot下和boot/grub的文件已经配齐,下面就开始/目录的操作了
[root@mzf sysroot]# ls bin boot etc home lib lib64 lost+found media mnt proc root sbin sys tmp usr var
6、在/mnt/sysroot/etc目录下提供fstab文件系统挂载配置
[root@mzf sysroot]# cat /mnt/sysroot/etc/fstab /dev/sda1 /boot ext4 defaults 1 1 /dev/sda2 / ext4 defaults 1 2
注:当然每个命令都有气对应依赖的库文件,所有要将其对应库文件一起拷贝,可以编写bash脚步来实现:下面为编写的脚本:
[root@mzf sysroot]# cat /testdir/copycmd.sh #!/bin/bash # readonly destPath="/mnt/sysroot";libcp() {libDir=`echo $1 | grep -o '^.*/\<'`[ ! -d ${destPath}${libDir} ] && mkdir -p ${destPath}${libDir};cp $1 ${destPath}${libDir} &> /dev/null;[ $? -eq 0 ] && echo "copy lib $1 finished." || echo "copy lib $1 error."; } cmdcp() {cmdDir=`echo $1 | grep -o '^.*/\<'`[ ! -d ${destPath}${cmdDir} ] && mkdir -p ${destPath}${cmdDir};cp $1 ${destPath}${cmdDir} &> /dev/null;[ $? -eq 0 ] && echo "copy cmd $1 finished." || echo "copy cmd $1 error."; }outprint() {if [ $# -eq 3 ]; thenecho "copy $1 $2 $3"; elif [ $# -eq 2 ]; thenif [ $2 == "not" ]; thenecho "$1 not is command!";elif [ $2 == "shell" ]; thenecho "$1 is shell builtin!";fielseecho "input $1 is null!";fi }messbox() {case $1 incy) outprint "cmd" "$2" "ok"; ;;cn) outprint "cmd" "$2" "error" ;;e) outprint "cmd" "$2" "exits"; ;;n) outprint "$2" "not"; ;;s) outprint "$2" "shell"; ;;ly) outprint "lib" "$2" "ok"; ;;ln) outprint "lib" "$2" "error"; ;;null) outprint "cmd"; ;;*) echo "wei zhi error."; ;;esac }copyFile() {pathDir=${1%/*};fileName=${1##*/};[ ! -d ${destPath}${parentDir} ] && mkdir -p ${destPath}${parentDir};cp $1 ${destPath}${parentDir} &> /dev/null;[ $? -eq 0 ] && messbox "cy" "${fileName}" || messbox "cn" "${fileName}"; }inprint() {read -p "please input add cmd:" cmdName;echo "${cmdName}"; }main() {cmdName=`inprint`;while [[ -z ${cmdName} ]] || [ ${cmdName} != 'quit' ]; do[[ -z ${cmdName} ]] && messbox "null" && cmdName=`inprint` && continue;if ! `which ${cmdName} &> /dev/null`; then! `type ${cmdName} &> /dev/null` && messbox "n" "${cmdName}" || messbox "s" "${cmdName}";cmdName=`inprint`;continue;filocal cmdPath=`which ${cmdName} | grep -v '^alias' | grep -o '[^[:space:]]\+'`;cmdcp ${cmdPath};for i in `ldd ${cmdPath} | grep -o '/.*lib\(64\)\{0,1\}[^[:space:]]\+\>'`; dolibcp ${i}; donecmdName=`inprint`done } main;
8、执行此文件,拷贝需要的/bin/bash、/bin/mount等命令
[root@mzf sysroot]# /testdir/copycmd.sh please input add cmd:bash copy cmd /bin/bash finished. copy lib /lib64/libtinfo.so.5 finished. copy lib /lib64/libdl.so.2 finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished. please input add cmd:ifconfig copy cmd /sbin/ifconfig finished. copy lib /lib64/libselinux.so.1 finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/libdl.so.2 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished. please input add cmd:ip copy cmd /sbin/ip finished. copy lib /lib64/libresolv.so.2 finished. copy lib /lib64/libdl.so.2 finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished. please input add cmd:insmod copy cmd /sbin/insmod finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished. please input add cmd:echo copy cmd /bin/echo finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished.
9、使用chroot切入/mnt/sysroot目录,能进入说明bash命令生效
[root@mzf sysroot]# chroot /mnt/sysroot/ bash-4.1# ls bin boot etchome lib lib64 lost+found media mnt procroot sbin sys tmp usr var bash-4.1# exit exit
10、这里重启机器即可,但是bash命令内部不能提供一些自定义的界面
[root@mzf sysroot]# dmesg | grep eth0 e1000 0000:02:01.0: eth0: (PCI:66MHz:32-bit) 00:0c:29:a3:5d:d7 e1000 0000:02:01.0: eth0: Intel(R) PRO/1000 Network Connection udev: renamed network interface eth0 to eth
解析:从上面可以指定,eth0网卡使用的e1000网卡驱动。
[root@mzf sysroot]# modinfo -n e1000 /lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
#使用depmod命令查看此e1000网卡模块文件是否依赖其它驱动
[root@mzf sysroot]# depmod `modinfo -n e1000`
提示:没有显示任何信息,说明没有对其它任何模块有依赖,因此只需要拷贝此文件即可
[root@mzf sysroot]# cp `modinfo -n e1000` /mnt/sysroot/lib64/modules/
[root@mzf sysroot]# /testdir/copycmd.sh please input add cmd:insmod copy cmd /sbin/insmod finished. copy lib /lib64/libc.so.6 finished. copy lib /lib64/ld-linux-x86-64.so.2 finished. please input add cmd:quit
#手动编写/mnt/sysroot/sbin/init脚步文件
[root@mzf ~]# cat /mnt/sysroot/sbin/init #!/bin/bash # echo -e "\t Welcome to \e[31m Meng Linux \e[0m" /sbin/insmod /lib64/modules/e1000.ko [ $? -eq 0 ] && echo -e "inet e1000 load \e[32m [ ok ]\e[0m" || echo -e "inet e1000 load \e[32m [ faileur ]\e[0m" /sbin/ifconfig lo 127.0.0.1/8 [ $? -eq 0 ] && echo "lo ip set ok" || echo "lo ip set eroor" /sbin/ifconfig eth0 10.1.250.250/16 [ $? -eq 0 ] && echo "eth0 ip set ok" || echo "eth0 ip set erro" mount -n -o remount,rw /dev/sda2 /bin/bash
注意:编写完成后一定要使用chmod +x /mnt/sysroot/sbin/init给其添加执行权限
13、修改grub.conf文件下的init启动脚本路径将init=/bin/bash改为init=/sbin/init,内容如下:
[root@mzf sysroot]# cat /mnt/boot/grub/grub.conf default=0 timeout=3 title Mini Linux root (hd0,0) kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/sbin/init initrd /initramfs.img
转载于:https://blog.51cto.com/mengzhaofu/1854043
Linux系统启动流程(4)制作自定义linux之一相关推荐
- grub2引导linux内核,一种基于grub2的linux系统启动bootloader的制作方法与流程
技术领域 本发明涉及服务器应用技术领域,具体涉及一种基于grub2的linux系统启动bootloader的制作方法. 背景技术: 当前linux系统的内核版本已经升级至4.0以上,最新的linux系 ...
- linux 系统重启过程,linux 系统启动流程
linux系统启动流程可以简单总结为以下几步 1)开机BIOS自检 2)读取MBR,进行MBR引导 3)启动bootloader 4)加载内核kernel 5)启动init进程,依据inittab文件 ...
- Linux 系统启动流程及其介绍
熟悉Linux系统启动流程可以更好的排除Linux系统在启动的过程中所遇到的错误,下面介绍Linux系统在启动过程. 开机,BIOS自检:检测外置设备,目的是为了把外围设备的信息提供给操作系统使用 寻 ...
- arm linux系统启动流程
===================================================== arm linux系统启动相关文章列表: arm linux系统启动流程 http://bl ...
- linux 打开设备 流程,Linux系统启动流程
1.linux系统启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分.负责完成对CPU.主板.内存.硬盘子系统.显示 ...
- Arm linux系统启动流程简介
文章目录 介绍 一.Bootloader 1.总体流程 二.Linux内核 1.总体流程 2.具体流程 总结 介绍 Arm Linux 系统启动流程可分为四个部分: 1.引导加载程序(bootload ...
- linux系统启动流程详解
系统启动流程(CentOS6) Post加电自检: 开机检查cpu.内存.磁盘等是否存在 Boot Sequence: BIOS:Basic Input and Output System 按照BIO ...
- 图解Linux系统启动流程
废话不多说,先上图 说明1:上图是Linux系统启动时的详细流程,其中黑色部分为主流程分支,蓝色部分为详细流程分支,绿色部分是注释部分.大家可点击查看大图. 说明2:增加了kernel和initrd间 ...
- linux系统启动流程及常见问题的解决
一.前言 计算机开机是一个神秘的过程.我们只是按了开机键,就看到屏幕上的进度条或者一行行的输出,直到我们到达登录界面.然而,计算机开机又是个异常脆弱的过程,我们满心期望的登录界面可能并不会出现,而是一 ...
最新文章
- php写实体类,PHP实体类
- 时钟极性和时钟相位概念
- 11种常见SQLMAP使用方法详解
- pyqt5多线程更新ui
- mysql命令行各个参数解释
- wincc远程服务器配置,wincc实现远程访问的方法
- scrapy 的三个入门应用场景
- Exception in thread “main“ java.lang.IllegalStateException: Failed to read 问题解决
- 【bzoj4897】[Thu Summer Camp2016]成绩单 区间dp
- java内存溢出无法创建线程_kafka生产者发送消息失败导致内存溢出java.lang.OutOfMemoryError:Java heap space,请教如何解决?...
- java二进制流_java读写二进制流
- 微信开发工具如何修改模拟页面路径
- Variable is already assigned to this value JAVA什么意思
- Win32多线程之被激发的对象(Signaled Objects)
- macbook蓝牙pan未连接_关于 MacBook 的电池问题,你了解多少
- 树莓派4b 4G 64位系统下安装opencv
- OpenCV python 图片镜像
- 直播预告 | 12位一作华人学者开启 ICLR 2022
- 诚立业科技面试经历.
- 阿里巴巴起诉迪拜“阿里巴巴币”公司商标侵权;腾讯云发布区块链TBaaS产品白皮书;韩国将要推出区块链证券
热门文章
- Android开机广播和关机广播
- 蓝桥杯第六届省赛JAVA真题----打印菱形
- css 实现一个尖角_一个讲述了 CSS 相关的技巧、动画实现 的开源项目(60篇相关文章)...
- a的n次方的最后三位数c语言,求13的n次方(12n≤130000000000)的最后三位数,用c++编程...
- JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据
- java实现语音发送,Java实现发送手机短信语音验证功能代码实例
- vue 执行函数this_在vue中使用回调函数,this调用无效的解决
- 计算机网络纳新水粉画,小学教育专业“书法诗画创作社团”顺利举办纳新活动...
- 管理学习(2)——职场中最重要的四件事
- 2022未来零售发展报告