自制Linux系统
1分区并创建文件系统
fdisk/dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2挂载boot
mkdir/mnt/boot
mount /dev/sdb1 /mnt/boot
?
3安装grub
grub-install –root-directory=/mnt/ dev/sdb
4、建立grub.conf:
vim /mnt/boot/grub/grub.conf
title wanglinux
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
5、恢复内核和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
6、创建一级目录
mkdir/mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir–pv/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
7、vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
8、复制bash和相关库文件
9、复制相关命令及相关库文件
如:ls,cat,vim,reboot,hostname等
/boot/config-2.6.32-504.el6.x86_64 这个文件记录了这个系统所有的内置模块,以及有没有启用信息。后面是y的就是打进vmlinuz-2.6.32-504.el6.x86_64这个内核文件里边了,是M的就是以模块形式放在/lib/modules.
需要在网上下载内核文件linux-3.18.41.tar.xz解压缩然后创建个软连接linux
编译安装内核之前,需要安装编译工具
yum grouplist
找到 Development Tools安装
“`
(1)cp /boot/config-2.6.32-504.el6.x86_64 /usr/src/linux/.config
cd /usr/src/linux
make menuconfig
(配置内核选项)(因为拷贝过来的是模板,要挑选需要的模块)
会报错,需要安装别的包
yum -y install "curses*"
make -j 内核数
“`
内核设计体系:单内核,微内核
linux:单内核,但充分借鉴微内核体系设计的优点:为内核引入了模块化机制
内核的组成部分:
kernel:内核核心,一般为bzimage,通常位为/boot目录,一般我们看到这个文件,就说明内核文件没用了,在系统启动时已经被加载过,开机后不在被使用,放在目录里,方便我们后期管理.
kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/.
A.内核模块与内核核心版本一定要严格匹配;
B.内核模块化的主要动因:为了能够支持第三方厂商的硬件设备及其驱动程序,可以引进内核模块化的方式设计,这样每一个厂商都可以把自己的设备驱动写成内核模块,当用到这个设备时,单独编译这个内核模块.针对于当前内核的源码树,编译这个模块,并装载到内核上就可以使用了;
C.在对内核的编译中,定义某个内核的功能,分为三种选择:
[ ]:N 编译时不启动功能,留空
[M]:Module 编译成内核模块,用到时临时装载,只占用磁盘空间,不占用内核内存空间
[*]:Y 直接编译进内核核心,只要内核在,功能就在,不用装载.
D.内核:动态装载和卸载
ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;能直接驱动,ramdisk就不需要;不能驱动,就需要借助ramdisk封装驱动,不仅包括设备的驱动程序,也可以包括设备上的格式化所提供的逻辑设备,比如说lVM,文件系统;如果都编译成模块的话,都可以加载到内核中.
借助于ramdisk,能加载的驱动,包括为:
目标设备驱动,例如:ISCSI设备的驱动
逻辑设备驱动,例如:LVM设备的驱动
文件系统,例如:XFS文件系统
ramdksk:是一个简装版的根文件系统;不能作为一个操作系统使用,因为运行在内存中,缺少长久性,所以操作系统必须在持久性存储设备上,这也是做根切换的原因.提供设备驱动,仅仅是为了能够让内核找到真正的根文件系统.
内核信息查看:
uname命令:
-a, –all 全部显示
-s, –kernel-name 内核名称
-n, –nodename 节点名称(主机名)
-r, –kernel-release 内核发行号
-v, –kernel-version 内核编译版本号
-m, –machine 硬件架构类型
-p, –processor cpu类型
-i, –hardware-platform 硬件平台名称
-o, –operating-system 操作系统类型
模块信息查看:
lsmod命令:显示当前内核已加载的模块名,模块大小,被引用次数,被什么模块所引用
抽取/proc/modules的信息,lsmod抽取内核自己的输出接口的信息,以人性化的方式输出.
modinfo命令:显示指定模块文件的详细信息
无论模块是否被装载,都可以用modinfo查看,modinfo就是通过获取/lib/modules目录下与当前内核版本同名的目录下的模块原数据文件,加以显示的.模块原数据文件类似于rpm包的元数据数据库,可以支持查询操作,需要专门的命令.每个文件都是经过hash格式编码,文件里面的都是键值对,从中查找数据的性能是O1(恒定)的,衡量一个算法的标准,O1,On,Olocaln..
选项:
-F:只显示指定字段的信息
-a:
-n:显示文件路径,相当于 -F filename,
-k:默认显示当前内核信息,要想显示其他内核的相关模块,使用-k选项指明kernel,和模块名
模块信息管理:
modprobe命令:模块动态装载和卸载
modpobe [-r] mod_name
模块动态装卸载也可以基于文件实现,-c指明配置文件,默认是/etc/modprobe.d/*.conf文件
选项:
装载模块: modprobe 模块名 被依赖的模块也会被装载
卸载模块: modprobe- r 模块名 正在使用的和默认装载的模块千万不要卸载,会影响系统使用
depmod命令:生成模块依赖关系
内核模块依赖关系文件及系统信息映射文件的生成工具
大多数命令选项,不使用;只有在新增模块时,这个模块依赖于其他模块,不得不手动改写模块文件.自己手动执行drpmod命令
在对另外一个的内核文件生成依赖关系,并且保存文件也不放在/boot目录下,才有必要使用-b,-F,-E 选项指明内核文件,和内核模块
模块装载和卸载的另一组命令:
insmod命令:
insmod [filename][module options…]
filename:模块文件的文件路径,配合modinfo -n 查看模块文件路径
rmmod命令:
rmmod [module_name(模块名)]
ramdisk文件的管理:
不是直接生成的,而是由命令管理的
(1)mkinitrd命令: centos5 但6,7也有连接
为当前使用中的内核重新制作ramdisk文件
文件名:
centos5:initrd-2.6.32-504.30.3.el6.x86_64kdump.img
centos6,7:initramfs-2.6.32-504.30.3.el6.x86_64.img
命令格式:
mkinitrd [OPTION…] [<initrd-image>] <kernel-version>
–with=<module>:除了默认的模块之外需要装载至initramfs中的模块,重新制作ramdisk的重要原因,添加新的模块.
–preload=<module>:initramfs所提供的模块需要预先装载的模块;
示例: mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2)dracut命令 centos 6,7
较为底层的生成ramdisk文件的工具
#dracut [OPTION…] [<initrd-image>] <kernel-version>
示例:dracut /boot/initramfs-$(uname -r).img $(uname -r)
内核信息输出的伪文件系统:
/proc/:内核状态和统计信息的输出接口.可以通过各种文件系统直接管理.同时,还提供一个配置接口,/proc/sys;
参数:
只读:信息输出;/proc下以数字命名的目录,只是用来输出某进程的相关信息./例如:/proc/#/*
可写:可接受用户指定一个"新值"来实现对内核某功能或特性的配置;写权限只有管理员拥有./proc/sys/
专门用来修改用于支持修改其值的参数,从而能够让我们实现配置内核参数的
伪文件系统的参数与/proc/sys/目录下的每个文件有映射关系,都相对与/proc/sys/目录而言,每个参数对应着我们所看到的/proc/sys/目录下的每个文件, 文件路径中的斜杠分隔符替换成点号,就成为参数名;
示例:net/ipv4/ip_forward相当于net.ipv4.ip_forward
修改方式:
(1)sysclt命令
专用于查看或设定/proc/sys/目录下参数的值
命令使用格式:
sysclt [options] [variable[=value]]
查看:
#sysclt -a 查看全部信息
#sysclt variable 指定参数名称 variable为文件目录的简装路径,以点分隔
修改其值:
#sysclt -w variable=value
(2)文件系统命令(cat,echo)
伪文件系统,不能使用文本编辑器去直接编辑,而应该使用重定向的方式覆盖原值
查看:
#cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
设定:使用覆盖重定向修改内核参数
echo "node1" > /proc/sys/kernel/hostname
注意:上述两种方式的设定仅当前内核有效,内核或系统重启,配置失效
(3)配置文件
有可能是两种文件,
centos 5,6: /etc/sysctl.conf
centos7: /etc/sysctl.d/*.conf 分隔成多段配置
修改配置文件,不会立即生效,下次启动系统
立即有效:重读此配置文件,通知让sysctl命令重读此文件,并根据此文件的设定,来修改内核参数相关值即可
sysctl -p [/PATH/TO/CONFLG_FILE] 从指定文件中加载内核参数的相关设定,默认读取/etc/sysctl.conf,可指定其他文件,但最好在/etc/sysctl.d/目录下.
内核参数:
1.net.ipv4.ip_forward,核心路由转发功能
2./proc/sys/vm/drop_caches:回收内存
0:
1:
2:
3./proc/sys/kernel.hostname:主机名
4./proc/sys/net/ipv4/icmp_exho_ignore_all
忽略别人ping自己,自己可以ping 别人
/sys/目录:
挂载的是sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设定参数;对此些参数的修改,即可定制硬件设备工作特性;
[root@Wencx ~]# ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
块设备,总线,
不同目录,通过不同视角对各设备划分的类别;根据总线划分,根据类别划分等等,另外也会根据某些特殊内容做些不同类的输出,或者说很多文件,很多设备所输出的位置不止一个目录,但是在多个目录下指向的同一个文件或设备.对一个linux主机来讲,每一个硬件设备被访问就要有设备文件,设备文件在/dev/目录下,内核怎么知道不同用户会有哪些硬件设备呢?事先不得而知.那应该准备怎样的设备文件来让内核识别呢?不知道的情况下,只能全部列出所有的设备文件,linux内核2.4以后在/dev/目录下有两万多个设备文件,无法预测用户用到哪些设备,所以把用户但凡用到的全创建出来,那么有两个问题?一.用户使用的很少,大多数文件浪费,虽不占用磁盘空间,但文件数量过大,二,没办法通过设备文件判断某个设备的存在./sys/目录在linux2.6内核引入后,使得我们能够按需创建设备文件,意思是说,每一次当内核系统完成自身初始化的时候,它会自动探测识别出每一个硬件设备信息,而后在把设备信息在系统启动完后,在内核初始化完后,在根文件系统挂载后,在重新探测输出到/sys/目录下,有多少硬件都在/sys/目录下显示.但是有些设备没有设备文件,就会临时读取/sys/目录下的设备信息,给它按需创建设备文件.对/dev/目录来说至关重要.
udev:通过读取/sys/目录下的硬件设备信息按需为各硬件设备创建设备文件.是用户空间程序,不能直接跟硬件打交道,/sys/目录的存在才让udev读取硬件设备信息.专用命令:devadmin,hotplug;
当根文件挂载完成后,系统初始化已经结束,系统就不会输出硬件信息./sys/目录的存在就会强制内核重新输出一遍内核信息,把内核中的各硬设备信息输出至/sys/目录下,而这时候udev就会通过读取/sys/目录下的硬件设备信息按需为各硬件设备创建设备文件.
/dev/目录下许多文件是Udev创建的,还有一些是内核创建的,比如说内核还要识别/sda硬盘,如果不能识别sda硬盘,标识为一个设备的话,怎么挂载设备?为了让设备访问正常,内核自动通过devtmpfs(设备临时文件系统),为每个内核必须用到的设备创建一个设备文件,这些设备文件可以在根文件系统挂载以后,从内核直接移到/dev/目录下,但不是完全移动,剩下的拷到udev,
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d目录下,以及在/usr/lib/rules.d/目录下;
/etc/udev/rules.d/70-persistent-net.rules文件,更改网卡配置文件的定义,并更改
原创文章,作者:forest,如若转载,请注明出处:http://www.178linux.com/46166
评论列表(1条)
前面写的比较简单,后面对命令的总结很完整。实验过程中复制bash和库文件的脚本怎么没有附加上来?我们应该尽量把整个实验流程完整的写下来哦。