核心:/boot/vmlinuz-version
内核模块(ko):/lib/modules/version/
内核设计:
单内核
模块化设计
微内核
装载模块:
insmod
modprobe
www.kernel.org
用户空间访问,监控内核的方式:
/proc,/sys
伪文件系统
/proc/sys:此目录中的文件很多是可读写的
/sys/:某些文件可写
设定内核参数值的方法:
echo VALUE > /proc/sys/TO/SOMEFILE
echo 1 > /proc /sys/vm/drop_caches
echo www.magedu.com> /proc/sys/kernel/hostname
sysctl -w kernel.hostname=”mylab.magedu.com”
sysctl -w vm.drop_cache=1
能立即生效,但无法永久有效
永久有效:/etc/sysctl.conf
# Kernel sysctl configuration file for RedHat Linux
#
# For binary values, 0 is disabled, 1 isenabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Kernel sysctl configuration file for RedHat Linux
#
# For binary values, 0 is disabled, 1 isenabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Kernel sysctl configuration file for RedHat Linux
#
# For binary values, 0 is disabled, 1 isenabled. See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Do not accept source routing
net.ipv4.conf.default.accept_source_route =0
# Controls the System Request debugging functionalityof the kernel
kernel.sysrq = 0
# Controls whether core dumps will appendthe PID to the core filename
# Useful for debugging multi-threadedapplications
kernel.core_uses_pid = 1
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Controls the maximum size of a message,in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of amesage queue
kernel.msgmax = 65536
# Controls the maximum shared segment size,in bytes
kernel.shmmax = 4294967295
# Controls the maximum number of sharedmemory segments, in pages
kernel.shmall = 268435456
修改完文件之后,执行如下命令可立即生效
sysctl -p
sysctl -a:显示所有内核参数及其值
内核模块管理:
lsmod:列出当前内核装载了那些模块
modprobe MOD_NAME:装载指定模块
modprobe -r MOD_NAME:卸载某模块
modinfo MOD_NAME:查看模块的具体信息
insmod /PATH/TO/MODULE_FILE:装载模块
rmmod MOD_NAME
depmod /PATH/TO/MODILES_DIR
内核中的功能除了核心功能之外,在编译时,大多数
1.不使用此功能
2.编译成内核模块
3.编译进内核
下载历史版本内核:https://www.kernel.org/pub/linux/kernel/v2.6/
编译安装linux内核步骤:
一.获取内核源码
源码网址:www.kernel.org
二.解压内核源码
首先以root帐号登录,然后进入/usr/src子目录。如果用户在安装Linux时,安装了内核的源代码,则会发现一个linux-x.y.z的子目录。该目录下存放着内核x.y.z的源代码。此外,还会发现一个指向该目录的链接linux。删除该连接,然后将新内核的源文件拷贝到/usr/src目录中,并解压:
# tar zxvf Linux-2.3.14.tar.gz
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包含了内核2.3.14的全部源代码。 将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。
# cd /usr/include
# rm -Rf asm linux
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi
删除源代码目录中残留的.o文件和其它从属文件。
# cd /usr/src/linux
# make mrproper
三.增量补丁
有时不需要完全重新安装,只需打增量补丁,类似升级,在内核源码树根目录运行:
patch-p1< ../patch-x.y.z
四.内核源码树目录:
arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
block:部分块设备驱动程序。
crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
Documentation:关于内核各部分的通用解释和注释。
drivers:设备驱动程序,每个不同的驱动占用一个子目录。
fs:各种支持的文件系统,如ext、fat、ntfs等。
include:头文件。其中,和系统相关的头文件被放置在linux子目录下。
init:内核初始化代码(注意不是系统引导代码)。
ipc:进程间通信的代码。
kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。
lib:库文件代码。
mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
net:网络相关代码,实现了各种常见的网络协议。
scripts:用于配置内核文件的脚本文件。
security:主要是一个SELinux的模块。
sound:常用音频设备的驱动程序等。
usr:实现了一个cpio。
在i386体系下,系统引导将从arch/i386/kernel/head.s开始执行,并进而转移到init/main.c中的main()函数初始化内核。
五.配置内核
# cd/usr/src/linux
内核配置方法有三种:
(1)命令行: make config
(2)菜单模式的配置界面: make menuconfig
(3) Xwindow:make xconfig
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。由于内核的配置选项非常多,本文只介绍一些比较重要的选项。
1、Code maturity level options(代码成熟度选项)
Prompt for development and/or incompletecode/drivers (CONFIG_EXPERIMENTAL) [N/y/?] 如果用户想要使用还处于测试阶段的代码或驱动,可以选择“y”。如果想编译出一个稳定的内核,则要选择“n”。
2、Processortype and features(处理器类型和特色)
(1)、Processor family (386, 486/Cx486, 586/K5/5x86/6x86,Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX] 选择处理器类型,缺省为Ppro/6x86MX。
(2)、Maximum Physical Memory (1GB, 2GB) [1GB] 内核支持的最大内存数,缺省为1G。
(3)、Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 协处理器仿真,缺省为不仿真。
(4)、MTRR (Memory Type Range Register) support (CONFIG_MTRR)[N/y/?]
选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。
(5)、Symmetric multi-processing support (CONFIG_SMP) [Y/n/?]选择“y”,内核将支持对称多处理器。
3、 Loadable module support(可加载模块支持)
(1)、Enable loadable module support (CONFIG_MODULES) [Y/n/?]选择“y”,内核将支持加载模块。
(2)、Kernel module loader (CONFIG_KMOD) [N/y/?] 选择“y”,内核将自动加载那些可加载模块,否则需要用户手工加载。
4、 General setup(一般设置)
(1)、Networking support (CONFIG_NET) [Y/n/?] 该选项设置是否在内核中提供网络支持。
(2)、PCI support (CONFIG_PCI) [Y/n/?] 该选项设置是否在内核中提供PCI支持。
(3)、PCI access mode (BIOS, Direct, Any) [Any] 该选项设置Linux探测PCI设备的方式。选择“BIOS”,Linux将使用BIOS;选择“Direct”,Linux将不通过BIOS;选择 “Any”,Linux将直接探测PCI设备,如果失败,再使用BIOS。
(4)Parallel port support (CONFIG_PARPORT) [N/y/m/?] 选择“y”,内核将支持平行口。
5、 Plug and Play configuration(即插即用设备支持)
(1)、Plug and Play support (CONFIG_PNP) [Y/m/n/?] 选择“y”,内核将自动配置即插即用设备。
(2)、ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 选择“y”,内核将自动配置基于ISA总线的即插即用设备。
6、 Block devices(块设备)
(1)、Normal PC floppy disk support (CONFIG_BLK_DEV_FD)[Y/m/n/?] 选择“y”,内核将提供对软盘的支持。
(2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE)[Y/m/n/?] 选择“y”,内核将提供对增强IDE硬盘、CDROM和磁带机的支持。
7、 Networking options(网络选项)
(1)、Packet socket (CONFIG_PACKET) [Y/m/n/?] 选择“y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。
(2)、Network firewalls (CONFIG_FIREWALL) [N/y/?] 选择“y”,内核将支持防火墙。
(3)、TCP/IP networking (CONFIG_INET) [Y/n/?] 选择“y”,内核将支持TCP/IP协议。
(4)The IPX protocol (CONFIG_IPX) [N/y/m/?] 选择“y”,内核将支持IPX协议。
(5)、Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 选择“y”,内核将支持Appletalk DDP协议。
8、SCSI support(SCSI支持)
如果用户要使用SCSI设备,可配置相应选项。
9、Network device support(网络设备支持)
Network device support (CONFIG_NETDEVICES)[Y/n/?] 选择“y”,内核将提供对网络驱动程序的支持。
10、Ethernet (10 or 100Mbit)(10M或100M以太网)
在该项设置中,系统提供了许多网卡驱动程序,用户只要选择自己的网卡驱动就可以了。此外,用户还可以根据需要,在内核中加入对FDDI、PPP、SLIP和无线LAN(Wireless LAN)的支持。
11、Character devices(字符设备)
(1)、Virtual terminal (CONFIG_VT) [Y/n/?] 选择“y”,内核将支持虚拟终端。
(2)、Support for console on virtual terminal(CONFIG_VT_CONSOLE) [Y/n/?]
选择“y”,内核可将一个虚拟终端用作系统控制台。
(3)、Standard/generic (dumb) serial support (CONFIG_SERIAL)[Y/m/n/?]
选择“y”,内核将支持串行口。
(4)、Support for console on serial port(CONFIG_SERIAL_CONSOLE) [N/y/?]
选择“y”,内核可将一个串行口用作系统控制台。
12、Mice(鼠标)
PS/2 mouse (aka "auxiliarydevice") support (CONFIG_PSMOUSE) [Y/n/?] 如果用户使用的是PS/2鼠标,则该选项应该选择“y”。
13、Filesystems(文件系统)
(1)、Quota support (CONFIG_QUOTA) [N/y/?] 选择“y”,内核将支持磁盘限额。
(2)、Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?]选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。
(3)、DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 选择“y”,内核将支持DOS FAT文件系统。
(4)、ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS)[Y/m/n/?]
选择“y”,内核将支持ISO 9660 CDROM文件系统。
(5)、NTFS filesystem support (read only) (CONFIG_NTFS_FS)[N/y/m/?]
选择“y”,用户就可以以只读方式访问NTFS文件系统。
(6)、/proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。
(7)、Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?]EXT2是Linux的标准文件系统,该项也必须选择“y”。
14、Network File Systems(网络文件系统)
(1)、NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 选择“y”,内核将支持NFS文件系统。
(2)、SMB filesystem support (to mount WfW shares etc.)(CONFIG_SMB_FS)
选择“y”,内核将支持SMB文件系统。
(3)、NCP filesystem support (to mount NetWare volumes)(CONFIG_NCP_FS)
选择“y”,内核将支持NCP文件系统。
15、Partition Types(分区类型)
该选项支持一些不太常用的分区类型,用户如果需要,在相应的选项上选择“y”即可。
16、Console drivers(控制台驱动)
VGA text console (CONFIG_VGA_CONSOLE)[Y/n/?] 选择“y”,用户就可以在标准的VGA显示方式下使用Linux了。
17、Sound(声音)
Sound card support (CONFIG_SOUND) [N/y/m/?] 选择“y”,内核就可提供对声卡的支持。
18、Kernel hacking(内核监视)
Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?]选择“y”,用户就可以对系统进行部分控制。一般情况下选择“n”。
六、 编译内核
(一)、建立编译时所需的从属文件
# cd /usr/src/linux
# make dep
(二)、清除内核编译的目标文件
# make clean
(三)、编译内核
# make zImage
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件zImage。如果编译的内核很大的话,系统会提示你使用make bzImage命令来编译。这时,编译程序就会生成一个名叫bzImage的内核映像文件。
(四)、编译可加载模块
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。
# make modules
# make modelus_install
编译成功后,系统会在/lib/modules目录下生成一个2.3.14子目录,里面存放着新内核的所有可加载模块。
七、 启动新内核
(一)、将新内核和System.map文件拷贝到/boot目录下
# cp /usr/src/linux/arch/i386/boot/bzImage/boot/vmlinuz-2.3.14
# cp /usr/src/linux/System.map /boot/System.map-2.3.14
# cd /boot
# rm -f System.map
# ln -s System.map-2.3.14 System.map
(二)、配置/etc/lilo.conf文件。在该文件中加入下面几行:
default=linux-2.3.14
image=/boot/vmlinuz-2.3.14
label=linux-2.3.14
root=/dev/hda1
read-only
(三)、使新配置生效
# /sbin/lilo
(四)、重新启动系统
# /sbin/reboot
新内核如果不能正常启动,用户可以在LILO:提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。
本地挂载配置yum源:
cd /etc/yum.repos.d/
vim local.repo
[base]
name=Server
baseurl=file:///media/cdrom/Server
enable=1
gpgcheck=0
mkdir /media/cdrom
mount /dev/cdrom /media/cdrom
yum groupinstall “Developmnet Tools” “DevelopmentLibraries” -y
yum grouplist
如何手动编译内核:
make gconfig: Gnome桌面环境使用,需要安装图形开发库组:GNOME Software Development
make kconfig: KDE桌面环境使用,需要安装图形开发库
make menuconfig: 打开文本菜单
*:做进内核
M:做成模块
[ ]:啥也不做
多出.config文件
make
make modules_install
make install
yum install screen
screen命令:
screen -ls: 显示已经建立的屏幕
screen: 直接打开一个新的屏幕
Ctrl+a,d: 拆除屏幕
screen -r ID: 还原回某屏幕
exit: 退出
二次编译时清理,清理前,如果有需要,请备份配置文件.config:
make clean
make mrproper
添加一块IDE硬盘
mke2fs -j /dev/hda1
mke2fs -j /dev/hda2
grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)
mkinitrd initrd文件路径 内核版本号
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
新建一个虚拟机,挂载小linux
${parameter#*word}
${parameter##*word}
The word is expanded to produce apattern just as in pathname expansion. If the pattern matches the beginning of the value of
parameter, then the result of theexpansion is the expanded value of parameter with the shortest matchingpattern (the ?..?.
case) or the longest matching pattern (the?..#?..case) deleted. If parameter is@ or *, the pattern removal operation is
applied to each positionalparameter in turn, and the expansion is the resultant list. If parameter is an array variable sub-
scripted with @or *, the pattern removal operation is applied to each member of the array inturn, and the expansion is the
resultant list.
FILE=/usr/local/src
${FILE#*/}: usr/local/src
${FILE##*/}: src
${FILE%/*}: /usr/local
${FILE%%/*}:
${parameter%word*}
${parameter%%word*}
The word is expanded to produce apattern just as in pathname expansion. If the pattern matches a trailing portion of the
expanded value of parameter, then the result ofthe expansion is the expanded value of parameter with the shortest matching
pattern (the ?..?..case) or thelongest matching pattern (the ?..%?..case) deleted. If parameter is @ or *, the pattern
removal operation is applied to each positional parameter in turn, and the expansion isthe resultant list. If parameter is
an array variable subscriptedwith @ or *, the pattern removal operation is applied to each member of thearray in turn, and
the expansion is the resultantlist.
复制二进制程序及其依赖的库文件的脚本:
#!/bin/bash
#
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() {
CMDPATH=${1%/*}
[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH
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 &> /dev/null && 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
mkdir /mnt/sysroot/lib/modules
modinfo mii
modinfo pcnet32
开机自动装载两个模块
/etc/rc.d/rc.sysdone脚本,可用于实现为微型的Linux系统关机
#!/bin/bash
#
sync
sleep 2
sync
mount | awk '{print $3}' | grep -v -E "\/(dev|proc|sys)?$" | sort -r | while read LINE; do
umount -n -f $LINE
[ $? -eq 0 ] && echo "Unmount $LINE finished." || echo "Can not unmount $LINE."
done
mount | awk '{print $3}' | while read LINE; do
mount -n -o remount,ro $LINE
[ $? -eq 0 ] && echo "Remount $LINE finished." || echo "Can not remount $LINE."
done
exec /sbin/halt -p
T_RED="\\033[1;31m" # bold+red
T_GREEN="\\033[1;32m" # bold+green
T_YELLOW="\\033[1;33m" # bold+yellow
T_BLUE="\\033[1;34m" # bold+blue
T_CYAN="\\033[1;36m" # cyan
T_BOLD="\\033[1;37m" # bold+white
T_NORM="\\033[0;39m" # normal
系统启动流程:
POST(加电自检)-->BIOS(BootSequence引导次序)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab)
/etc/inittab:
设定默认运行级别
系统初始化(/etc/rc.d/rc.sysinit)
运行指定级别的服务脚本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0.d--rc6.d
K*
S*
00-99:运行次序
启动虚拟终端
启动图形终端
/etc/rc.d/rc.sysinit:
检测并以读写方式重新挂载根文件系统;
设定主机名;
检测并挂载/etc/fstab中的其它文件系统;
启动swap分区;
初始化外围硬件设备的驱动;
根据/etc/sysctl.conf设定内核参数;
激活udev和selinux;
激活LVM和RAID设备;
清理过期锁和PID文件;
装载键映射;
/etc/inittab文件示例:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l3:3:wait:/etc/rc.d/rc 3
l6:6:wait:/etc/rc.d/rc 6
1:2345:respawn:/sbin/agetty -n -l /bin/bash38400 tty1
2:2345:respawn:/sbin/agetty -n -l /bin/bash38400 tty2
/etc/fstab文件示例:
/dev/hda2 / ext3 defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
RHEL6:
upstart --> init
/etc/inittab
/etc/init/*.conf
内核初始化:
硬件探测
装载驱动
挂载根文件系统(rootfs)
启动用户空间中的第一个进程init
/etc/rc.d/rc.sysinit
echo
insmod
ifconfig
/bin/bash
再增强小linux的功能
shutdown
halt
reboot
poweroff
init 0 关机
init 6 重启
1.关机和重启
2.主机名
3.运行对应服务脚本
4.启动终端
5.运行用户
6.定义单用户级别
7.装载网卡驱动,启用网络功能
8.提供一个web服务器
busybox:1M
Kernel
RHEL5,RHEL6
定制安装
自动化安装
定制引导盘
先添加一个IDE硬盘,挂载
vim etc/inittab
vim etc/rc.d/rc.sysinit
chmod +x etc/rc.d/rc.sysinit
新建虚拟机,挂在刚才的系统
移植一些命令
启动测试以下
mount
-n:挂载时不更新/etc/mtab文件
cat /proc/mounts
如何让系统自动关机呢?
init 0系统关机
如何让系统重启呢?
重启
一个脚本既能关机又能重启
添加3级别
使用chkconfig添加服务脚本
让在3级别能启动起来
3级别不能执行到
执行/etc/rc.d/rc.sysinit就能完成重启,不能轮到3级别,但可执行0,6级别
重新修改文件
让根文件以读写文件重新挂载
使用agetty
cd /mnt/sysroot/
vim etc/inittab
sync
由于切换系统太快
修复文件系统:
脚本编程知识
vim etc/rc.d/init.d/tserver
chroot /mnt/sysroot
当/dev/console不存在时,发生异常,修改脚本
文件系统出错
cd /mnt/sysroot
find . | cpio -H newc --quiet -o | gzip> /root/sysroot.2.gz
cd
fuser -km /mnt/sysroot
e2fsck -f /dev/hda2
mke2fs -j /dev/hda2
mount /dev/hda2 /mnt/sysroot
cd /mnt/sysroot
zcat /root/sysroot.2.gz | cpio -id
sync
sync
加载两个模块
系统自动装载模块
vim etc/rc.d/rc.sysinit
小系统出错
sync
vim /etc/rc.d/init.d/network
1.关机和重启
2.终端
3.主机名
4.IP地址(模块的装载和服务的实现)
5.functions
6.终端提示信息
/etc/issue文件的内容
7.rc.sysinit:挂载/etc/fstab中定义的其它文件系统
8.设定内核参数
/etc/sysctl.conf
sysctl -p
让系统启动时打印以上信息
/etc/issue文件的内容
只需要提供一个/etc/issue的文件,并在里面写一些信息,让它打印终端时显示
cat /proc/mounts 一个文件被挂载会出现在此文件中
awk ‘{print $1}’ /proc/mounts | grep “/dev/hda2”
cd /mnt/sysroot/
vim etc/rc.d/rc.sysinit
cat etc/fstab
设定内核参数
/etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1
vim etc/rc.d/rc.sysinit
所有开机生效的脚本必须卸载这个文件中
sync
重新启动小系统
修复
vim /mnt/boot/grub/grub.conf
支持用户账号
9用户
PAM:Pluggable Authentication Module
/etc/pam.d/*
绕过PAM,
/bin/login:
用户:UID
组:GID
login:验证
nsswitch:Network Service Switch
框架:/etc/passwd,/etc/shadow,/etc/group
库:libnss_file.so,libnss_nis.so,libness_ldap.so
配置文件:/etc/nsswitch.conf
/etc/passwd,/etc/shadow
NIS,LDAP,MySQL
/etc/mypasswd
/etc/passwd
/etc/group
cat /etc/nsswitch.conf
cat /etc/resolv.conf
vim /etc/hosts
ls -l /lib/libnss*
ls -l /usr/lib/libnss*
cp /etc/nsswitch.conf /mnt/sysroot/etc/
vim /mnt/sysroot/etc/nsswitch.conf
创建用户
cat /etc/passwd
useradd hadoop
passwd hadoop
cd /mnt/sysroot
vim etc/inittab
下载login
chmod +x login
sync
小系统出错,修复
cd /root/
vim .bash_profile
10.单用户模式
chmod -R og=--- root/
vim root/.bash_profile
export PS1=’[\u@\h \W]\$’
vim etc/inittab
man init
less /etc/init.d/single
chmod +x rc.d/init.d/single
cd rc.d/rc1.d/
ln -sv ../init.d/single S98single
ll
sync
cd /mnt/sysroot/
find . | cpio -H newc --quiet -o | gzip> /root/sysroot.8.gz
cd
sync
busybox:www.busybox.net
内核编译:
busybox:
Kernel+ROOTFS()
kernel+initrd(ramdisk)
busybox--->initrd
kernel+initrd(busybox)+rootfs(busybox)
RHEL5.8+busybox(initrd)+rootfs(busybox)
查看本机硬件设备信息:
1.cat/proc/cpuinfo
2.lsusb
3. lspci
4.hal-device
Hardware Abstract Layer
编译内核:
1.配置
make menuconfig
make gconfig
make kconfig
make oldconfig
make config
保存为.config
2.
make
make modules_install
make install
模块安装位置:/lib/modules/KERNEL_VERSION/
如何实现部分编译:
1.只编译某子目录下的相关代码:
make dir/
make arch/
make drivers/net/
2.只编译部分模块:
make M=dirvers/net/
3.只编译某一模块
make drivers/net/pcnet32.ko
4.将编译完成的结果放置在别的目录中
make O=/tmp/kernel
如何编译busybox:
www.busybox.net
IDE:
/dev/hda1: ext3 /boot
/dev/hda2: ext3 /
make install
编译可能出错,下载更新版本的busybox
chmod +x init
ls /mnt/boot/
vim /mnt/boot/grub/grub.conf
为init进程提供配置文件:
# vim etc/inittab
添加如下内容:
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
为系统准备一个“文件系统表”配置文件/etc/fstab
# vim etc/fstab
添加如下内容:
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
mknod dev/console c 5 1
mknod dev/null c 1 3
vim etc/rc.d/rc.sysinit
chmod +x /etc/rc.d/rc.sysinit
启动小系统出错
前提:
1、一个作为宿主机的Linux;本文使用的是RedhatEnterprise Linux 5.8;
2、在宿主机上提供一块额外的硬盘作为新系统的存储盘,为了降低复杂度,这里添加使用一块IDE接口的新硬盘;
3、Linux内核源码,busybox源码;本文使用的是目前最新版的linux-2.6.38.5和busybox-1.20.2。
说明:本文是一个step by step的实做指南;
一、为系统上的新硬盘建立分区,这里根据需要先建立一个大小为100M的主分区作为新建系统的boot分区和一个512M的分区作为目标系统(即正在构建的新系统,后面将沿用此名称)的根分区;100M的分区格式化后将其挂载至/mnt/boot目录下;512M的分区格式化后将挂载至/mnt/sysroot目录;
说明:
1、此处的boot和sysroot的挂载点目录名称尽量不要修改,尤其是boot目录,否则您必须保证后面的许多步骤都做了相应的改动;
2、新建系统的boot目录也可以跟根目录在同一个分区,这种方式比独立分区还要简单些,因此这里将不对此种方法再做出说明;
二、编译内核源代码,为新系统提供一个所需的内核(本例中的源代码包都位于/usr/src目录中)
# cd /usr/src
# tar jxvf linux-2.6.38.5.tar.bz2
# ln -sv linux-2.6.38.5 linux
# cd linux
然后下载ftp://172.16.0.1/pub/Sources/kernel/kernel-2.6.38.1-i686.cfg至当前目录中,并重命名为.config。
# make menuconfig
根据您的实际和规划选择所需要的功能;本实例计划制作一个具有网络的功能的微型linux且不打算使用内核模块,因此,这里选择把本机对应的网卡驱动直接编译进了内核。作者使用的是vmware Workstation虚拟机,所以,所需的网上驱动是pcnet32的,其它的均可按需要进行选择。选择完成后需要保存至当前目录下.config文件中。
# make SUBDIR=arch/
# cp arch/x86/boot/bzImage /mnt/boot
# make menuconfig
提示:为了实现后面的功能,请务必将文件系统中的ext3和网卡的驱动程序直接编译进内核;否则,就需要手动装载这些相关文件系统的模块;
三、编译busybox
# cd /usr/src
# tar -jxvf busybox-1.20.2.tar.bz2
# cd busybox-1.20.2
# mkdir include/mtd
# cp /usr/src/linux/include/mtd/ubi-user.h include/mtd/
# make menuconfig
说明:
1、此处需要选择 BusyboxSettings --> Build Options --> Build BusyBox as a static binary (no shared libs),这样可以把Busybox编译成一个不使用共享库的静态二进制文件,从而避免了对宿主机的共享库产生依赖;但你也可以不选择此项,而完成编译后把其依赖的共享库复制至目标系统上的/lib目录中即可;这里采用后一种办法。
2、修改安装位置为/mnt/sysroot;方法为:BusyboxSettings --> Installation Options --> (./_install) BusyBox installationprefix,修改其值为/mnt/sysroot。
# make install
安装后的文件均位于/mnt/sysroot目录中;但为了创建initrd,并实现让其启动以后将真正的文件系统切换至目标系统分区上的rootfs,您还需要复制一份刚安装在/mnt/sysroot下的busybox至另一个目录,以实现与真正的根文件系统分开制作。我们这里选择使用/mnt/temp目录;
# mkdir -pv /tmp/busybox
# cp -r /mnt/sysroot/* /tmp/busybox
四、制作initrd
# cd /tmp/busybox
1、建立rootfs:
# mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot
2、创建两个必要的设备文件:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、为initrd制作init程序,此程序的主要任务是实现rootfs的切换,因此,可以以脚本的方式来实现它:
# rm linuxrc
# vim init
添加如下内容:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
insmod /lib/modules/jbd.ko
insmod /lib/modules/ext3.ko
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /sbin/init
给此脚本执行权限:
chmod +x init
4、制作initrd
# find . | cpio --quiet -H newc -o | gzip -9 -n > /mnt/boot/initrd.gz
五、建立真正的根文件系统
# cd /mnt/sysroot
1、建立rootfs:
# mkdir -pv proc sys etc/rc.d/init.d tmp dev/pts boot var/log usr/lib
2、创建两个必要的设备文件:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、建立系统初始化脚本文件
# vim etc/rc.d/rc.sysinit
添加如下内容:
#!/bin/sh
echo -e "\tWelcome to \033[31mMageEdu\033[0m Linux"
echo -e "Remounting the rootfilesystem ..."
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /
echo -e "Creating the files of device..."
mdev -s
echo -e "Mounting the filesystem..."
mount -a
swapon -a
echo -e "Starting the log daemon..."
syslogd
klogd
echo -e "Configuring loopbackinterface ..."
ifconfig lo 127.0.0.1/24
ifconfig eth0 172.16.100.9/16
# END
而后让此脚本具有执行权限:
chmod +x etc/init.d/rc.sysinit
4、配置init及其所需要inittab文件
# cd /mnt/sysroot
# rm -f linuxrc
为init进程提供配置文件:
# vim etc/inittab
添加如下内容:
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、为系统准备一个“文件系统表”配置文件/etc/fstab
# vim etc/fstab
添加如下内容:
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
6、由于在rc.sysinit文件中启动了日志进程,因此系统在运行中会产生大量日志并将其显示于控制台;这将会经常性的打断正在进行的工作,为了避免这种情况,我们这里为日志进程建立配置文件,为其指定将日志发送至/var/log/messages文件;
# vim etc/syslog.conf
添加如下一行:
*.info /var/log/messages
六、好了,至此一个简易的基于内存运行的小系统已经构建出来了,我们接下来为此系统创建所需的引导程序
# grub-install --root-directory=/mnt /dev/hda
说明:此处的/dev/hda为目标系统所在的那块新磁盘;
接下来为grub建立配置文件:
# vim /mnt/boot/grub/grub.conf
添加类似如下内容:
default 0
timeout 3
color light-green/black light-magenta/black
title MageEdu Linux (2.6.38.5)
root (hd0,0)
kernel /bzImage ro root=/dev/hda2 quiet
initrd /initrd.gz
接下来将此块硬盘接入一个新的主机(这里使用的是虚拟机),启动一下并测试使用。
七、为新构建的ToyLinux启用虚拟控制台
这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置。我们这里采用通过宿主机的方式(重新启动宿主机):
# cd /mnt/sysroot
将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rc.sysinit
tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
好了,接下来就可以测试验正六个虚拟控制台的使用了。
八、尽管上述第七步已经实现了虚拟控制台,但其仍是直接进入系统,且系统没有用户帐号等安全设施,这将不利于系统的安全性。因此,接下来的这步实现为系统添加用户帐号(这里仍然基于宿主机实现)。
1、为目标主机建立passwd帐号文件
# cd /mnt/sysroot
# vim etc/passwd
添加如下内容:
root:x:0:0::/root:/bin/sh
而后为root用户创建“家”目录:
# mkdir root
2、为目标主机建立group帐号文件
# vim etc/group
添加如下内容:
root:x:0:
3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现
# grep "^root" /etc/shadow > etc/shadow
注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。您可以在目标主机启动以后再动手更改root用户的口令。
4、将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rc.sysinit
::respawn:/sbin/getty 9600 tty1
::respawn:/sbin/getty 9600 tty2
::respawn:/sbin/getty 9600 tty3
::respawn:/sbin/getty 9600 tty4
::respawn:/sbin/getty 9600 tty5
::respawn:/sbin/getty 9600 tty6
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
好了,接下来就可以重新启动目标主机进行验正了。
九、在系统登录时提供banner信息
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
# vi /etc/issue
添加如下内容:
Welcome to MageEduLinux(http://www.magedu.com)...
Kernel \r
注:这里的内容可以根据你的需要进行修改。
十、在系统启动时为系统提供主机名称:
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
1、创建保存主机名称的配置文件
# mkdir /etc/sysconfig
# vi /etc/sysconfig/network
添加如下内容:
HOSTNAME=marion.example.com
2、编辑系统初始化脚本,实现开机过程中设定主机名称
# vi /etc/init.d/rc.sysinit
在文件尾部添加如下行:
HOSTNAME=
[ -e /etc/sysconfig/network &&-r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
/bin/hostname ${HOSTNAME}
十一、通过dropbear为系统提供ssh远程连接服务
注:以下过程在宿主机上实现。
1、编译安装dropbear
# tar xf dropbear-2013.56.tar.bz2
# cd dropbear-2013.56
# ./configure
# make
# make install
2、移植dropbear至目标系统
移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用脚本进行(这里将其保存为bincp.sh),其会自动移植指定的命令及依赖的库文件。
#!/bin/bash
#
read -t 30 -p "Target SystemDirectory[/mnt/sysroot]: " DEST
DEST=${DEST:-/mnt/sysroot}
libcp() {
LIBPATH=${1%/*}
[ !-d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
[ !-e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1finished."
}
bincp() {
CMDPATH=${1%/*}
[ !-d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
[ !-e $DEST${1} ] && cp $1 $DEST$CMDPATH
forLIB 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
接下来运行此脚本,分别输入dropbear、dropbearkey和dbclient即可;这些命令会被存储于目标系统的/usr/local/sbin或/usr/local/bin目录中。
3、为远程登录的用户提供伪终端设备文件
编辑/mnt/sysroot/etc/fstab,添加如下一行:
devpts /dev/pts devpts mode=620 0 0
创建所需要的目录:
# mkdir /mnt/sysroot/dev/pts
4、为目标系统的dropbear生成主机密钥
默认情况下,dropbear到/etc/dropbear目录中查找使用的rsa格式主机密钥(默认名称为dropbear_rsa_host_key)和dss格式的主机密钥(默认名称为dropbear_dss_host_key)。其中,rsa格式可使用不同长度的密钥,但dss格式只使用1024位的密钥。
# mkdir /mnt/sysroot/etc/dropbear
# dropbearkey -t rsa -f/etc/dropbear/dropbear_rsa_host_key -s 2048
# dropbearkey -t rsa -f/etc/dropbear/dropbear_dss_host_key
在生成rsa格式的key时,其长度指定部分-s 2048可以省略,也可以为其指定为其它长度,但长度需要为8的整数倍。
说明:此步骤也可以在目标主机上进行,但路径要做相应的修改。
5、定义安全shell
安全起见,dropbear默认情况下仅允许其默认shell出现在/etc/shells文件中的用户远程登录,因此,这里还需要创建/etc/shells文件,并添加所有允许的shell。
# cat >> /mnt/sysroot/etc/shells<< EOF
/bin/sh
/bin/ash
/bin/hush
/bin/bash
EOF
6、为目标主机提供网络服务转换机制
在宿主机上使用默认选项编译的dropbear将依赖nsswitch实现用户名称解析,因此,还需要为目标主机提供nss相关的库文件及配置文件。
# cat >>/mnt/sysroot/etc/nsswitch.conf << EOF
passwd: files
shadow: files
group: files
hosts: files dns
EOF
复制所需要的库文件:
# cp -d /lib/libnss_files* /mnt/sysroot/lib/
# cp -d /usr/lib/libnss3.so/usr/lib/libnss_files.so /mnt/sysroot/usr/lib/
7、测试
启动目标主机,设定好网络属性后,使用如下命令启动dropbear服务即可。
# /usr/local/sbin/dropbear
接下来就可以远程进行连接测试了。
十二、通过nginx提供web服务
1、在宿主机编译安装nginx-1.2.5
# tar nginx-1.2.5.tar.gz
# cd nginx-1.2.5
# ./configure --prefix=/usr/local--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --user=nginx --group=nginx--http-log-path=/var/log/nginx/access.log --without-pcre --without-http_rewrite_module --without-http_geo_module--without-http_fastcgi_module --without-http_uwsgi_module --without-http_scgi_module --without-http_memcached_module--without-http_upstream_ip_hash_module --without-http_upstream_least_conn_module --without-http_upstream_keepalive_module--http-log-path=/var/log/nginx
# make
# make install
2、移植nginx至目标系统
(1) 移植二进制程序及其依赖的库文件,方能实现其在目标系统上正常运行。建议使用前面的bincp.sh脚本进行。
(2) 移植配置文件至目标系统
# mkdir /mnt/sysroot/etc/nginx/
# cp /etc/nginx/{nginx.conf,mime.types} /mnt/sysroot/etc/nginx/
(3) 移植测试页面至目标系统,当然,也可以不采用下面的步骤而在目标系统上直接创建。
# mkdir /mnt/sysroot/usr/local/
# cp -r /usr/local/html /mnt/sysroot/usr/local/
3、测试
启动目标主机,首先配置好网络属性,并使用adduser为其添加nginx用户和nginx组。
然后使用如下命令启动nginx,即可通过浏览器测试访问。
# /usr/local/nginx
如何实现部分编译:
1、只编译某子目录下的相关代码:
make dir/
make arch/
make drivers/net/
2、只编译部分模块
make M=drivers/net/
3、只编译某一模块
make drivers/net/pcnet32.ko
4、将编译完成的结果放置于别的目录中
make O=/tmp/kernel
5、交叉编译
make ARCH=
如何编译busybox:
IDE:
/dev/hda1: ext3 /boot
/dev/hda2: ext3 /
脚本编程知识点:
1、变量中字符的长度:${#VARNAME}
2、变量赋值等:
${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
3、脚本配置文件
/etc/rc.d/init.d/服务脚本
服务脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件
vim a.sh
vim a.conf
TEST=’hello world’
4、局部变量
local VAR_NAME=
a=1
test() {
a=$[3+4]
}
test
for I in `seq $a 10`; do
echo $I
done
vim b.sh
chmod +x b.sh
./b.sh
7
8
9
10
5、命令mktemp
创建临时文件或目录
mktemp /tmp/file.XX
-d:创建为目录
6、信号
kill -SIGNAL PID
1:HUP
2:INT
9:KILL
15:TERM
脚本中,能实现信号捕捉,但9和15无法捕捉
Ctrl+c: SIGINT
trap命令:
trap'COMMAND' 信号列表
vim showdate.sh
kill %1 后台杀死
判断局域网主机是否在线
chmod +x ping.sh
./ping.sh
Ctrl+c不能停止,被ping命令捕捉
7、一行执行多个语句,语句间用分号分隔
Ctrl+c退出
捕捉信号并清理程序产生的数据
任务计划:
1、在未来的某个时间点执行一次某任务;
at
batch
at时间
at>COMMAND
at>Ctrl+d
指定时间:
绝对时间:HH:MM,DD.MM.YY MM/DD/YY
相对时间:now+#
单位:minutes,hours, days, weeks
模糊时间:noon,midnight, teatime
命令的执行结果:将以邮件的形式发送给安排任务的用户
at-l = atq
at-d AT_JOB_ID = atrm AT_JOB_ID
2、周期性地执行某任务;
cron:自身是一个不间断运行的服务
anacron:cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;
cron:
系统cron任务:
/etc/crontab
分钟 小时 天 月 周 用户 任务
用户cron任务:
/var/spool/cron/USERNAME
分钟 小时 天 月 周 任务
时间的有效取值:
分钟:0-59
小时:0-23
天:1-31
月:1-12
周:0-7,0和7都表示周日
时间通配表示:
*:对应时间的所有有效取值
3* * * *
3* * * 7
1312 6 7 *
,:离散时间点:
10,4002 * * 2,5
-:连续时间点:
1002 * * 1-5
/#:对应取值范围内每多久一次
*/3* * * *
每两小时执行一次:
08*/2 * * *
每两天执行一次:
1004 */2 * *
执行结果将以邮件形式发送给管理员:
*/3* * * * /bin/cat /etc/fstab &> /dev/null
cron的环境变量:cron执行所有命令都去PATH环境变量指定的路径下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
用户任务的管理:
crontab
-l:列出当前用户的所有cron任务
-e:编辑
-r:移除所有任务
-uUSERNAME: 管理其用户的cron任务
vim /etc/crontab
cd /var/spool/cron
crontabl -l
crontab -e
*/3 * * * * /bin/echo “how are ya?”
crontab -u hadoop -e
*/3 * * * * /bin/echo “how are ya?”
su - hadoop
crontab -l
anacron:
cat /etc/anacrontab
service cron status
service anacron statu
Kernel+initrd(busybox制作,提供ext3文件系统模块)+ROOTFS(busybox制作)
make arch/
内核在arch/x86/boot/bzImage
硬件驱动:initrd存在主要是挂载根文件系统
initrd:仅需要提供内核访问真正的根文件系统所在设备需要的驱动
存储设备和文件系统相关的模块
系统初始化rc.sysinit:初始其它硬件的驱动程序
使用busybox制作rootfs:要使用bash该如何?
init不支持运行级别
/etc/inittab:格式也不近相同
busybox仅提供ash,hush
内核:
make SUBDIR=arch/
make arch/x86/
/boot/vmlinuz
/mnt/boot:
/mnt/sysroot:
makedrivers/
makedrivers/net/
makedrivers/net/pcnet32.ko
makearch/x86
makemenuconfig
makeinstall
screen-sl
screen-r 22367
lsarch/x86/boot/
编译出现错误,重新做
makeclean
makemrproper
cp/root/config-2.6.38.5-i686.cfg .config
makeSUBDIR=arch/
rmlinuxrc
mknoddev/console c 5 1
mknoddev/null c 1 3
vim init