1、linux内核参数设定及initramfs的生成
2、linux内核编译安装
一、回顾启动流程
post--引导次序(BIOS)--bootloader(MBR)--Kernel+ramdisk--根切换(footfs)--/sbin/init(配置文件:设置默认运行级别runlevel--制定系统初始化脚本进行系统初始化sysinit--启动服务(/etc/rc.d/rcn.d,/etc/rc.d/init.d)--/etc/rc.d/rc.local--设置Ctrlaltdel组合键--启动终端(mingetty),并在终端附加登陆程序(login)--如果级别是5则启动x server
ramdisk contos5:initrd ram disk:块设备
contos6:initfamfs fam fs:
配置文件:
c5:sysv init, /etc/inittab
c6:upstart,/etc/inittab+/etc/init/*.conf
c7:systemd,/usr/lin/sysemd
用户登陆过程:login,password,
nsswich:检测用户账户是否存在,如果存在,还能将其解析为UID,库(API),而非服务
/usr/lib64/linnss*、/lib64/libnss*
pam:pluggable authentication module,做用户认证,库(API)
/lib64/security/*
GRUB:GRand Unified Bootloader 配置文件路径(/boot/grub)
stage1
stage1_5
stage2
命令行接口:grub>
配置文件接口:/boot/grub/grub.conf
例1 如何将一块新硬盘挂载到宿主机(host)上制作启动程序,使其能挂载到另一台机器上启动!!!
1、将新硬盘装host主机识别为hdb,分区(fdisk sdb)为sdb1、sdb2,
格式化分区(mke2fs -t ext4 /dev/sdb1),分别挂载到host主机/mnt/boot和/mnt/sysroot下(前提在host创建mnt/boot,/mnt/sysroot、如:mount /dev/sdb1 /mnt/boot)
2、#grub-install --root-directory=/mnt /dev/sdb #ls /mnt/boot/grub/ 验证grub
3、复制内核和boot文件
#cp /boot/vmlinuz-2.6.32-43l.el6.x86_64 /mnt/boot/vmlinuz
#cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
#vi /mnt/boot/grub/grub.conf
default=0
timeout=5
title TestOS
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
initrd /initramfs.img
#cd /mnt/sysroot
#mkdir -pv etc dev proc sys bin sbin lib64 usr var home (红色必须有)
#ldd ‘which /bin/bash’ 复制bash
#cp /bin/bash /mnt/sysroot/bin
#cp (/lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64.libc.so6 /lib64/ld-linux-x86-64.so.2) /mnt/sysroot/lib64 分别拷贝到此目录
#chroot /mnt/sysroot 切换目录测试 # cd /var
#which is 查看ls命令在那里
#ldd /bin/ls 查看ls的库文件
#cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/(6个库文件都拷贝过去)
#cp /bin/ls /mnt/sysroot/bin/ 拷贝ls命令本身
#chroot /mnt/sysroot #ls 测试 #sync 同步配置
4、 将硬盘挂载到新主机上,开机测试ls、cd都成功,但ifconfig命令不能用,下面我们学习 如何装载和卸载模块。
linux内核是单内核,支持模块化机制,所以好多功能都编译成模块。
内核的某些功能:
编译进内核本体【*】
编译成内核模块【M】
不选择使用 【 】
内核的组成部分:/boot/vmlinuz-VERSION
/lib/modules/VERSION/
*.ko:kernel object
模块之间也存在依赖关系
内核模块管理:
lsmod:显示内核已装载的模块
动态装卸载模块:
卸载:modprobe -r mod_name
装载:modprobe mod_name
另一种装卸载:insmod /path/to/module_file
rmmod mod_name
查看某模块的信息:modinfo mod_name
检测并生成模块间依赖关系的命令:depmod
例2:希望目标系统能运行ifconfig
#ldd 'which ifconfig' 出现ifconfig的库文件
#cp /sbin/ifconfig /mnt/sysroot/sbin
#ldd 'which ping' 查看ping的库文件
#cp /bin/ping /mnt/sysroot/bin/
#cp /lib64/libidn.so.ll /mnt/sysroot/lib64
#which insmod #ldd /sbin/insomd
#cp /sbin/insmod /mnt/sysroot/sbin
#which lsmod #ldd /sbin/lsmod
#cp /sbin/lsmod /mnt/sysroot/sbin
#modinfo e1000 找到文件e1000路径
#cp /lib/module……/e1000/e1000.ko /mnt/sysroot/lib/module(这个目录不存在,需创建)
#mkdir -pv /mnt/sysroot/lib/modules #sync(同步配置文件)
登陆新主机 #lsmod 查看新主机模块
#ifconfig 没有配置
#insmod /lib/modules/e1000.ko 装载这个网卡模块
#lsmod #ifconfig -a 查看并配置ip地址,ping地址测试。
二、linux内核编译安装
插播知识:
lftp: ftp客户端工具
-u USERNAME,PASSWORD:指定用户名和密码。
-p PORT:指定端口。
-e 'CMD':执行一个命令 :例如 lftp -u root,root -p 123 192.17.54.1
lftp: 命令:
help: 获取帮助
cd: 切换远程服务器上的文件系统目录
lcd: 切换本地文件系统目录
get FILE: 下载、mget FILE1...: 下载多个文件,支持使用通配符
!COMMAND: 执行本地shell命令,而非ftp服务器上命令
mirror DIR: 镜像目录至本地
put FILE:上传文件、mput FILE1...:上传多个文件
lftpget类似于wget: 下载指定URL
kernel:www.kernel.org 内核源码官方站点
版本号:mainline 主线,stable 稳定版,longterm 长期维护版
RHEL6:6.0,6.1,6.2 内核版本号都为2.6.32,功能升级有可能是2.6.32-2
RHEL7:
查看硬件信息:
查看cpu信息:cat /proc/cpuinfo ,lscpu ,x86info(yum install x86info)
查看PCI信息:lspci -v
查看USB信息:lsusb
查看块设备:lsblk -v -a
查看硬件信息:hal-device
交叉编译:cross-compiling ,编译运行在不同的平台叫交叉编译。
编译内核的步棸:(安装好开发环境,c6:devilopment tools,server platform development,curses-devel) yum list all--->查看是否安装开发环境
第一步:配置内核
make config make allyesconfig make allnoconfig
make menuconfig(图形界面更直观,推荐)
make gconfig(依赖GNome桌面环境及GNome的图形开发环境,gtk2)
make kconfig(依赖KDE桌面环境及KDE的图形开发环境,qt)
第二步:编译 make
第三步:安装内核模块 make modules_install
第四步:安装内核 make install
获取源代码,linux-3.10.10.tar.gz
展开指定的目录:tar -xf linux-3.10.10.tar.gz -C /usr/src
ln -sv linux-3.10.10 linux ,创建软件连接linux,以后就通过linux来访问这个文件。
linux# cd linux
linux# make menuconfig 图形化界面,可以选择编译内核模块 #uname -r 查看内核版本
linux#ls -a 查看有.config的配置文件,编译好的内核都保存在此。
刚才编译好的内核很可能启动不了,所以建议cp /boot/config-2.6.32.el6.x86_64 ./.config然后再make menuconfig进行修改内核,即可。
linux# make 是一个很长的过程,可以另外打开一个终端来完成。screen
linux# make modules_install 安装位置:/lib/modules/VERSION/,分析模块间依赖关系并生成dep文件。
linux# make install 安装内核,/boot/vmlinuz-VERSION,编辑grub.conf添加新的title
如果编译错误了,再后续编译,开始前清理操作
#make clean 清理编译文件,但保留配置文件
#make mrproper 移除所有编译生成的文件、配置文件和备份文件
#make distclean 完全清理,还原到刚解压时刻
1、将编译生成的文件保存至别处:
#mkdir /path/to/somewhere
#cd /path/to/somewhere
#./configure --ksource=/usr/src/linux
2、如何只编译内核的部分代码
(1)只编译某子目录中的相关代码
# cd /usr/src/linux
#make path/to/dir/
(2)只编译部分模块
#make M=path/to/dir 如:make M=drivers/net/
(3)只编译一个模块
#make path/to/dir/module_name.ko 如:make drivers/net/e1000/e1000.ko
(4)将编译生成的文件保存至别处
#make 0=/path/to/somewhere
3、交叉编译
#make ARCH=arch 获取某ARCH的可用的默认配置
编译完成的目录:/usr/src/linux/arch/x86/boot/bzp_w_picpath
查看/boot/grub/grub.conf,生成一个内核3.10.10,启动测试!
转载于:https://blog.51cto.com/liwenjia/1745767