Linux内核编译及系统裁剪

核心:/boot/vmlinuz-version

内核模块(ko):/lib/modules/version/

内核设计:

      单内核

            模块化设计

      微内核

装载模块:

       insmod

       modprobe

www.kernel.org

Linux内核编译及系统裁剪_第1张图片

用户空间访问,监控内核的方式:

/proc,/sys

Linux内核编译及系统裁剪_第2张图片

Linux内核编译及系统裁剪_第3张图片

伪文件系统

/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:显示所有内核参数及其值

Linux内核编译及系统裁剪_第4张图片

内核模块管理:

  lsmod:列出当前内核装载了那些模块

  modprobe MOD_NAME:装载指定模块

  modprobe -r MOD_NAME:卸载某模块

modinfo MOD_NAME:查看模块的具体信息

insmod /PATH/TO/MODULE_FILE:装载模块

rmmod MOD_NAME             

depmod /PATH/TO/MODILES_DIR

Linux内核编译及系统裁剪_第5张图片

Linux内核编译及系统裁剪_第6张图片

内核中的功能除了核心功能之外,在编译时,大多数

1.不使用此功能

2.编译成内核模块

3.编译进内核

下载历史版本内核:https://www.kernel.org/pub/linux/kernel/v2.6/

编译安装linux内核步骤

编译安装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

Linux内核编译及系统裁剪_第7张图片

如何手动编译内核:

make gconfig: Gnome桌面环境使用,需要安装图形开发库组:GNOME Software Development

make kconfig: KDE桌面环境使用,需要安装图形开发库

 

make menuconfig: 打开文本菜单

Linux内核编译及系统裁剪_第8张图片

*:做进内核

M:做成模块

[ ]:啥也不做


多出.config文件

Linux内核编译及系统裁剪_第9张图片

Linux内核编译及系统裁剪_第10张图片

Linux内核编译及系统裁剪_第11张图片

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硬盘

Linux内核编译及系统裁剪_第12张图片

Linux内核编译及系统裁剪_第13张图片

mke2fs -j /dev/hda1

mke2fs -j /dev/hda2

Linux内核编译及系统裁剪_第14张图片

grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)

mkinitrd initrd文件路径  内核版本号

mkinitrd /boot/initrd-`uname -r`.img `uname -r`

Linux内核编译及系统裁剪_第15张图片

Linux内核编译及系统裁剪_第16张图片


Linux内核编译及系统裁剪_第17张图片

Linux内核编译及系统裁剪_第18张图片

Linux内核编译及系统裁剪_第19张图片

Linux内核编译及系统裁剪_第20张图片

Linux内核编译及系统裁剪_第21张图片

Linux内核编译及系统裁剪_第22张图片


Linux内核编译及系统裁剪_第23张图片


新建一个虚拟机,挂载小linux

Linux内核编译及系统裁剪_第24张图片

${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.

Linux内核编译及系统裁剪_第25张图片

复制二进制程序及其依赖的库文件的脚本:

#!/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
Linux内核编译及系统裁剪_第26张图片

mkdir /mnt/sysroot/lib/modules

modinfo mii

modinfo pcnet32

开机自动装载两个模块

Linux内核编译及系统裁剪_第27张图片

Linux内核编译及系统裁剪_第28张图片

/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硬盘,挂载

Linux内核编译及系统裁剪_第29张图片

Linux内核编译及系统裁剪_第30张图片

Linux内核编译及系统裁剪_第31张图片

Linux内核编译及系统裁剪_第32张图片

Linux内核编译及系统裁剪_第33张图片


vim etc/inittab


vim etc/rc.d/rc.sysinit


Linux内核编译及系统裁剪_第34张图片

chmod +x etc/rc.d/rc.sysinit

Linux内核编译及系统裁剪_第35张图片

Linux内核编译及系统裁剪_第36张图片

新建虚拟机,挂在刚才的系统

移植一些命令

Linux内核编译及系统裁剪_第37张图片

Linux内核编译及系统裁剪_第38张图片

启动测试以下

mount

-n:挂载时不更新/etc/mtab文件

cat /proc/mounts

Linux内核编译及系统裁剪_第39张图片

如何让系统自动关机呢?

Linux内核编译及系统裁剪_第40张图片

Linux内核编译及系统裁剪_第41张图片


init 0系统关机

如何让系统重启呢?

Linux内核编译及系统裁剪_第42张图片


Linux内核编译及系统裁剪_第43张图片

重启

Linux内核编译及系统裁剪_第44张图片

一个脚本既能关机又能重启

Linux内核编译及系统裁剪_第45张图片

Linux内核编译及系统裁剪_第46张图片

Linux内核编译及系统裁剪_第47张图片

Linux内核编译及系统裁剪_第48张图片


添加3级别

Linux内核编译及系统裁剪_第49张图片


Linux内核编译及系统裁剪_第50张图片

Linux内核编译及系统裁剪_第51张图片

使用chkconfig添加服务脚本

Linux内核编译及系统裁剪_第52张图片

让在3级别能启动起来

Linux内核编译及系统裁剪_第53张图片

3级别不能执行到

执行/etc/rc.d/rc.sysinit就能完成重启,不能轮到3级别,但可执行0,6级别

重新修改文件

Linux内核编译及系统裁剪_第54张图片

Linux内核编译及系统裁剪_第55张图片

Linux内核编译及系统裁剪_第56张图片

Linux内核编译及系统裁剪_第57张图片


让根文件以读写文件重新挂载

Linux内核编译及系统裁剪_第58张图片



Linux内核编译及系统裁剪_第59张图片

使用agetty

Linux内核编译及系统裁剪_第60张图片

cd /mnt/sysroot/

vim etc/inittab

Linux内核编译及系统裁剪_第61张图片

sync

由于切换系统太快

Linux内核编译及系统裁剪_第62张图片

修复文件系统:

Linux内核编译及系统裁剪_第63张图片

Linux内核编译及系统裁剪_第64张图片

脚本编程知识

Linux内核编译及系统裁剪_第65张图片


Linux内核编译及系统裁剪_第66张图片

Linux内核编译及系统裁剪_第67张图片

vim etc/rc.d/init.d/tserver



chroot /mnt/sysroot

Linux内核编译及系统裁剪_第68张图片

当/dev/console不存在时,发生异常,修改脚本

Linux内核编译及系统裁剪_第69张图片

Linux内核编译及系统裁剪_第70张图片

文件系统出错

Linux内核编译及系统裁剪_第71张图片

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

加载两个模块

Linux内核编译及系统裁剪_第72张图片

系统自动装载模块

vim etc/rc.d/rc.sysinit

Linux内核编译及系统裁剪_第73张图片



Linux内核编译及系统裁剪_第74张图片

Linux内核编译及系统裁剪_第75张图片

Linux内核编译及系统裁剪_第76张图片

小系统出错

Linux内核编译及系统裁剪_第77张图片

sync

Linux内核编译及系统裁剪_第78张图片

Linux内核编译及系统裁剪_第79张图片

vim /etc/rc.d/init.d/network

Linux内核编译及系统裁剪_第80张图片

Linux内核编译及系统裁剪_第81张图片

bash脚本编程 Linux系统裁剪之三 系统函数库

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的文件,并在里面写一些信息,让它打印终端时显示

Linux内核编译及系统裁剪_第82张图片


cat /proc/mounts 一个文件被挂载会出现在此文件中

awk ‘{print $1}’ /proc/mounts | grep “/dev/hda2”

Linux内核编译及系统裁剪_第83张图片

Linux内核编译及系统裁剪_第84张图片


cd /mnt/sysroot/

vim etc/rc.d/rc.sysinit

cat etc/fstab

Linux内核编译及系统裁剪_第85张图片

设定内核参数

  /etc/sysctl.conf

  sysctl -p


net.ipv4.ip_forward = 1

Linux内核编译及系统裁剪_第86张图片

vim etc/rc.d/rc.sysinit

所有开机生效的脚本必须卸载这个文件中

Linux内核编译及系统裁剪_第87张图片

sync

重新启动小系统

Linux内核编译及系统裁剪_第88张图片

修复

Linux内核编译及系统裁剪_第89张图片

vim /mnt/boot/grub/grub.conf


Linux内核编译及系统裁剪_第90张图片


Linux内核编译及系统裁剪_第91张图片

支持用户账号

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*

Linux内核编译及系统裁剪_第92张图片

Linux内核编译及系统裁剪_第93张图片

cp /etc/nsswitch.conf /mnt/sysroot/etc/

vim /mnt/sysroot/etc/nsswitch.conf


创建用户

cat /etc/passwd

useradd hadoop

passwd hadoop

Linux内核编译及系统裁剪_第94张图片

Linux内核编译及系统裁剪_第95张图片

cd /mnt/sysroot

vim etc/inittab

Linux内核编译及系统裁剪_第96张图片

下载login

chmod +x login

Linux内核编译及系统裁剪_第97张图片

sync

Linux内核编译及系统裁剪_第98张图片

小系统出错,修复

Linux内核编译及系统裁剪_第99张图片

Linux内核编译及系统裁剪_第100张图片

cd /root/

vim .bash_profile


Linux内核编译及系统裁剪_第101张图片


10.单用户模式

Linux内核编译及系统裁剪_第102张图片

chmod -R og=--- root/

vim root/.bash_profile

export PS1=’[\u@\h \W]\$’

vim etc/inittab

Linux内核编译及系统裁剪_第103张图片

Linux内核编译及系统裁剪_第104张图片

man init

less /etc/init.d/single


Linux内核编译及系统裁剪_第105张图片

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

Linux内核编译及系统裁剪_第106张图片

Linux系统裁剪 自定义内核及busybox完成系统定制

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

Linux内核编译及系统裁剪_第107张图片

Linux内核编译及系统裁剪_第108张图片

Linux内核编译及系统裁剪_第109张图片

Linux内核编译及系统裁剪_第110张图片

Linux内核编译及系统裁剪_第111张图片

chmod +x init

Linux内核编译及系统裁剪_第112张图片

Linux内核编译及系统裁剪_第113张图片

ls /mnt/boot/

vim /mnt/boot/grub/grub.conf


Linux内核编译及系统裁剪_第114张图片

为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

Linux内核编译及系统裁剪_第115张图片

chmod +x /etc/rc.d/rc.sysinit

启动小系统出错

Linux内核编译及系统裁剪_第116张图片

一步步手动构建小于10M的类嵌入式Linux系统

前提:

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/服务脚本同名的配置文件

Linux内核编译及系统裁剪_第117张图片

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

Linux内核编译及系统裁剪_第118张图片

chmod +x b.sh

./b.sh

7

8

9

10

5、命令mktemp

创建临时文件或目录

mktemp /tmp/file.XX

         -d:创建为目录

Linux内核编译及系统裁剪_第119张图片

Linux内核编译及系统裁剪_第120张图片

6、信号

kill -SIGNAL PID

         1:HUP

         2:INT

         9:KILL

         15:TERM

脚本中,能实现信号捕捉,但9和15无法捕捉

Ctrl+c: SIGINT

trap命令:

         trap'COMMAND' 信号列表

vim showdate.sh

Linux内核编译及系统裁剪_第121张图片

Linux内核编译及系统裁剪_第122张图片

kill %1 后台杀死

判断局域网主机是否在线

Linux内核编译及系统裁剪_第123张图片

chmod +x ping.sh

./ping.sh

Ctrl+c不能停止,被ping命令捕捉

7、一行执行多个语句,语句间用分号分隔

Linux内核编译及系统裁剪_第124张图片

Ctrl+c退出

捕捉信号并清理程序产生的数据

Linux内核编译及系统裁剪_第125张图片

任务计划:

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

Linux内核编译及系统裁剪_第126张图片

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

Linux内核编译及系统裁剪_第127张图片

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

Linux内核编译及系统裁剪_第128张图片

service cron status

service anacron statu

Linux系统裁剪之五

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:

Linux内核编译及系统裁剪_第129张图片

Linux内核编译及系统裁剪_第130张图片

makedrivers/

makedrivers/net/

makedrivers/net/pcnet32.ko

makearch/x86

Linux内核编译及系统裁剪_第131张图片

Linux内核编译及系统裁剪_第132张图片

makemenuconfig

makeinstall

screen-sl

screen-r 22367

lsarch/x86/boot/

编译出现错误,重新做

makeclean

makemrproper

cp/root/config-2.6.38.5-i686.cfg .config

makeSUBDIR=arch/

Linux内核编译及系统裁剪_第133张图片

rmlinuxrc

mknoddev/console c 5 1

mknoddev/null c 1 3

vim init

Linux内核编译及系统裁剪_第134张图片

Linux内核编译及系统裁剪_第135张图片

Linux内核编译及系统裁剪_第136张图片

















你可能感兴趣的:(运维)