您的位置:首页 > 运维架构 > Linux

Linux系统启动流程(4)制作自定义linux之一

2016-09-19 14:26 162 查看
Linux系统启动流程(4)制作自定义linux之一平时使用的服务器类型的linux系统一般都会装载各种软件与服务,而在某些情况下,并不能一直直接使用公司管理的系统,一是可能会出现故障,二是在处理一些小问题下可能无需如此庞大的linux。于是根据前几篇所讲的linux中的Centos6版本的系统启动流程,可以对其仿制一个微型的linux系统,里面只添加以下需要的工具即可。 以CentOS6为模板为例:
1、准备环境:VM的操作这里以VM虚拟机模拟,所有直接对安装了CentOS的虚拟机添加一个新硬盘
需要添加一块新磁盘


注:要制作的虚拟硬盘文件路径要注意,这里新硬盘文件名为 lab2_1.vmdk 2、检查硬盘如果是在开机状态,添加的新硬盘,可以使用命令重新扫描
[root@mzf ~]# echo "- - -" >> /sys/class/scsi_host/host2/scan

#扫描完成后,使用lsblk命令查看是否有新硬盘
[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即可。#查看刚才创建的分区大小,使用lsblk命令
[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

解析:这里的大小显示误差不会印象,下面为此创建文件系统。
#使用mke2fs命令来创建ext4文件系统
for dev in `fdisk -l /dev/sdb | grep -o '^/dev/sdb[0-9]\>'`; do mke2fs -t ext4 ${dev} &> /dev/null;  done

#创建完成后可以通过blkid来查看当前块设备及类型
[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"

解析:此时两个分区以及建立了ext4文件系统。
3、具体制作步骤:1、挂载文件系统
#对刚才创建的分区(/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
3、使用grub-install命令安装grub
[root@mzf ~]# grub-install --root-directory=/mnt /dev/sdb
注意:因为当前boot为独立分区,那么其父级目录为/mnt
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执行刚才拷贝的新问问文件路径及文件名。
#再次确定/mnt/boot下的文件
[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的文件已经配齐,下面就开始/目录的操作了
5、在/mnt/sysroot挂载点下创建/目录结构
[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
7、拷贝一些必要的命令文件
注:当然每个命令都有气对应依赖的库文件,所有要将其对应库文件一起拷贝,可以编写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 ]; then
echo "copy $1 $2 $3";
elif [ $# -eq 2 ]; then
if [ $2 == "not" ]; then
echo "$1 not is command!";
elif [ $2 == "shell" ]; then
echo "$1 is shell builtin!";
fi
else
echo "input $1 is null!";
fi
}

messbox() {
case $1 in
cy)  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;
fi
local cmdPath=`which ${cmdName} | grep -v '^alias' | grep -o '[^[:space:]]\+'`;
cmdcp ${cmdPath};
for i in `ldd ${cmdPath} | grep -o '/.*lib\(64\)\{0,1\}[^[:space:]]\+\>'`; do
libcp ${i};
done
cmdName=`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命令内部不能提供一些自定义的界面
11、因此添加网络服务
(1)添加对应的网卡模块驱动#查看当前系统网卡使用的模块驱动
[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网卡驱动。
#查看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`
提示:没有显示任何信息,说明没有对其它任何模块有依赖,因此只需要拷贝此文件即可
#拷贝e1000.ko网卡模块文件
[root@mzf sysroot]# cp `modinfo -n e1000` /mnt/sysroot/lib64/modules/
(2)使用脚本拷贝insmod模块加载命令
[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
12、系统启动时提供欢迎界面,以及网卡设备服务
#手动编写/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
14、挂起当前虚拟机,然后新建一个虚拟机,选择使用此磁盘


注意:一定是一个没有任何硬盘的空虚拟机,不然会有问题,选择使用已有的硬盘,其路径一定要选择对,不然自己都晕了。 15、启动新建的虚拟机查看其效果


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 服务器 虚拟机