Linux 自学笔记——内核管理初步及编译

Linux Kernel:

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

内核的组成部分:

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

2.Kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/,maninfo命令通过读取此文件的信息以显示相关信息;

内核模块与内核核心版本一定要严格匹配;

[]:N;

[M]:Module,编译进模块中;

[*]:Y,编译进内核核心;

内核特性:动态装载和卸载;

Note:有些功能要么编译进内核,要么不编译

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

目标设备驱动,例如SCCI设备的驱动;

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

文件系统,例如xfs文件的系统;

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

ldd命令:

ldd- print shared library dependencies    打印二进制应用程序所依赖的库文件;

ldd[OPTION]... FILE...

显示:1.所依赖库文件名称=>所依赖库文件路径(对应内存载入符号链接映射指向)

2.整个系统调用库的入口

内核信息获取:

uname命令:

uname- print system information

格式:  uname [OPTION]...

-a:显示所有信息

-n:显示主机名;

-r:显示内核的release号;

-v:显示内核版本号;

文件:/boot/vmlinuz-VERSION-release

模块信息获取和管理:

lsmod命令:

lsmod- program to show the status of modules in the Linux Kernel 显示由内核已经装载的内核模块;

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

modinfo命令:

modinfo- program to show information about a Linux Kernel module显示内核模块的详细信息

modinfo[-F field] [-k kernel] [modulename|filename...]

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

-n:显示文件路径;

-a:author

-d:description

-l:license

-k:显示指定的内核版本模块

modprobe命令:

-Add and remove modules from the Linux Kernel

modprobe[ -C confile-file] [modulename] [moduleparame-ters…]

配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf

格式:modprobe  [-r]  module_name

模块的动态装载:modprobe   module_name

动态卸载:modprobe   -r module_name

Note:对正在使用的模块不要轻易卸载;此命令自动解决依赖关系;

depmod命令:

depmod- program to generate modules.dep and map files.

内核模块依赖关系的生成工具;

depmod[-Anea]

-A:只分析比modules.dep记录还新的内核模块,才会更新

-n:不写入modules.dep只输出到屏幕;

-e:显示目前已经加载的不可执行的模块名称;

-a:分许所有模块;

模块装载卸载的另外一种方式:

insmod命令:

insmod - simple program to insert a moduleinto the Linux Kernel

insmod[ filename ]  [ module options... ]

filename:模块文件的文件路径;(内核模块的绝对路径,一般以.ko文件结尾)

rmmod命令:

rmmod- simple program to remove a module from the Linux Kernel

rmmod  [module_name]

ramdisk文件的制作:

(1)mkinitrd命令

为当前使用中的内核重新制作ramdisk文件

# mkinitrd [OPTION...][<initrd-image>] <kernel-version>

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

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

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

(2)dracut命令:

- low-level tool forgenerating an initramfs image

# dracut [OPTION...][<image> [<kernel version>]]

示例: ~]# dracut/boot/initramfs-$(uname -r).img  $(uname-r)  用法和mkinitrd一样;

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

/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

修改其值:

#sysctl  -w  variable=value

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

查看:

#cat/proc/sys/PATH/TO/SOME_KERNEL_FILE

设定:

#echo“VALUE”  >  /proc/sys/PATH/TO/SOME_KERNEL_FILE

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

立即生效的方式:sysctl  -p   [/PATH/TO/CONFIG_FILE]

内核参数:

net.ipv4.ip_forward:核心转发;

vm.drop_caches:

kernel.hostname:主机名;

net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

/sys目录;

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

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

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

编译内核:

程序包的编译安装:

./configure, make,make install

前提:开发环境(开发工具,开发库),头文件:/usr/include

开源:源代码—>可执行格式

发行版:以“通用”的目标;

前提:

1)    准备好开发环境;

2)    获取目标主机上的硬件设备的相关信息;

3)    获取到目标主机系统的功能的相关信息,例如要启用的文件系统;

4)    获取内核源代码包:www.kernel.org

准备开发环境:

Centos6.6:

包组:

Development Tools

Server Platform Development

Centos 7:

包组:

Development Tools

Server Platform Development

包:

ncures-devel

获取目标主机上硬件设备的相关信息:

CPU:

~]#cat  /proc/cpuinfo

~]#lscpu

~]#x86info –a x86info需要先手动安装才能使用

PCI设备:

~]#lspci

-v:详细显示信息

-vv

~]#lsusb

-v:详细显示usb信息

-vv

~]#lsblk

了解全部硬件设备信息:

~]#hal-device

内核编译过程:

1.    准备好开发环境,安装好“DevelopmentTools”“Server Platform Development”组件;

2.    从kernel官网上下在内核;

3.    下载好内核之后将文件解压缩归档至/usr/src目录;

4.    创建链接文件;

5.    准备配置文件;

6.    配置内核选项;

1)给内核加一个名称,依次选中Generalsetup-->Local version – append to kernel release;

2)选择启动的内核模块,在打开这个配置的第一个界面依次选择File systems -->DOS/FAT/NT file systems-->NTFS file systemssupport,如图所示,利用空格键选中,[]表示不编译,[M]表示编译至模块中,[*]表示编译至内核中。本次测试选中NTFS模块;

3)退出保存,比较配置前后区别;

7.    安装编译;

1)    编译内核,可使用make –j #指定编译线程数量,因为远程编译可能终端断开就前功尽弃了,所以 使用screen命令就可以不用担心编译中断了;

2)    安装内核模块;

3)    安装内核;最后一步在虚拟机里出现报错,为can’tfind modules…可忽略

#make install;

8.    编辑grub配置文件,将default=1改为default=0,随后重启系统;

screen命令:

打开screen:~]# screen

拆除screen: Ctrl+a, d

列出screen: ~]# screen  -ls

连接至screen: ~]# screen  -r  SCREEN_ID

关闭screen:  ~]# exit

编译安装内核的详细说明:

1.    大概安装步骤:

1)    安装开发包组

2)    下载源码文件

3)    .config:准备文本配置文件

4)    makemenuconfig:配置内核选项

5)    make[-j #]

6)    makemodules_install:安装模块

7)    makeinstall :安装内核相关文件 
         安装bzImage为/boot/vmlinuz-VERSION-RELEASE(去boot目录下查看) 
          生成initramfs文件

8)    编辑grub的配置文件

2.    配置内核选项

支持“更新”模式进行配置:在已有的.config文件的基础之上进行修改配置;

a)    make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;

b)    make menuconfig:基于cureses的文本配置窗口;

c)    make gconfig:基于GTK开发环境的窗口界面;

包组“桌面平台开发”

d)    make xonfig;基于QT开发环境窗口界面;

支持“全新配置”模式进行配置:

a)    make defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;

b)    make allnoconfig:所有选项均为“no”

3.    编译

a)    多线程编译:make [-j #]

b)    编译内核中的一部分代码:

i只编译某子目录中的相关代码:

# cd  /usr/src/linux

# make  path/to/dir/

ii只编译一个特定的模块:

# cd /usr/src/linux

# make path/to/dir/file.ko

例如:只为e1000编译驱动:

#make drivers/net/ethernet/intel/e1000/e1000.ko

c)     如何交叉编译:

目标平台与当前编译操作所在的平台不同;

# make ARCH=arch_name

要获取特定目标平台的使用帮助:

# make ARCH=arch_name help

4.     如何在执行过编译操作的内核源码树上做重新编译:

事先清理操作:

# make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;

# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;

# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;

时间: 2024-12-27 02:04:24

Linux 自学笔记——内核管理初步及编译的相关文章

Linux入门之内核管理番外篇(4)udev入门(1)

Linux入门之内核管理番外篇(4)udev入门(1) 前言 在上篇中的内核模块管理讲解中,最后或多或少会留下一些疑问,那么这些疑问就是内核模块的参数是怎么和对应的硬件所匹配上的,而硬件又是怎么被内核识别,并且一个个都映射成实际存在的文件,而这些文件之间的关系及作用.当然在最后了解到,这些硬件设备的探测信息是通过一个叫udev的工具来实现的,通过udev中配置的规则可以很有效的识别每一个硬件,并配合sysfs文件系统,将每个探测到的硬件信息导入到/sys目录中,那么与/proc目录对与内核系统信

Linux自学笔记——LVM2的创建与管理

LVM2,Logical VolumeManager,逻辑卷管理,它是linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在linux 2.4内核上实现.Linux用户安装Linux操作系统时遇到一个常见的难以决定的问题就是如何正确的评估各分区的大小,已分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以不能同时放到别的磁盘上.而遇到出现某

Linux 第20天: (09月12日) Linux启动和内核管理

本章内容 CentOS 5和6的启动流程服务管理Grub管理自制Linux启动排错编译安装内核 Linux组成Linux: kernel+rootfskernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能rootfs:程序和glibc库:函数集合, function, 调用接口(头文件负责描述)过程调用:procedure,无返回值函数调用:function程序:二进制执行文件内核设计流派:单内核(monolithic kernel):Linux把所有功能集成于同一个程序微内

Linux系统管理(一)Linux设备和内核管理

设备和内核管理 一.  设备管理概述 1.Linux设备的分类 字符设备(c):以字符为单位,传输速率较低,无需缓冲区. 块设备(b):以数据块为单位组织和传输数据,需要建立缓冲区 网络设备(s):一种通过SOCKET接口进行主机通信的设备 2.设备文件 (1)功能 用于用户访问设备进行输入和输出操作 (2)常见的设备文件 /dev/hd*   IDE接口的硬盘(IDE接口的设备) /dev/sd*   SCSI/USB设备 /dev/cua*  串口设备 /dev/lp*  并口设备 /dev

Linux启动和内核管理

系统启动和内核管理 Linux组成 Linux:kerne+rootfs(应用程序) kernel:进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 roots:程序和glibc 函数:相当于命令的集合 库:函数集合,function,调用接口(头文件负责描述) 过程调用:procedure,无返回值 函数调用:function 程序:二进制执行文件 内核设计: 单内核(monolithic kernel):Linux 把所有功能集成于一个同一个程序 微内核(micro kernel)

Linux 0.12 内核管理存储器

其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出的32位地址(实际上被看做段内偏移地址),再依据代码段寄存器CS中的16位段选择子,可在GDT或LDT中查找对应的段描写叙述符.从段描写叙述符中提取段的基地址,与程序给出的32位地址相加.得到结果为线性地址. 依据此线性地址查找系统页文件夹表,再查二级或是多级页表,终于得到物理地址. 此方式系统仅仅有一个4G的线性地址空间由各进程共享(

Linux系统启动与内核管理(下)

从上一篇介绍了系统启动流程可以得知,在BIOS读取相关信息之后,接下来就是去找第一个可以启动的设备当中的MBR中读取Boot Loader信息,Boot Loader提供具有惨淡功能,直接加载内核信息,以及相关的控制权转交功能.启动系统必须有Boot Loader,然后才能去加载内核,Boot Loader存储于MBR当中,MBR只有512字节,其中前446字节存储Boot Loader,区区只有446自己不可能容纳较多的功能,Linux将Boot Loader的程序运行与配置项加载分成三个阶段

linux自学笔记——rpm程序包管理

RPM是Redhat PackageManager(RPM程序包管理器)的缩写,这一文件格式名称虽然打上了Redhat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux.Suse以及Turbo Linux的分发版本也都有采用.RPM程序包管理器可分为安装.升级.卸载.查询.校验等五种功能,以下我们将会对这五种功能的相应的用法一一说明. RPM程序包: 源代码:name-VERSION.tar.gz    源代码由RPM自动编译安装: VERSION: major.minor.rel

Linux自学笔记——用户和组管理

资源分派: Authentication:认证 Authorization:授权 Accouting:审计 Audition token,identity(username/password) linux用户:username/UID 管理员:root,0 普通用户:1-65535 系统用户:1-499,1-999 对守护进程获取资源进行权限分配: 登录用户:500+,1000+ 交互式登录: Linux组:groupname/GID 管理员组:root,0 普通组: 系统组:1-499, 1-