首页 > 代码库 > Linux Kernel

Linux Kernel

Linux Kernel



概述:




1.idd命令 - print shared library dependencies


功能:打印二进制应用程序所依赖的库文件

语法:ldd [OPTION]... FILE...(二进制文件)

举例:查看/bin/ls所以来的库文件

[root@CentOS6 ~]# ldd /bin/ls
        # 库文件名称   =>     # 库文件路径
	linux-vdso.so.1 =>  (0x00007fff615d7000) # 没有对用文件,是调用库真正的入口
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003270e00000)
	librt.so.1 => /lib64/librt.so.1 (0x000000326fe00000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003273e00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x000000327a200000)
	libc.so.6 => /lib64/libc.so.6 (0x000000326f600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x000000326f200000) 
	/lib64/ld-linux-x86-64.so.2 (0x000000326ee00000)  # 整个系统调用库的入口 
	libpthread.so.0 => /lib64/libpthread.so.0 (0x000000326fa00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x000000327d200000)

取库文件的路径,如下:

[root@CentOS6 ~]# ldd /bin/ls |grep -o "/lib[^[:space:]]*"
/lib64/libselinux.so.1
/lib64/librt.so.1
/lib64/libcap.so.2
/lib64/libacl.so.1
/lib64/libc.so.6
/lib64/libdl.so.2
/lib64/ld-linux-x86-64.so.2
/lib64/libpthread.so.0
/lib64/libattr.so.1




2.Linux Kernel


★内核设计体系:单内核,微内核

    Linux:为单内核设计,但充分借鉴了微内核体系设计的优点;为内核引入了模块化机制(高度模块化);

★内核的组成部分:

   kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-               release

    kernel object:内核对象,即内核模块一般放置于/lib/modules/VERSION-release

          注意:内核模块与内核核心版本一定要严格匹配

    ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备

          目标设备驱动:例如SCSI设备的驱动;

          逻辑设备驱动:例如LVM设备的驱动;

          文件系统驱动:例如xfs文件系统;

          ramdisk是一个简装版的根文件系统,之后要进行根切换,挂载真正的根文件系统。    

★内核编译的三种选择

    [ ]:N,不编译此功能

       [M]:Module ,编译成内核模块,用到时再装载

       [*]:Y,编译进内核核心,即所有人都用的功能才会编辑进去

★内核模块支持动态装载和卸载

3.uname(内核信息获取)

语法:uname [OPTION]...

选项:-r:内核的release号;

         -n:主机名;

         -a:显示所有信息;

文件:/boot/vmlinuz-VERSION-release

显示如下:

[root@CentOS6 ~]# uname -n  # 显示主机名,同hostname
CentOS6.localdomain
[root@CentOS6 ~]# hostname
CentOS6.localdomain
[root@CentOS6 ~]# uname -r  # 显示内核的release号
2.6.32-642.el6.x86_64
[root@CentOS6 ~]# uname -v  # 显示编译的版本号
#1 SMP Tue May 10 17:27:01 UTC 2016
[root@CentOS6 ~]# uname -a  # 显示所有的信息 
Linux CentOS6.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux


4.内核模块管理


1)lsmod (查看当前内核已经装载的模块)

   显示的内核来自于 /proc/modules

   查找指定模块:lsmod |grep MOD_NAME

[root@CentOS6 ~]# lsmod  
Module                  Size  Used by
autofs4                27000  3 
ipv6                  336282  282 
fuse                   79892  2 
vmhgfs                 50307  0 
vsock                  46582  2 
uinput                  8120  0 
microcode             112205  0 
snd_seq_midi            6423  0 
vmware_balloon          7199  0 
snd_seq_midi_event      7205  1 snd_seq_midi
snd_ens1371            21523  0 
snd_rawmidi            24633  2 snd_seq_midi,snd_ens1371
snd_ac97_codec        124967  1 snd_ens1371

2)modinfo(显示模块的详细描述信息)

语法:modinfo[ -k kernel ] [ modulename|filename... ]

选项:-n: 只显示模块文件路径;

       -p: 显示模块参数;

       -F:仅显示指定字段的信息;

       -a: author;

       -d: description;

       -l: license;

[root@CentOS6 ~]# modinfo ext4
filename:       /lib/modules/2.6.32-642.el6.x86_64/kernel/fs/ext4/ext4.ko
license:        GPL
description:    Fourth Extended Filesystem
author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts‘o and others
srcversion:     78B9CBCA6A7D7547B8566CC
depends:        mbcache,jbd2  # 表示被此模块所依赖的其他模块
vermagic:       2.6.32-642.el6.x86_64 SMP mod_unload modversions

3)modprobe(模块的装载与卸载)

语法:modprobe [-r] module_name...

装载模块:modprobe module_name... (会自动解决模块间的依赖关系)

卸载模块:modprobe -r  module_name...

[root@CentOS6 ~]# lsmod |grep btrfs  # 查找指定的模块
[root@CentOS6 ~]# modprobe btrfs     # 装载模块
[root@CentOS6 ~]# lsmod |grep btrfs
btrfs                 786956  0 
zlib_deflate           21629  1 btrfs
lzo_decompress          2343  1 btrfs
lzo_compress            2368  1 btrfs
libcrc32c               1246  1 btrfs
[root@CentOS6 ~]# modprobe -r btrfs  # 卸载模块
[root@CentOS6 ~]# lsmod |grep btrfs

4)depmod

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


模块装载和卸载的另一组命令(insmod、rmmod)


1)insmod

insmod[ filename ] [ module options... ] (这里不会自动解决模块间的依赖关系)

     filename:为模块文件的文件路径;

[root@centos7 ~]# lsmod |grep btrfs
[root@centos7 ~]# insmod btrfs # 不能直接装载,需要指明模块的文件路径
insmod: ERROR: could not load module btrfs: No such file or directory
[root@centos7 ~]# modinfo -n btrfs  
/lib/modules/3.10.0-327.el7.x86_64/kernel/fs/btrfs/btrfs.ko
[root@centos7 ~]# insmod `modinfo -n btrfs`
insmod: ERROR: could not insert module /lib/modules/3.10.0-327.el7.x86_64/kernel/fs/btrfs/btrfs.ko: Unknown symbol in module   # 有依赖关系,不能安装

2)rmmod

    rmmod[ modulename] 直接指明模块名称卸载就可以。


5.ramdisk文件管理


·ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)

·CentOS 5: initrd, 工具程序:mkinitrd

·CentOS 6: initramfs,工具程序:mkinitrd,dracut

技术分享

1)为当前正在使用的内核重新制作ramdisk

  • mkinitrd命令

       --with=<module>:除了默认的模块之外需要装载至initramfs中的模块;

        --preload=<module>:initramfs所提供的模块需要预先装载的模块;

        mkinitrd /boot/initramfs-$(uname-r).img$(uname-r)

   示例:

[root@centos7 ~]# mv /boot/initramfs-3.10.0-327.el7.x86_64.img /tmp  # 移除
[root@centos7 ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  #创建
[root@centos7 ~]# ls /boot
config-3.10.0-327.el7.x86_64                             initramfs-3.10.0-327.el7.x86_64.img  vmlinuz-0-rescue-2044869cb7454de39dc9ec0daa7a8588
grub                                                     initrd-plymouth.img                  vmlinuz-3.10.0-327.el7.x86_64
grub2                                                    symvers-3.10.0-327.el7.x86_64.gz
initramfs-0-rescue-2044869cb7454de39dc9ec0daa7a8588.img  System.map-3.10.0-327.el7.x86_64
[root@centos7 ~]#
  • dracut命令

        dracut /boot/initramfs-$(uname-r).img$(uname-r)

 示例:

[root@centos7 ~]# rm -f /boot/initramfs-3.10.0-327.el7.x86_64.img 
[root@centos7 ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)
[root@centos7 ~]# ls /boot
config-3.10.0-327.el7.x86_64
grub
grub2
initramfs-0-rescue-2044869cb7454de39dc9ec0daa7a8588.img
initramfs-3.10.0-327.el7.x86_64.img
initrd-plymouth.img
symvers-3.10.0-327.el7.x86_64.gz
System.map-3.10.0-327.el7.x86_64
vmlinuz-0-rescue-2044869cb7454de39dc9ec0daa7a8588
vmlinuz-3.10.0-327.el7.x86_64


6.内核信息输出的伪文件系统:/proc,/sys



1)/proc目录             

★ /proc:内核状态和统计信息的输出接口;同时还提供一个配置接口,/proc/sys

★ 参数:

      ·只读:信息输出。例如:/proc/#/*  只是用来输出某进程的相关信息;

      · 可写:可接受用户指定一个“新值”来实现对内核某功能或特性的配                              置;/proc/sys

★ /proc/sys 参数和文件系统的有映射关系的,

       例如:net/ipv4/ip_forwad 相当于 net.ipv4.ip_forward

★ 伪文件系统的的特点是:不能够直接使用编辑器编辑;但是可以通过以下方式修改:

       文件系统命令(cat,echo

                  查看:cat /proc/sys/PATH/TO/SOMR_KERNEL_FILE

            设定:echo "NEW_Value" > /proc/sys/path/to/somefile

    sysctl命令 专用于查看或设定/proc/sys目录下参数的值;

             语法:sysctl [options] [variable[=value]]

             查看:# sysctl -a

                    # sysctl variable

       修改其值:# sysctl -w variable=value  

★ 以上两种方式的设定仅当前运行内核有效,要想永久生效,就要写入到配置文件当中。

   内核参数配置文件:

              /etc/sysctl.conf ,/etc/sysctl.d/*.conf 

   此种设定不能立即生效,但重启系统后一直有效,为了不重启系统而生效的方       式:    # sysctl -p

 内核参数:

   net.ipv4.ip_forward:核心转发

   vm.drop_caches:

      kernel.hostname:主机名

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

                  


示例:

[root@centos7 ~]# sysctl net.ipv4.ip_forward  
net.ipv4.ip_forward = 0
[root@centos7 ~]# sysctl -w net.ipv4.ip_forward=1  # 修改其值
net.ipv4.ip_forward = 1

[root@centos7 ~]# uname -n
centos7
[root@centos7 ~]# sysctl -w kernel.hostname=taotao 
kernel.hostname = taotao    # 注意参数和文件系统的映射关系,这里是简装形式 
[root@centos7 ~]# uname -n
taotao
[root@centos7 ~]# cat /proc/sys/kernel/hostname #
taotao

[root@centos7 ~]# echo "centos7" > /proc/sys/kernel/hostname # echo 命令修改主机名
[root@centos7 ~]# uname -n
centos7

修改配置文件:

[root@centos7 ~]# vim /etc/sysctl.conf  # 修改配置文件 
  1 # System default settings live in /usr/lib/sysctl.d/00-system.conf.
  2 # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
  3 #
  4 # For more information, see sysctl.conf(5) and sysctl.d(5).
  5 net.ipv4.ip_forward = 1  # 添加一行
  
[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward  # 查看其值发现并没有改变
0
[root@centos7 ~]# sysctl -p # 不用重启,直接生效
net.ipv4.ip_forward = 1
[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward
1

内核参数:

[root@centos7 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@centos7 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@centos7 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1

2)/sys目录:

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

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

★udev 为设备创建文件时,会读取其事先定义好的规则文件,

    一般在/etc/udev/rules.d/目录下,

    如修改网卡名对应的规则文件为:/etc/udev/rules.d/70-persistent-net.rules

示例:

[root@centos7 ~]# ls /sys
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
[root@CentOS6 ~]# vim /etc/udev/rules.d/70-persistent-net.rules 
  
  1 # This file was automatically generated by the /lib/udev/write_net_rules
  2 # program, run by the persistent-net-generator.rules rules file.
  3 #
  4 # You can modify it, as long as you keep each rule on a single
  5 # line, and change only the value of the NAME= key.
  6 
  7 # PCI device 0x8086:0x100f (e1000)
  8 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e4:5e:4d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
  9 
 10 # PCI device 0x8086:0x100f (e1000)
 11 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e4:5e:57", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"


























































Linux Kernel