1 Star 0 Fork 91

wudong / Linux学完就忘系列

forked from baoke / Linux学完就忘系列 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
34.Linux内核功能及模块应用.md 6.82 KB
一键复制 编辑 原始数据 按行查看 历史

Linux Kernel

CentOS启动流程:POST-->Bootloader(BIOS,MBR)-->Kernel(initrd)-->rootfs-->switch_root-->/sbin/init
root (hd0,0)
kernel
initrd

ldd命令:

打印应用程序所依赖到的库文件(二进制程序文件所依赖到的库);

ldd [OPTION]... FILE...

#打印ls的所依赖到的库
ldd /bin/ls
#仅获取各库文件的路径,-o:代表只匹配正则匹配到的文本,而非整行
ldd /bin/ls | grep -o "/lib[^[:space:]]*"

内核设计体系:单内核、微内核

Linux:单内核设计,但充分借鉴了微内核体系的设计的优点;为内核引入了模块化机制;
内核的组成部分:
kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-release;
kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/
内核模块与内核核心版本一定要严格匹配;
[ ]:N,不编译此内核模块;
[M]:Module,用到时临时装载;
[*]:Y,编译进内核核心;

内核:动态装载和卸载;

ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
目标设备驱动,例如:SCSI设备的驱动;
逻辑设备驱动,例如LVM设备的驱动;
文件系统,例如xfs文件系统;

ramdisk:是一个简装版的根文件系统;

内核信息获取:

uname命令:

print system information

内核对应文件:/boot/vmlinuz-VERSION-release

uname [OPTION]...
-r:内核的release号
-n:主机名
-v:操作系统编译版本号(和程序版本号是两回事)
-a:显示所有信息

#内核的release号  
uname -r
#主机名
uname -n
#操作系统编译版本号
uname -v

模块信息获取和管理:

lsmod命令:

Show the status of modules in the Linux Kernel

显示的内容来自于/proc/modules
三个字段:
Module:模块名称
Size:模块大小
Used by:被引用次数以及被什么模块所引用

lsmod

modinfo命令:

用于显示指定Linux模块的详细信息

#显示ext4模块的详细信息
modinfo ext4

#未被加载的btrfs模块也能使用modinfo查看详细信息
lsmod | grep btrfs
modinfo btrfs

modprobe命令:

内核中模块的动态装卸载

modprobe [-r] module_name
不带-r表示装载模块,带-r表示卸载模块

#装载btrfs模块
modprobe btrfs

#查找btrfs是否装载
lsmod | grep btrfs

#卸载btrfs模块,注:对正在使用的内核模块,不要轻易去卸载它
modprobe -r btrfs

depmod命令(了解):

内核模块依赖关系文件及系统信息映射文件的生成工具;

模块的装载和卸载的另一组命令:

insmod命令:插入模块

insmod [filename] [module options...]
filename:模块文件的路径;

#查看btrfs文件路径
modinfo -n  btrfs
#查看依赖关系
modinfo -F depends  btrfs
#insmod无法解决依赖关系,所以需要先插入依赖模块;`modinfo -n raid6_pq`:引用命令结果的方式
insmod `modinfo -n raid6_pq`
insmod `modinfo -n xor`
insmod `modinfo -n btrfs`
#查看
lsmod | grep btrfs

rmmod命令:删除模块

rmmod btrfs

ramdisk文件的管理:

mkinitrd命令

为当前使用中的内核重新制作ramdisk文件:
mkinitrd [OPTION...] []
--with=:除了默认的模块之外需要装载至至initramfs中的模块;
--preload=:initramfs所提供的模块需要预先装载的模块;

#移动或删除之后,下次重启系统之后发现系统启动不了了,这里面拥有装载根文件系统所在设备的驱动和文件系统
mv /boot/initramfs-3.10.0-957.12.1.el7.x86_64.img /tmp
#为了避免下次重启系统启动不了,我们可以重新创建它,指定创建文件名和内核版本;过程需要消耗一点时间
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#查看
ls /boot/

dracut命令

较为底层的用于生成ramdisk文件的命令
dracut [OPTION...] [ []]

#删除ramdisk文件
rm /boot/initramfs-3.10.0-957.12.1.el7.x86_64.img  
#重新创建
dracut /boot/initramfs-$(uname -r).img $(uname -r)
#查看
ls /boot/

内核信息输出的伪文件系统

/proc目录:内核状态和统计信息的输出接口;同时,还提供一个配置接口,/proc/sys;
参数:
只读:信息输出;例如/proc/#/* (只是用来输出进程的相关信息)
可写:可接受用户指定一个"新值"来实现对内核某功能或特性的配置; /proc/sys/

/proc/sys:
net/ipv4/ip_forward 相当于 net.ipv4.ip_forward

(1) sysctl命令

专用于查看或设定/proc/sys目录下参数的值;
sysctl [options] [variable[=value]] [...]
查看:
sysctl -a
sysctl variable
cat /proc/sys/PATH/TO/SOME_KERNEL_FILE

#显示所有的可配置的内核参数
sysctl -a
#查看某个内核参数的值
sysctl net.ipv4.ip_forward
#修改某个内核参数的值;-w选项就是write
sysctl -w net.ipv4.ip_forward=1
#查看对应的伪文件系统的文件
cat /proc/sys/net/ipv4/ip_forward

#修改主机名
sysctl -w kernel.hostname=www.abc.com  
#查看的三种方式
cat /proc/sys/kernel/hostname
uname -n
hostname

(2) 文件系统命令 (cat,echo)

查看:
cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
设定:
echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE

#设置内核参数主机名为node1
echo "node1" > /proc/sys/kernel/hostname 
#查看
uname -n
cat /proc/sys/kernel/hostname

注意:上述两种方式的设定仅当前运行内核有效;

(3) 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf

使用配置文件永久有效
使配置文件立即生效:sysctl -p [/PATH/TO/CONFIG_FILE]

vim /etc/sysctl.conf 加入以下内核参数:

net.ipv4.ip_forward=1
#重新加载sysctl.conf文件,-p不指定任何配置文件默认重启加载sysctl.conf文件
sysctl -p
#查看
cat /proc/sys/net/ipv4/ip_forward

内核参数:
kernel.hostname:主机名;
net.ipv4.ip_forward:核心转发;
vm.drop_cache:手动清除缓存,回收内存;

net.ipv4.icmp_echo_ignore_all:忽略所有发往本主机的ping操作;

#关闭ping功能
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
cat /proc/sys/net/ipv4/icmp_echo_ignore_all

/sys目录:
sysfs:输出内核识别出的个硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性;

udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin,hotplug;

udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/目录下,以及/usr/lib/udev/rule.d目录下;

Shell
1
https://gitee.com/wudongmeng/linux.git
git@gitee.com:wudongmeng/linux.git
wudongmeng
linux
Linux学完就忘系列
master

搜索帮助