内核设计风格:
单内核:Linux
微内核:Windows,Solaris 真正的支持线程
RedHat,SUSE
核心:动态加载 内核模块
内核:/lib/modules/"内核版本号命令的目录"/
用户空间访问、监控内核的方式:/proc,/sys 伪文件系统
/proc/sys:次目录中的文件很多是可读写的
/sys/:某些文件可写
设定内核参数值的方式:
echo VALUE >/proc/sys/XX
或 stsctl -w kernar.XX="xx"
上述两种方法能使设定立即生效,但不能永久有效
永久有效:修改/etc/sysctl.conf
修改完成之后,执行sysctl -p
sysctl -a:显示所有的内核参数及其值
内核模块管理
lsmod:列出内核模块
modprobe MOD_NAME:装载某模块
modprobe -r MOD_NAME:卸载某模块
modinfo MOD_NAME:查看模块的具体信息
insmod:装载模块
remod MOD_NAME
depom:
内核除了核心功能之外,在编译时大多功能都有三种选择:
1、不使用次功能
2、编译成内核模块
3、编译进内核
如何手动编译内核
make gconfig:Gnome桌面环境使用
make kconfig:KDE桌面环境使用,需要安装图形开发库
make menuconfig:需要在内核目录执行
注意:使用make menuconfig 需要安装ncurses
yum groupinstall "Development Tools" "Development Libraries"
menuconfig编译内核步骤
cd /usr/src
mv /root/linux-3.16.2.tar.xz ./
xz -d linux-3.16.2.tar.xz #解压
tar xvf linux-3.16.2.tar #展开
ln -s linux-3.16.2 linux #链接
cd linux
make menuconfig
make
make modules_install
make install
如何实现部分编译
1、只编译某子目录下的相关代码
make dir/
make arch/
make drivers/net/
2、只编译部分模块
make M=drivers/net/
3、只编译某一模块
make drivers/net/pcnet32.ko
4、将编译完成的结果放置于别的目录中
make o=/tmp/kernel
二次编译时清理:清理前最好备份.config文件
make clean
make mrproper
grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)
mkinitrd initrd文件路径 内核版本号
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
虚拟机实现编译系统
添加一块硬盘,对其进行分区,格式化
mkdir -p /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot/
mount /dev/sdb2 /mnt/sysroot/
grub-install --root-directory=/mnt /dev/sdb #装载Grub
[root@localhost ~]# ls /mnt/boot/ #grub已经存在
grub lost+found
cp /boot/vmlinuz-2.6.32-220.el6.x86_64 /mnt/boot/vmlinuz #复制内核
#创建initrd
mkdir iso
cd iso
zcat /boot/initramfs-2.6.32-220.el6.x86_64.img |cpio -id
vim init #修改init的如下行
mkrootdev -t ext3 -o defaults,ro /dev/sdb2
find . |cpio -H newc --quiet -o |gzip -9 > /mnt/boot/initrd.gz
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title my linux
root (hd0,0)
kernel /vmlinux
initrd /initrd.gz
cd /mnt/sysroot/
mkdir -pv proc sys dev etc/rc.d lib bin sbin boot home var/log usr/{bin,sbin} root tmp
#需要拷贝的两类 1./sbin/* 2./bin/*
cp /sbin/init /mnt/sysroot/sbin/
cp /bin/bash /mnt/sysroot/bin/
ldd /sbin/init #查看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/
ldd /bin/bash #查看bash的依赖库
cp /lib/libtermcap.so.2 /mnt/sysroot/lib/
cp /lib/ld-linux.so.2 /mnt/sysroot/lib/
chroot /mnt/sysroot/ #测试能否使用,exit退出
sync #同步磁盘
vim /mnt/sysroot/etc/inittab #只需2行,默认级别和系统初始化
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/bash
echo -e "\twelcome to \033[31mmylinux\033[0m"
/bin/bash
chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
#需要拷贝的两类 1./sbin/* 2./bin/* 脚本
dest=/mnt/sysroot/
libcp() {
libpath=${1%/*}
[ ! -d $dest$libpath ] && mkdir -p $dest$libpath
[ ! -e $dest${1} ] && cp $1 $dest$libpath && echo "copy lib $1 finished."
}
bincp() {
binpath=${1%/*}
[ ! -d $dest$binpath ] && mkdir -p $dest$binpath
[ ! -e $dest${1} ] && cp $1 $dest$binpath
for lib in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $lib
done
}
read -p "your command: " cmd
until [ $cmd == 'q' ]; do
! which $cmd && echo "wrong command" && read -p "input again: " cmd && continue
command=`which $cmd |grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $command
echo "copy $command finished"
read -p "continue: " cmd
done
mount -n 挂载时不更新/etc/mtab文件
cat /proc/mounts 里面也有挂载的所有文件系统
#让这个小系统实现开机、关机
cd /mnt/sysroot
vim etc/rc.d/init.d/halt
#!/bin/bash
case $0 in
*reboot) command='/sbin/reboot';;
*halt) command='/sbin/halt -p';;
*) echo "Only call this script by *reboot OR *halt";;
esac
case $1 in
start)
;;
stop)
;;
status)
;;
*)
echo "usage:`basename $0`{start|stop|status}"
;;
esac
exec $command
cd etc/rc.d
mkdir rc0.d rc6.d
cd rc0.d
ln -sv ../init.d/halt S99halt
cd rc6.d/
ln -sv ../init.d/halt S99reboot
cd ../
vim rc
#!/bin/bash
RUN=$1
for i in /etc/rc.d/rc${RUN}.d/K*; do
$i stop
done
for i in /etc/rc.d/rc${RUN}.d/S*; do
$i start
done
vim etc/inittab
l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6