自制linux与内核编译

自制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

(0)
forestforest
上一篇 2016-09-13
下一篇 2016-09-13

相关推荐

  • linux如何获取帮助以及基础目录命名标准

    一、linux的命令分为两种,一种是内建命令,即包含在shell当中的,一种是外部命令,通常保存在 bin目录中。 1、对于内部命令:  通常使用 help COMMAND 2、对于外部命令:  通常使用 man command  mannul的位置/usr/share/man man的内容通常分为以下几块   1、N…

    Linux干货 2016-10-30
  • 数组

    一.数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 索引:编号从0 开始,属于数值索引  注:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0 版本之后开始支持,bash 的数组支持稀疏格式(索引不连续) 二.数组的声明 declare -a ARRAY_NAME decla…

    Linux干货 2016-11-23
  • Linux的用户组和权限(一)

    导读:本章主要内容如下       1.解释Linux的安全模型      2.解释用户账号和组群账号的目的      3.用户和组管理命令      4.理解并设置文件权限 &n…

    Linux干货 2016-08-04
  • find命令归纳

    首先,find可以实现以下方式查找 文件名:-name -iname -regex 文件类型:-type TYPE:(f,d,l,s,b,c,p) 文件大小:-size [+|-]#UNIT #UNIT(k,M,G)范围(由小到大):[0,#-1](#-1,#](+#,oo) 时间戳:-{a|m|c}time -{a|m|c}min  范围(现在到…

    Linux干货 2016-04-19
  • N24_阿龙弟弟 学习计划/目标/宣言

    嗨,大家好,这是我的第一篇文章。很高兴来到马帮门徒这个大家庭。 学习计划:没有自己的计划,跟着马哥课程的进度来吧,以周为单位,确保每周任务完成; 学习目标:掌握应有的运维能力,做一名合格的Linux运维工程师,提升自我价值,过更好的生活; 学习宣言:Be a better man(Not Only Linux)!

    Linux干货 2016-10-25

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-20 09:48

    前面写的比较简单,后面对命令的总结很完整。实验过程中复制bash和库文件的脚本怎么没有附加上来?我们应该尽量把整个实验流程完整的写下来哦。