菜鸟学Linux 第034篇笔记 vmlinuz, initrd, modules, script
内核两部分
核心 /boot/vmlinuz-version
内核模块 /lib/modules/version
内核设计风格
单内核
模块化设计
微内核
装载模块命令
insmod
modprobe
查看Linux内核最新版本
www.kernel.org
查询所安装的发行版linux的内核版本 uname -r
用户空间访问、监控内核的方式
/proc, /sys 伪文件系统
/proc/sys 此目录中的文件很多是可读写的
/sys/ 某些文件可写
设定内核参数值的方法
会立即生效,但无法永久有效
echo value > /proc/sys/TO/somefile
e.g. echo 1 > /proc/sys/vm/drop-caches
sysctl -w kernel.hostname=msky
configure kernel parameters at runtime
-p Load in sysctl settings from the file specified or
/etc/sysctl.conf if none given. Specifying - as filename
means reading data from standard input.
-a Display all values currently available.
永久有效,但无法立即生效
修改/etc/sysctl.conf 使用sysctl -p 来让内核重读该配置文件
修改是否通话双网卡流量传送 net.ipv4.ip_forward = 0
0 is disabled, 1 is enabled.
内核模块管理
lsmod program to show the status of modules in the Linux Kernel
modinfo program to show information about a Linux Kernel module
modprobe program to add and remove modules from the Linux Kernel
modprobe MOD_NAME 装载模块(不需要指路径)
modprobe -r MOD_NAME 卸载模块
insmod /PATH/TO/MOD_NAME 需要指路径
rmmod MOD_NAME
depmod program to generate modules.dep and map files.
depmod /PATH/TO/MODULES_DIR
内核中的功能 除了核心功能之外,在编译时,大多功能都有三种选择
1、不使用此功能
2、编译成内核模块
3、编译进内核
如何手动编译内核
make gconfig 需要GNOME Desktop Environment
图形开发库 GNOME Software Development
make kconfig 需要KDE (K Desktop Environment)
图形开发库 KDE Software Development
make menuconfig
下载Linux内核后解压
1. tar xf linux-4.8.11.tar -C /usr/src/
2. ln -sv linux-4.8.11 linux
3. make menuconfig 选择特性注意远程连接的需要显示的窗口够大才可以显示
如不知道要删除或配置某个模块可以导入先前的配置文件
即/boot/config-2.6.18-308.el5 将该文件mv到编译的文件夹下改为.config
4. make 注意可能会需要非常长的时间0.5-2小时不等,不建议远程操作
因为时间长可能连接中断,会导致编译中断
如果非要远程,建议安装软件screen yum install screen
编译执行前使用screen
然后执行make
screen命令
不加任何参数建立screen
-ls 显示已经建立的屏幕
Ctrl+a 放开 按d 拆除屏幕
-r ID 还原回某屏幕
6. make modules_install
7. make install
二次编译时清理 清理之前如果有需要请备份.config文件
make clean
make mrproper
grub-->kernel-->initrd-->ROOTFS(/sbin/init, /bin/bash)
克隆迷你小linux (目录未测试成功,老报错,目前正在研究中。。。)
建立硬盘分区sdc1 sdc2
创建两个目录/mnt/boot /mnt/sysroot
将sdb1做成grub分区, 前章节有介绍,这里不作详细介绍
拷贝内核到/mnt/boot目录下
cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz-2.6.18
做initrd
cp /boot/initrd-2.6.18-308.el5.img /root/
file initrd-2.6.18-308.el5.img
mv initrd-2.6.18-308.el5.img initrd-2.6.18-308.el5.img.gz
mkdir initrd
cd initrd
cpio -id < ../initrd-2.6.18-308.el5.img
此上命令可以用zcat /boot/initrd-2.6.18-308.el5.img | cpio -id
vim init
切换到最后一行找到
mkrootdev -t ext3 -o defaults,ro /dev/sda1 将sda1 更改为sdc2
打包成init放到/mnt/boot目录里 只可以解压的那个目录里执行该命令并
find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz
最后创建grub.conf上一章也讲过了,这里不再重复
挂载sdc2到 /mnt/sysroot目录下创建基本的linux 根目录
/bin /boot /dev /etc /home /lib /proc /sys /root /sbin /tmp
/usr /var/log
cp /sbin/init /mnt/sysroot/sbin/
cp /bin/bash /mnt/sysroot/bin/
将以上两个文件所依赖的库文件拷贝到lib目录下
ldd /sbin/init
cp /lib/libsepol.so.1 /mnt/sysroot/lib/
cp /lib/libselinux.so.1 /mnt/sysroot/lib/
cp /lib/libc.so.6 /mnt/sysroot/lib/
cp /lib/libdl.so.2 /mnt/sysroot/lib/
cp /lib/ld-linux.so.2 /mnt/sysroot/lib/
ld /bin/bash
cp /lib/libtermcap.so.2 /mnt/sysroot/
在/mnt/sysroot/etc/创建inittab文件添加如下两行
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
在/mnt/sysroot/etc/rc.d/创建rc.sysinit文件添加如下两行
#!/bin/bash
#
echo -e "\tWelcome to \033[31mMySky lab\033[0m Linux."
/bin/bash
编写脚本自动拷贝某命令的库到某个目录下
学习两个bash 参数扩展
FILE=/usr/local/src
${parameter#word} echo ${FILE#*/} usr/local/src
${parameter##word} echo ${FILE##*/} src
${parameter%word} echo ${FILE%/*} /usr/local
${parameter%%word} echo ${FILE%%/*} 空
#!/bin/bash
#This scrip is used to copy lib to other directory.
DESTDIR=/mnt/sysroot
cplib() {
LIBPATH=${1%/*}
[ ! -d DESTDIRLIBPATH ] && mkdir -p DESTDIRLIBPATH
[ ! -e DESTDIR{1} ] && cp 1DESTDIRLIBPATH && echo "copyDESTDIR${1} done"
}
cpbin() {
CMDPATH=${1%/*}
[ ! -d DESTDIRCMDPATH ] && mkdir -p DESTDIRCMDPATH
[ ! -e DESTDIR{1} ] && cp 1DESTDIRCMDPATH && echo "copyDESTDIR${1} done"
for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
cplib $LIB
done
}
read -p "Input Command:" CMD
until [ $CMD == "q" ]; do
! which $CMD &> /dev/null && echo "Wrong command" && read -p "input again:" CMD && continue
COMMAND=`which $CMD | grep -v "alias" | grep -o "[^[:space:]]\{1,\}"`
cpbin $COMMAND
echo "copy $COMMAND finished."
read -p "Continue command:" CMD
done
本文转自Winthcloud博客51CTO博客,原文链接http://blog.51cto.com/winthcloud/1878450如需转载请自行联系原作者
Winthcloud