其实内核就是系统上面的一个文件,包含了驱动主机各项硬件的检测程序与驱动模块,而Linux的内核是单内核体系,且是模块化的
内核的组成部分:
核心文件:/boot/vmlinuz-VERSION
模块文件:/lib/modules/VERSION/
*.ko: 模块间或许存在依赖关系;
ramdisk: 非必须性内容;只是用于实现内核在无法加载根文件设备时提供
内核模块管理:
lsmod命令:列出已经装载的模块
另一种办法:# cat /proc/modules
modinfo: 查看指定模块的详细信息
modinfo [OPTIONS] MOD_NAME
-n模块名: 只显示模块文件路径
显示出的信息中:
depends: 显示被此模块所依赖的其它模块;
例: modinfo -n e1000
modprobe命令:实现模块的装载和卸载
装载:modprobe MOD_NAME
注意:会自动解决依赖关系;
例:modprobee1000
卸载:modprobe -r MOD_NAME
例:modprobe-r e1000
手动实现模块文件装载和卸载
装载:insmod命令
insmod/path/to/module_file
注意:不会自动解决依赖关系;
例:insmod`modinfo -n ext3`
卸载:rmmod命令
rmmodMOD_NAME
例:rmsmod ext3
与内核交互:
/proc伪文件系统接口
每个文件名均是内核参数,目录名为内核参数节点(子系统或子功能)信息;
例: net.ipv4.ip_forward = 1
/proc/sys/net/ipv4/ip_forward
/proc下的只读文件:输出内核信息
/proc下的读写文件:可修改的内核工作特性/proc/sys目录下
伪文件系统:文件不能够直接使用编辑器编辑;修改方法:
(1) echo
echo"New_Value" > /proc/sys/path/to/somefile
例:echo "lx">/proc/sys/kernel/hostname
(2) sysctl -w
sysctl-w path.to.somefile=New_Value
例如:/proc/sys/net/ipv4/ip_forward
echo"1" > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
注意:此两种设定立即生效,但内核重启后无效;
(3) 内核参数配置文件/etc/sysctl.conf
path.to.paramter= NEW_VALUE
例:net.ipv4.ip_forward =1
注意:此种设定不能立即生效;使其生效的方式:sysctl -p或重启
查看当前运行中的内核的所有参数及其值:sysctl -a
/sys伪文件系统接口:
伪文件系统:sysfs;主要用于输出内核识别出的各硬件设备的相关属性信息;还能够让用户修改某些参数的值来改变硬件的工作特性;
用户空间的应用程序:udev通过读取/sys目录下保存硬件设备的相关信息来为每个当前内核探测到的硬件设备创建设备文件;创建设备文件的文件权限、名称等属性是可定制的;
udev有规则文件:/etc/udev/rules.d/
例如:修改网卡设备名字;
vim /etc/udev/rules.d/70-persistent-net ;要生效则要先卸载网卡模块,在装上即可;即modprobe -r e1000 在modprobe e1000
ramdisk:
uname命令:
-r: 内核的release号;
-n: 主机名;
-a: 显示所有信息;
ramdisk制作:
CentOS5: mkinitrd
CentOS6: dracut, mkinitrd
dracut [OPTION]... <p_w_picpath> <kernel-release>
-m LIST: 模块列表
-d LIST: 驱动列表
例如:#dracut /boot/initramfs-$(uname -r).img $(uname -r)
手动修改:
展开initramfs文件:
#cp initramfs-2.6.32-504.el6.x86_64.img /tmp
#cd /tmp
#mv initramfs-2.6.32-504.el6.x86_64.img initramfs-2.6.32-504.el6.x86_64.img.gz
#gzip -d initramfs-2.6.32-504.el6.x86_64.img
#mkdir ramdisk
#cd ramdisk
#cpio -id < ../initramfs-2.6.32-504.el6.x86_64.img
归档:
#find . | cpio -o -H newc --quiet > /boot/myramdisk.img
#gzip /boot/myramdisk.img
#mv /boot/myramdisk.img.gz /boot/myramdisk
常用的内核参数:/proc/sys
kernel.hostname:主机名
net.ipv4.ip_forward: 本机的路由功能,开启或关闭在接口之间转发报文的功能;
/proc/sys/net/ipv4/icmp_echo_ignore_all:0表示不忽略所有人的ping请求,1表示忽略
内核编译:
准备工作:
(1) 要充分获知目标硬件设备的信息;
(2) 充分获知目标系统平台的各相关信息,如文件系统类型等;
(3) 打算启用的新功能;
(4)准备好软件开发环境及内核源代码树;
获取硬件设备信息:
(1)CPU
#cat /proc/cpuinfo
#lscpu
#x86info -a
(2)PCI
#lspci [-v]
#lsusb [-v]
#lsblk
(3)hal-device
hal:hardware abstract layer
开发环境及源码:
(1) 安装开发包组:Development Tools, Server Platform Development
(2) 获取内核源码:www.kernel.org
内核编译步骤
1.解压内核源码
tar -Jxf linux-3.10.67.tar.xz
2.内核功能的选择
进入解压的目录下,用make menuconfig命令选定配置:
用空格键切换:
[ ] 不启用此功能
[M] 编译成内核模块
[*] 编译进内核
注意:要保存退出;所有选定的配置会保存在.config隐藏文件中;
3.编译:
(1)在解压的目录下用make命令先创建MakeFile文件
# make help:获取make命令的使用帮助
选定配置(其中一种即可,但偶尔会结合两种或以上的方式进行):
# make config:遍历每个选项
# make menuconfig:打开文本窗口
# make xconfig:Qt窗口,依赖于KDE开发组件;
# make gconfig:gtk窗口,依赖于GTK开发组件;
# make allnoconfig: 所有可选择项均不选择;
结果会保存至内核选项的配置文件中:.config
(2)安装内核模块:
#make modules_install
安装在/lib/modules/VERSION
(3)安装内核:
#make install
注:编译时可以在终端使用screen命令,以免断开连接等意外
screen命令:
打开:# screen
终止:# exit
拆除:Ctrl+a, d
查看所有已经打开的screen ID:# screen -ls
恢复连接至某screen: # screen -r SCREEN_ID
4.重启系统,即可选择使用新内核
内核编译进阶:
1、在原有曾经编译过的内核源码基础上再次进行重编译之前,要清理源代码;
# make clean: 保留.config配置文件及外部模块的相关文件;
# make mrproper:删除所有编译生成的文件,包括.config和各种备份文件;
# make distclean: 相当mrproper,以及删除编辑器备份及补丁文件,相当于编译之前;
2、只编译其中部分代码:
(1) 只编译选定目录中的代码
#make dir/
(2) 只编译一个模块
#make dir/file.[oisS]
(3) 完整编译一个模块
#make dir/file.ko
3、查看内核版本信息
#make kernelrelease
#make kernelversion
4、只编译内核核心,不编译模块
#make bzImage
5、交叉编译
编译操作所在的平台非目标代码运行的平台,事实上,目标代码将运行于另一个不同的平台;
#make ARCH=arch_name
要获取目标平台的帮助:
#make ARCH=arch_name help
例如:
#make ARCH=arm bockw_defconfig
CentOS系统安装:
安装过程:通过安装程序anaconda来进行;
bootloader--> vmlinuz, initrd.img --> anaconda
anaconda支持两种模式:
GUI:图形界面
text:文本界面
anaconda把安装过程分成三个阶段:
安装前配置阶段:
键盘类型
语言
时区
管理员密码
磁盘及其分区方式
要安装的程序包
安装阶段:
在目标磁盘创建分区、执行格式化;
将选定的程序包安装至目标磁盘;
生成bootloader;
第一次启动:
配置iptables, selinux, core dump
系统安装的基本分区:
/ : 根分区
swap:交换分区
注意:如果根分区放置于逻辑卷,由于grub无法驱动并访问逻辑卷,就必须将/boot单独分区,并使用基本磁盘分区
anaconda支持通过读取kickstart配置文件的内容来完成安装过程的配置:
系统安装后会在管理员的家目录下生成/root/anaconda-ks.cfg,用于保存其安装配置信息
kickstart文件即/root/anaconda-ks.cfg的组成:
命令段
程序包段:%packages, %end
@group
package[表示安装这个包组]
-package[表示不安装这个包组,但是如果它被其他包依赖的话就算减掉也会被安装的]
脚本段:
%pre
安装前脚本:安装过程开始之前要执行的脚本;
注意:此时的Linux系统环境为微缩版环境,因此脚本应该较简单;
%post
安装后脚本:安装过程完成之后要执行的脚本;
注意:脚本执行环境为完整的已经安装完成的系统;
配置kickstart的方式:
(1) 手动编辑配置文件[有可能会有语法错误];
(2) system-config-kickstart,GUI工具[不支持配置LVM];
安装过程如何获取并使用kickstart文件:
(1) 放置于安装程序能够获取到的位置;
(a) 放置于光盘镜像;
(b) 网络文件服务器;
要求:安装程序得支持网络功能,且能够访问到网络文件服务器;
安装过程的安装引导选项
按Esc键进入boot提示符界面
boot:
linux:默认安装模式
linux text:文本安装模式
与网络相关的引导选项:
ip=IPADDR
例ip=192.168.1.107
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP
ifname=NAME:MAC_ADDR
指明获取 kickstart 文件的路径:
ks=
DVD drive ks=cdrom:/path/to/kickstart_file
HTTP Server ks=http://server_ip:port/path/to/kickstart_file
HTTPS Serverks=https://server_ip:port/path/to/kickstart_file
FTP Server ks=ftp://serverip:port/path/to/kickstart_file
NFS Server ks=nfs:server_ip:/path/to/kickstart_file
创建一个引导光盘:仅帮助启动安装过程,不提供安装树:
(1) 准备工作目录,例如这里使用/tmp/dvd;
mkdir/tmp/dvd
(2) 挂载系统发行光盘,复制isolinux目录至/tmp/dvd;
mount/dev/cdrom /mnt
mkdir/tmp/dvd/isolinux
cp/mnt/isolinux/* /tmp/dvd/isolinux
chmodu+x /tmp/dvd/isolinux -R
(3) 复制制作好的kickstart文件ks.cfg至/tmp/cdrom某位置;
将/root/anaconda-ks.cfg修改成合适的kickstart文件并命名为ks.cfg
cp/root/ks.cfg /tmp/dvd
(4) 如果需要,可以编辑/tmp/dvd/isolinux/isolinux.cfg
在某label后的append指令后附加ks=cdrom:/ks.cfg信息,从而实现自动调用光盘上提供的ks文件;
若ks.cfg在服务器上,就必须进入boot命令行,设置ip地址
即boot> linux
boot> ip=192.168.1.107
(5) 创建iso镜像:这个命令必须在dvd的父目录执行[创建好的iso镜像在/root下]
# mkisofs -R -J -T -v --no-emul-boot--boot-load-size 4 --boot-info-table -V "CentOS 6.6 X86_64 boot disk"-b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso dvd/
注意:当ks.cfg在光盘上时,可以不用手动设置ip地址,可在ioslinux.cfg文件中直接设置。而且若光盘上还有安装树,可以不用连接网络直接安装。
而当ks.cfg在网络服务器上时,就必须在boot提示符界面下手动指定ip地址,才能去连接网络获取安装程序