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,启动测试!