私人订制属于自己的Linux系统

私人订制属于自己的Linux系统,第1张

概述简介 Linux *** 作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们后来 简介

linux *** 作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在linux内核还是开源软件等方面,都为我们后来人提供了一个良好的学习和研究环境。

  本文主要通过裁剪现有linux系统,根据自己的需要,打造一个属于自己的linux小系统,让其能够具备linux的一些常用小功能。

原理启动流程介绍

制作linux小系统之前,我们有必要再了解一下linux的启动流程

# 1、首先linux要通过POST自检,检查硬件设备有没有故障# 2、如果有多块启动盘的话,需要在BIOS中选择启动磁盘# 3、启动MBR中的bootloader引导程序# 4、加载内核文件# 5、执行所有进程的父进程、老祖宗init# 6、打印欢迎界面

在linux的启动流程中,加载内核文件时还需要借助别外两个文件

# 1)initrd,是CentOS5上用内存模拟的磁盘设备# 2)initramfs,是CentOS6上用内存模拟的文件系统

在启程的流程中,init主要是用来做哪些 *** 作的呢?

init通过调用/etc/inittab这个配置文件,然后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本

*** 作步骤目标磁盘分区

我们先在一个已有的CentOS6系统上添加一块大小为20G的硬盘.

添加完成后,我们打开宿主机,使用fdisk来给我们新加的硬盘分区

如果添加了硬盘,lsblk,fdisk -l看不到,又不想重启机器可以使用下面命令

echo "- - -" >  /sys/class/scsi_host/host0/scanlsblk name        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda           8:0    0   20G  0 disk ├─sda1        8:1    0    1G  0 part /boot└─sda2        8:2    0   19G  0 part   ├─cl-root 253:0    0   17G  0 lvm  /  └─cl-swap 253:1    0    2G  0 lvm  sdb           8:16   0   20G  0 disk sr0          11:0    1  4.1G  0 rom fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2).Changes will remain in memory only,until you decIDe to write them.Be careful before using the write command.Command (m for help): nPartition type:   p   primary (0 primary,0 extended,4 free)   e   extendedSelect (default p): pPartition number (1-4,default 1): First sector (2048-41943039,default 2048): Using default value 2048Last sector,+sectors or +size{K,M,G} (2048-41943039,default 41943039): +200MPartition 1 of type linux and of size 200 MiB is setCommand (m for help): nPartition type:   p   primary (1 primary,3 free)   e   extendedSelect (default p): pPartition number (2-4,default 2): First sector (411648-41943039,default 411648): Using default value 411648Last sector,G} (411648-41943039,default 41943039): Using default value 41943039Partition 2 of type linux and of size 19.8 GiB is setCommand (m for help): pdisk /dev/sdb: 21.5 GB,21474836480 bytes,41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesdisk label type: dosdisk IDentifIEr: 0xe97b6d01   Device Boot      Start         End      Blocks   ID  System/dev/sdb1            2048      411647      204800   83  linux/dev/sdb2          411648    41943039    20765696   83  linuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.# 对分区进行格式化mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdb2# 创建一个文件夹进行挂载,此处名字必须是bootmkdir /mnt/boot -pmount /dev/sdb1 /mnt/boot/
安装grub至目标磁盘

我们直接用grub-install --root-directory=/mnt命令来安装。用这个命令会安装grub引导第二阶段的文件。

grub-install --root-directory=/mnt /dev/sdbProbing 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# 验证下是否安装成功hexdump -C -n 512 /dev/sdb00000000  eb 63 90 00 00 00 00 00  00 00 00 00 00 00 00 00  |.c..............|00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|*00000050  00 00 00 00 00 00 00 00  00 00 00 80 01 00 00 00  |................|00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 be 05 7c  |. ..d|<.t...R..||00000090  b4 41 bb aa 55 cd 13 5a  52 72 3d 81 fb 55 aa 75  |.A..U..ZRr=..U.u|000000a0  37 83 e1 01 74 32 31 c0  89 44 04 40 88 44 ff 89  |[email protected]..|000000b0  44 02 c7 04 10 00 66 8b  1e 5c 7c 66 89 5c 08 66  |D.....f..\|f.\.f|000000c0  8b 1e 60 7c 66 89 5c 0c  c7 44 06 00 70 b4 42 cd  |..`|f.\..D..p.B.|000000d0  13 72 05 bb 00 70 eb 76  b4 08 cd 13 73 0d 5a 84  |.r...p.v....s.Z.|000000e0  d2 0f 83 de 00 be 85 7d  e9 82 00 66 0f b6 c6 88  |.......}...f....|000000f0  64 ff 40 66 89 44 04 0f  b6 d1 c1 e2 02 88 e8 88  |[email protected]..........|00000100  f4 40 89 44 08 0f b6 c2  c0 e8 02 66 89 04 66 a1  |[email protected].|00000110  60 7c 66 09 c0 75 4e 66  a1 5c 7c 66 31 d2 66 f7  |`|f..uNf.\|f1.f.|00000120  34 88 d1 31 d2 66 f7 74  04 3b 44 08 7d 37 fe c1  |4..1.f.t.;D.}7..|00000130  88 c5 30 c0 c1 e8 02 08  c1 88 d0 5a 88 c6 bb 00  |..0........Z....|00000140  70 8e c3 31 db b8 01 02  cd 13 72 1e 8c c3 60 1e  |p..1......r...`.|00000150  b9 00 01 8e db 31 f6 bf  00 80 8e c6 fc f3 a5 1f  |.....1..........|00000160  61 ff 26 5a 7c be 80 7d  eb 03 be 8f 7d e8 34 00  |a.&Z|..}....}.4.|00000170  be 94 7d e8 2e 00 cd 18  eb fe 47 52 55 42 20 00  |..}.......GRUB .|00000180  47 65 6f 6d 00 48 61 72  64 20 44 69 73 6b 00 52  |Geom.Hard disk.R|00000190  65 61 64 00 20 45 72 72  6f 72 0d 0a 00 bb 01 00  |ead. Error......|000001a0  b4 0e cd 10 ac 3c 00 75  f4 c3 00 00 00 00 00 00  |.....<.u........|000001b0  00 00 00 00 00 00 00 00  01 6d 7b e9 00 00 00 20  |.........m{.... |000001c0  21 00 83 9f 06 19 00 08  00 00 00 40 06 00 00 9f  |!..........@....|000001d0  07 19 83 d4 a2 32 00 48  06 00 00 b8 79 02 00 00  |.....2.H....y...|000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|00000200
安装内核文件和initrd文件

将内核文件和initrd文件复制到/dev/sdb下的boot目录中

cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/
建立grub.conf文件

上面已经移植了内核和initrd文件,我们可以根据其版本编写grub.conf文件

vim /mnt/boot/grub/grub.confdefault=0timeout=3Title linux ownerkernel /vmlinuz-2.6.32-573.el6.x86_64 root=UUID=1feac471-08c5-4b5b-aaff-bb6a1da60e26 selinux=0 init=/bin/bashinitrd /initramfs-2.6.32-573.el6.x86_64.img

注意

我们要把selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误

创建一级目录并复制文件

创建开机后的一级目录,同时把/dev/sdb2挂载至/mnt/sysroot,使该目录作为根目录:

mkdir  /mnt/sysrootmkdir -pv /mnt/sysroot/{etc,tmp,var,usr,sys,proc,opt,home,root,dev,mnt,media}

 复制文件,复制文件我们通过脚本执行,复制我们平时常用的命令即可,小编这里复制了ls,ifconfig,bash,reboot,rm,modprobe,mount,ip,mkdir,touch,cat,vi,less,shutdown,insmod。我们可以用tree查看一下这些命令的复制情况:

#!/bin/bash# 定义变量destdir=/mnt/sysrootSETcolor_FAILURE="echo -en \033[1;35;5m"SETcolor_norMAL="echo -en \033[0m" echo_jiantou() {echo -en \033[40G$SETcolor_FAILURE} echo_copy() {echo -en \033[80G$SETcolor_FAILUREecho -n $"复制完成!"$SETcolor_norMAL} # 定义函数# 复制命令copy_cmd(){#       定义变量         local cmd_path=`which --skip-alias $cmd`         local cmd_dir=`dirname $cmd_path`         local cmd_destdir=$destdir$cmd_dir         if [ ! -d $cmd_destdir ] ;then                 mkdir -pv $cmd_destdir &> /dev/null         fi         cp $cmd_path $cmd_destdir &> /dev/null         echo -e "\t$cmd_path `echo_jiantou` \t $cmd_destdir `echo_copy` "} #复制库文件 判断库文件是否存在,若存在,跳过该次循环;如不存在,判断库文件所在目录是否存在,若存在,复制库文件;若不存在,则新建目录并复制库文件copy_libfile(){         local cmd_path=`which --skip-alias $cmd`         local lib_List=`ldd $cmd_path |egrep -o "/.* " `         for i in  $lib_List ;do                 local lib_dir=$destdir$i                 local lib_destdir=$destdir`dirname $i`                 echo -e "\t$i `echo_jiantou` \t $lib_destdir `echo_copy` "                 if [ -e $lib_dir ];then                         continue                 elif [ -d $lib_destdir ];then                         cp  $i $lib_destdir                 else                         mkdir -pv $lib_destdir &> /dev/null                         cp  $i $lib_destdir                 fi         done }# 若/mnt/sysroot不存在,则创建if [ ! d $destdir ];then         mkdir $destdirfi #死循环,清空屏幕 while true ; do         tput clear# 正式:cat <<-EOF*************************************************************************                      命令复制脚本                                ******                     请输入一个命令                               ******                   按q或quit退出脚本                              *************************************************************************EOF          read -p "Please input a execute command:" cmd         if [ "$cmd" == 'q' -o "$cmd" == 'quit' ];then                 unset cmd destdir                 break         fi #       判断输入的命令是否存在         if [ -n "$cmd" ];then                 which --skip-alias "$cmd" &> /dev/null                 if [ $? -eq 0 ];then                         copy_cmd $cmd                         copy_libfile $cmd                 else                         echo "$cmd is not exist"                 fi         else                 echo "Please enter at leastone command"         fi         echo -e "Please enter \033[31;1menter\033[0m and we continue"         read inputdone# 执行脚本需要在后面加参数*************************************************************************                      命令复制脚本                                ******                     请输入一个命令                               ******                   按q或quit退出脚本                              *************************************************************************Please input a execute command:cat	/bin/cat                        	 /mnt/sysroot/bin 复制完成! 	/lib64/libc.so.6                	 /mnt/sysroot/lib64 复制完成! 	/lib64/ld-linux-x86-64.so.2     	 /mnt/sysroot/lib64 复制完成! # 下面是我cp的命令tree /mnt/sysroot//mnt/sysroot/├── bin│   ├── bash│   ├── cat│   ├── ls│   ├── mkdir│   ├── mount│   ├── rm│   └── touch├── dev├── etc├── home├── lib64│   ├── ld-linux-x86-64.so.2│   ├── libacl.so.1│   ├── libattr.so.1│   ├── libaudit.so.1│   ├── libblkID.so.1│   ├── libcap.so.2│   ├── libcrypt.so.1│   ├── libc.so.6│   ├── libdbus-1.so.3│   ├── libdl.so.2│   ├── libfreebl3.so│   ├── libgcc_s.so.1│   ├── @[email protected]│   ├── libnih-dbus.so.1│   ├── libnih.so.1│   ├── libnsl.so.1│   ├── libpcre.so.0│   ├── libpthread.so.0│   ├── libresolv.so.2│   ├── librt.so.1│   ├── libselinux.so.1│   ├── libsepol.so.1│   ├── libtinfo.so.5│   ├── libutil.so.1│   └── libuuID.so.1├── media├── mnt├── opt├── proc├── root├── sbin│   ├── ip│   ├── reboot│   └── shutdown├── sys├── tmp├── usr│   ├── bin│   │   ├── less│   │   └── vim│   └── lib64│       ├── libgpm.so.2│       └── perl5│           └── CORE│               └── libperl.so└── var19 directorIEs,39 files
复制网卡驱动

我们基本工作已经完成了,如果想使这个虚拟机带有网卡功能,我们就必须把网卡驱动拷过来,具体 *** 作如下:

# 查询网卡详细信息modinfo e1000filename:       /lib/modules/2.6.32-573.el6.x86_64/kernel/drivers/net/e1000/e1000.koversion:        7.3.21-k8-NAPIlicense:        GPLdescription:    Intel(R) PRO/1000 Network Driverauthor:         Intel Corporation,<[email protected]>srcversion:     43DCE0C8FB4DD663A55F0C5# 将网卡模块路径复制到/mnt/sysroot的库文件下cp /lib/modules/2.6.32-573.el6.x86_64/kernel/drivers/net/e1000/e1000.ko  /mnt/sysroot/lib64/# 接下来我们可以关机,将/dev/sdb这个硬盘拆下来,放到新虚拟机运行
测试开机

我们创建一个新的虚拟机,启动的时候会带一个硬盘,我们不用它的,删掉再把我们自己定义的硬盘加进去,

注意,将以前磁盘全删掉,然后重新添加,添加时选择使用现有虚拟磁盘

此时,我们做好的硬盘已经加进去了。我们可以试试能不能启动了,如果虚拟机可以正常开启,就说明我们的实验成功

实现网络功能
# 手动添加网卡驱动insmod /lib64/e1000.ko# 查看ipip a# 添加IP地址ifconfig eth0 192.168.252.62/24 up # 查看ipip a# 可以用其他机器Ping一下这台机器,如果能Ping通说明联网也没问题,至此就OK了
总结

以上是内存溢出为你收集整理的私人订制属于自己的Linux系统全部内容,希望文章能够帮你解决私人订制属于自己的Linux系统所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1015734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存