八、Linux精简系统和内核管理裁剪(一)
一、内核
1、什么是内核
内核其实就是操作系统,是驱动计算机硬件,实现人机操作,并提供其他服务器功能的底层系统。linux操作系统也称为“内核”,指的是同一件事情。
linux的内核是以模块化的方式工作的,主要工作任务包括存储管理、cpu管理、进程管理、文件系统管理、设备驱动管理、网络管理、系统调用、安全管理等。
2、内核的组成部分包括vmlinuz、initrd(linux5)或者initramfs(linux6)、/lib/modules(模块,子核心)
二、内核设计
微内核
就是主核心加上子核心的方式。
例如:windows,salors
单内核
所有功能整合在一起使用的方式。
例如:linux(支持模块方式,*.ko,“kernel object”)
三、系统调用
linux内核实现了将硬件功能抽象化的过程,就是可以实现程序的管控,最终体现在程序上就是系统调用,系统调用就是对各个硬件功能的一种体现,实际上系统调用的功能有很多,所有就产生了很多种系统调用(函数)。开发者也可以开发出更多的标准库(glibc),就是用于和系统调用通讯的程序。这个标准库可以共享给更多的程序使用,简化了应用程序开发的复制程度。
实现系统调用的进程就是init进程。
四、init进程
init是系统启动的第一个进程,也是其他所有进程的父进程,其他进程的维护依赖于它,redhat5使用的是init这个名词,而redhat6设计了一个全新的init系统称为“upstart”,而最新的redhat7采用的是systemd的init系统。
windows操作系统使用的初始化引导文件是ntloader
运行级别:不同的运行级别系统加载的内核内容是不同的,类似windows的安全模式相关列表。
1、进程的种类:
1.1守护进程(daemon,服务):运行在后台的特殊进程,是一个长期存在的进程,独立于控制终端,并且周期性的执行某种任务或等待处理某些事情的发送。这里所说的独立于控制终端,就是说不受终端tty、pts之类的进程影响。通常进程名以“d”结尾。
[root@37-test ~]# ps axj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 1 1 ? -1 Ss 0 0:01 /sbin/init
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 [migration/0]
2 4 0 0 ? -1 S 0 0:01 [ksoftirqd/0]
2 5 0 0 ? -1 S 0 0:00 [stopper/0]
2 6 0 0 ? -1 S 0 0:03 [watchdog/0]
2 7 0 0 ? -1 S 0 0:00 [migration/1]
2 8 0 0 ? -1 S 0 0:00 [stopper/1]
2 9 0 0 ? -1 S 0 0:00 [ksoftirqd/1]
2 10 0 0 ? -1 S 0 0:03 [watchdog/1]
2 11 0 0 ? -1 S 0 0:00 [migration/2]
TPGID标注-1的进程就是没有控制终端的进程即守护进程
command中带有[ ]表示内核进程
1.2交互进程
1.3批处理进程
2、who命令
-a等于-b -d --login -p -r -t -T -u 选项的组合、
-b显示上次系统开启时间
-d显示死进程
—login显示系统登录进程
-p显示由init衍生的进程
-r显示运行级别
-T显示消息状态(mesg)
-u列出已经登录的用户
[root@37-test ~]# who -a
系统引导 2016-12-09 10:35
运行级别 3 2016-12-09 10:35
root + pts/0 2017-01-10 11:09 . 21368 (10.40.0.57)
pts/1 2016-12-23 11:50 23119 id=ts/1 终端=0 退出=0
查看系统版本:
[root@37-test ~]# cat /etc/issue
****************************************************************
Wellcome to PEP e-Ecampus Live System!
****************************************************************
active status: actived
serivce status: Error
service address: eth0(10.40.0.37)
setup address: eth1()
****************************************************************
[root@37-test ~]# uname -a
Linux 37-test 2.6.32-642.11.1.el6.x86_64 #1 SMP Fri Nov 18 19:25:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
运行级别操作
1、显示运行级别
who -r
[root@37-test ~]# who -r
运行级别 3 2016-12-09 10:35
2、切换运行级别
[root@37-test ~]# init 3
3、chkconfig
手动设置运行级别程序
管理员可以手动添加、删除已知的程序,达到在系统启动时关闭或开启某一个程序的运行。
参数:
—add添加启动程序
—del删除启动程序
—level
—list查看当前启动的程序
[root@37-test ~]# chkconfig --level 3 httpd on
[root@37-test ~]# chkconfig --list httpd
httpd 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:关闭 6:关闭
4、系统启动流程:
LILO:早期linux boot loader(引导程序)
GRUB:突破了446字节限制(mbr)。
grub如何实现突破限制的功能,其实很简单,就是讲应该写引导内容的位置改为存放一个连接地址,这个地址在硬盘上存放了引导文件,而非0扇区0磁道的512字节上。这样就突破了磁盘的限制。
进程类型:
守护进程:系统启动后启动服务时所运行的进程。
守护进程由init启动,由于有相互依赖关系,早期的启动是需要按依赖顺序启动的。
rhel5:init、按顺序启动
rhel6:upstart 、可以不按照顺序启动
fedora:upstart
fedora:systemd,基于d-bus通讯,兼容init,借鉴macios系统。
4.1、加电自检,post,加电后cpu加载rom里面的内容到cpu中,主要是检测硬件状况,cmos设置。查看启动设备(从什么设备上启动,是光驱、u盘、硬盘、网卡),如果是硬盘,读取mbr信息(LILO/NTLOADER/GRUB),包括:启动程序bootloader、分区表。通过mbr加载内核,了解文件系统及驱动。
4.2、加载linux的内核kernel,完成基本的硬件驱动初始化,装载/sbin/init根文件系统。linux内核是模块化的,这些模块存储在[root@37-test ~]# ll /lib/modules/2.6.32-220.el6.x86_64/ ,而这个目录又在后面需要加载的根目录下,会产生冲突,所以需要先将必要的模块直接整合到内核中,也就是initrd,initramfs。
RAM DISK(内存中临时根文件系统) ——initrd
RAM FS---------initramfs
内核模块位置:
[root@37-test ~]# ll /lib/modules/2.6.32-220.el6.x86_64/
总用量 3216
lrwxrwxrwx. 1 root root 46 8月 26 2012 build -> ../../../usr/src/kernels/2.6.32-220.el6.x86_64
drwxr-xr-x. 2 root root 4096 12月 7 2011 extra
drwxr-xr-x. 11 root root 4096 8月 26 2012 kernel
-rw-r--r--. 1 root root 529526 8月 26 2012 modules.alias
-rw-r--r--. 1 root root 509216 8月 26 2012 modules.alias.bin
-rw-r--r--. 1 root root 1310 12月 7 2011 modules.block
-rw-r--r--. 1 root root 69 8月 26 2012 modules.ccwmap
-rw-r--r--. 1 root root 191785 8月 26 2012 modules.dep
-rw-r--r--. 1 root root 280509 8月 26 2012 modules.dep.bin
-rw-r--r--. 1 root root 68 12月 7 2011 modules.drm
-rw-r--r--. 1 root root 665 8月 26 2012 modules.ieee1394map
-rw-r--r--. 1 root root 141 8月 26 2012 modules.inputmap
-rw-r--r--. 1 root root 1236 8月 26 2012 modules.isapnpmap
-rw-r--r--. 1 root root 29 12月 7 2011 modules.modesetting
-rw-r--r--. 1 root root 1859 12月 7 2011 modules.networking
-rw-r--r--. 1 root root 74 8月 26 2012 modules.ofmap
-rw-r--r--. 1 root root 73619 12月 7 2011 modules.order
-rw-r--r--. 1 root root 375656 8月 26 2012 modules.pcimap
-rw-r--r--. 1 root root 6259 8月 26 2012 modules.seriomap
-rw-r--r--. 1 root root 193682 8月 26 2012 modules.symbols
-rw-r--r--. 1 root root 247713 8月 26 2012 modules.symbols.bin
-rw-r--r--. 1 root root 773964 8月 26 2012 modules.usbmap
lrwxrwxrwx. 1 root root 5 8月 26 2012 source -> build
drwxr-xr-x. 2 root root 4096 12月 7 2011 updates
drwxr-xr-x. 2 root root 4096 8月 26 2012 vdso
drwxr-xr-x. 2 root root 4096 12月 7 2011 weak-updates
4.3、通过init的配置文件/etc/inittab来决定运行级别,并通过/etc/rc.d/rc?.d/目录下的脚步来选择性的启动/etc/rc.d/init.d/目录下的程序。
[root@37-test ~]# tree /etc/rc.d/
/etc/rc.d/
├── init.d
│ ├── atd
│ ├── auditd
│ ├── blk-availability
│ ├── cento
│ ├── cluster
│ ├── crond
│ ├── crtmp
│ ├── cups
│ ├── disk2n
│ ├── dkms_autoinstaller
│ ├── dnsmasq
│ ├── fcoe
│ ├── fms
│ ├── functions
│ ├── haldaemon
│ ├── halt
│ ├── htcacheclean
│ ├── httpd
│ ├── ip6tables
│ ├── iptables
│ ├── ipvsadm
│ ├── iscsi
│ ├── iscsid
│ ├── killall
│ ├── lldpad
│ ├── lvm2-lvmetad
系统加载的服务默认是存放在/etc/rc.d/init.d/*下,不同级别的用户开机启动的服务是不同的,用户级别通过/etc/rc.d/下的rc0-6.d下的配置文件来决定,而这些配置文件只是连接文件,最终指向的还是/etc/rc.d/init.d/服务配置文件,那么如何决定不同级别启动哪些文件呢,就要使用/etc/rc.d/rc这个文件来决定,他通过循环命令将rc0-6
.d目录下的k开头的文件全部禁用,而s开头的全部启用。而s或k后面的数字表示启动的顺序,这个数值有/etc/rc.d/init.d/目录下的服务的配置文件内容决定。
[root@37-test ~]# more /etc/rc.d/rc |grep -v ^$
#! /bin/bash
#
# rc This file is responsible for starting/stopping
# services when the runlevel changes.
#
# Original Author:
# Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#
set -m
# check a file to be a correct runlevel script
check_runlevel ()
{
# Check if the file exists at all.
[ -x "$1" ] || return 1
is_ignored_file "$1" && return 1
return 0
}
[root@37-test ~]# more /etc/rc.d/init.d/crond
#!/bin/sh
#
# crond Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
# programs at periodic scheduled times. vixie cron adds a \
# number of features to the basic UNIX cron, including better \
# security and more powerful configuration options.
例如:配置文件的chkconfig:2345 90 60
2345表示在此范围级别按照S启动,其他按照K执行。s后面的优先级为90 ,k后面的优先级是60
# chkconfig: - 25 10
25位置的数字常用于开启某个程序,而10位置的数字常用于关闭某个程序。
[root@localhost ~]# find /etc/rc.d/ -name *cups
/etc/rc.d/rc5.d/S25cups
/etc/rc.d/rc1.d/K10cups
/etc/rc.d/init.d/cups
/etc/rc.d/rc4.d/S25cups
/etc/rc.d/rc6.d/K10cups
/etc/rc.d/rc0.d/K10cups
/etc/rc.d/rc3.d/S25cups
/etc/rc.d/rc2.d/S25cups
配置文件:
init:/etc/inittab(centos 5)
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
upstart:/etc/init/*.conf(centos 6)
[root@37-test ~]# ls /etc/init/
cento.conf n2disk.conf rcS-emergency.conf
ck-log-system-restart.conf nprobe.conf rcS-sulogin.conf
ck-log-system-start.conf pf_ring.conf serial.conf
ck-log-system-stop.conf plymouth-shutdown.conf splash-manager.conf
control-alt-delete.conf prefdm.conf start-ttys.conf
disk2n.conf quit-plymouth.conf tty.conf
init-system-dbus.conf rc.conf
kexec-disable.conf rcS.conf
sysinit:系统初始化脚本,在系统启动时加载的脚本目录位于/etc/rc.d/rc.sysinit。
[root@37-test ~]# more /etc/rc.d/rc.sysinit
[root@37-test ~]# ll /etc/rc.d/
总用量 60
drwxr-xr-x. 2 root root 4096 12月 30 04:03 init.d
-rwxr-xr-x. 1 root root 2617 12月 9 2011 rc
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc0.d
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc1.d
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc2.d
drwxr-xr-x. 2 root root 4096 1月 10 15:57 rc3.d
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc4.d
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc5.d
drwxr-xr-x. 2 root root 4096 12月 30 04:03 rc6.d
-rwxr-xr-x. 1 root root 407 12月 1 13:53 rc.local
-rwxr-xr-x. 1 root root 19285 12月 9 2011 rc.sysinit //系统初始化脚本
主要内容:
激活selinux和udev
根据/etc/sysctl.conf文件设置内核参数
设置系统时钟
装载系统时钟
装载键映射
启动交互分区
设置主机名
根据文件系统检测并重新挂载其为读写
激活raid和lvm
检查和挂载其他文件系统:/etc/fstab中的定义
清理操作
选择执行/etc/rc.d/rc#.conf文件。
六、再说系统引导
1、启动流程:
1、post
2、bootloader(mbr:446,stage2:/boot/grub)
3、kernel+initrd(initramfs)(硬件检测、安装驱动,只读方式挂载根文件系统,执行/sbin/init-->init(5版本/etc/inittab(6版本是/etc/init/*.conf)),通过/etc/inittab设置默认运行级别。
4、执行系统初始化脚本/etc/rc.d/rc.sysinit,按需启动对象级别下的服务,启动终端)
系统的多重引导实际上就是在引导菜单选择的时候,指向不同的引导程序,而这个引导程序可以在不同分区的引导扇区,可以不再MBR中。
由于grub引导文件不支持LVM文件系统,所以在使用lvm进行分区的时候,必须把/boot分区单独分开而不能同根分区在一起。
[root@37-test ~]# ll /boot/grub/
总用量 280
-rw-r--r--. 1 root root 63 8月 26 2012 device.map
-rw-r--r--. 1 root root 13380 8月 26 2012 e2fs_stage1_5
-rw-r--r--. 1 root root 12620 8月 26 2012 fat_stage1_5
-rw-r--r--. 1 root root 11748 8月 26 2012 ffs_stage1_5
-rw------- 1 root root 1118 12月 5 16:01 grub.conf
-rw-r--r--. 1 root root 11756 8月 26 2012 iso9660_stage1_5
-rw-r--r--. 1 root root 13268 8月 26 2012 jfs_stage1_5
lrwxrwxrwx. 1 root root 11 8月 26 2012 menu.lst -> ./grub.conf
-rw-r--r--. 1 root root 11956 8月 26 2012 minix_stage1_5
-rw-r--r--. 1 root root 14412 8月 26 2012 reiserfs_stage1_5
-rw-r--r--. 1 root root 1341 11月 15 2010 splash.xpm.gz
-rw-r--r--. 1 root root 512 8月 26 2012 stage1
-rw-r--r--. 1 root root 125976 8月 26 2012 stage2
-rw-r--r--. 1 root root 12024 8月 26 2012 ufs2_stage1_5
-rw-r--r--. 1 root root 11364 8月 26 2012 vstafs_stage1_5
-rw-r--r--. 1 root root 13964 8月 26 2012 xfs_stage1_5
grub引导:
1、第一阶段:
stage1(系统引导第一阶段):磁盘的MBR的446字节内容,用于引导系统。
2、第二阶段:
stage1_5:stage1过渡到stage2所需要加载的内容。
[root@37-test ~]# ll /boot/grub/
总用量 280
-rw-r--r--. 1 root root 63 8月 26 2012 device.map
-rw-r--r--. 1 root root 13380 8月 26 2012 e2fs_stage1_5
-rw-r--r--. 1 root root 12620 8月 26 2012 fat_stage1_5
-rw-r--r--. 1 root root 11748 8月 26 2012 ffs_stage1_5
-rw------- 1 root root 1118 12月 5 16:01 grub.conf
-rw-r--r--. 1 root root 11756 8月 26 2012 iso9660_stage1_5
-rw-r--r--. 1 root root 13268 8月 26 2012 jfs_stage1_5
lrwxrwxrwx. 1 root root 11 8月 26 2012 menu.lst -> ./grub.conf
-rw-r--r--. 1 root root 11956 8月 26 2012 minix_stage1_5
-rw-r--r--. 1 root root 14412 8月 26 2012 reiserfs_stage1_5
-rw-r--r--. 1 root root 1341 11月 15 2010 splash.xpm.gz //启动时的背景图片
-rw-r--r--. 1 root root 512 8月 26 2012 stage1
-rw-r--r--. 1 root root 125976 8月 26 2012 stage2
-rw-r--r--. 1 root root 12024 8月 26 2012 ufs2_stage1_5
-rw-r--r--. 1 root root 11364 8月 26 2012 vstafs_stage1_5
-rw-r--r--. 1 root root 13964 8月 26 2012 xfs_stage1_5
3、第三阶段:
stage2:/boot/grub(/etc/grub.conf)。显示图形界面依赖于grub.conf配置文件。开机的启动菜单。
主要功能:
1选择启动的内核映像或操作系统
2 传递参数:
e:编辑模式
b:引导
3、基于密码保护:启动内核映像或者传递参数都可以设置密码保护。
Linux的引导分析(分区表与stage1):http://blog.csdn.net/sdcxyz/article/details/23601491
2、grub.conf配置文件讲解:
[root@37-test ~]# more /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #指定使用的title,0表示第一个(从0计数)
timeout=5 #设置超时时间,等待输入参数时间
splashimage=(hd0,0)/grub/splash.xpm.gz #背景照片名称及位置
hiddenmenu#隐藏菜单
password --md5 $1$N8Tao$FX6tTV1fVWauh/8sYtuSa0 #开机编辑grub时加密
title CentOS (2.6.32-642.11.1.el6.x86_64)
root (hd0,0) #指定根所在的磁盘分区,所以硬盘均已hd进行标识,hd0,0表示第一块磁盘的第一个分区。
kernel /vmlinuz-2.6.32-642.11.1.el6.x86_64 ro root=UUID=c0863086-d6e1-4670-b46
e-20aeaf76962e rd_NO_LUKS rd_NO_LVM LANG=zh_CN.UTF-8 rd_NO_MD quiet SYSFONT=lat0-sun16
rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM biosdevname=0
password -md5 $1$OVR18/$WJiEp4GZJT.tXybTyABRZ1 #开机引导系统加密
#ro 只读方式读取内核,root=表示根分区挂载路径
root=/path/somefile :真正的根文件系统设备文件路径
quiet:静默模式,不显示详细加载信息。
selinux=0:禁用内核中的selinux。
password —md5sfis$1$OVR18/$WJiEp4GZJT.tXybTyABRZ1 用来指定密码为md5加密的,放在title里面表示引导时需要输入密码,放在所有title外面,表示编辑需要输入密码。
initrd /initramfs-2.6.32-642.11.1.el6.x86_64.img
title CentOS (2.6.32-220.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=UUID=c0863086-d6e1-4670-b46e-20a
eaf76962e rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun
16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM biosdevname=0
initrd /initramfs-2.6.32-220.el6.x86_64.img#临时根文件系统,在启动时先加载她,等加载正是内核后这个虚拟根就不存在了。
md5加密方法:grub-md5-crypt
开源图片编辑软件:gimp,windows的xshell可以打开图形化的gimp软件。
grub如何识别分区:
所有种类的硬盘均以hd开头,不同的硬盘使用后面的第一个数字来表示,比如hd0、hd1,同一个硬盘的不同分区用第二个数字表示:hd0,0表示第一个硬盘的第一个分区。
自定义grub背景图片
要求:16色、xpm格式、640*480大小。
3、grub故障处理
问题1:grub文件丢失,损坏
1、重启进入编辑模式,按“c”键进入grub模式。
2、指定root分区:root (hd0,0)
可以通过cat (hd 然后按tab键的方式查找尝试,通过查看/etc/fstab可以确定根分区和boot引导分区是否在一起。cat (hd0,0)/etc/fstab
3、确定内核位置 kernel /vm TAB补全,ro root=/dev/hda0 或者 ro root=LABLE=/ 或者ro root=UUID=来确定。
4、确定initrd的位置 initrd /boot/ TAB补全。
5、boot引导。
问题2:
由于重新安装Windows或其它未知原因而导致GRUB的丢失;
您可以通过系统安装盘、livecd进入修复模式;
请参考:
《Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用》
首先:您根据前面所说grub-install来安装GRUB到/boot所在的分区;要仔细看文档,/boot是不是处于一个独立的分区是重要的,执行的命令也不同;
其次:要执行grub ,然后通过 root (hd[0-n],y)来指定/boot所位于的分区,然后接着执行 setup (hd0),这样就写入MBR了,比如下面的例子;
grub>root (hd0,6)
grub>setup (hd0)
grub>quit
重新引导就会再次出现MBR的菜单了或命令行的提示符了;
通常是给其他的损坏的硬盘进行安装,也就是说可以把不能启动的硬盘去下,挂到其他硬盘上引导安装grub。
方法二:
1、创建一个名为boot的目录,例如:/mnt/boot
2、确保目标磁盘的分区存在,并且已经格式化。
3、挂载目标硬盘上要安装的grub的分区至新建的boot目录 mount /dev/sdb1 /mnt/boot
4、grub-install --root-directory=/mnt /dev/sdb
作业:模拟挂载一块硬盘,安装grub。
[root@localhost ~]# fdisk /dev/sdb //对磁盘进行分区
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x6582832e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won‘t be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to
switch off the mode (command ‘c‘) and change display units to
sectors (command ‘u‘).
Command (m for help): p
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6582832e
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-783, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-783, default 783): 200M
Command (m for help): p
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6582832e
Device Boot Start End Blocks Id System
/dev/sdb1 1 200 1606468+ 83 Linux
Command (m for help): p
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6582832e
Device Boot Start End Blocks Id System
/dev/sdb1 1 200 1606468+ 83 Linux
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (201-783, default 201):
Using default value 201
Last cylinder, +cylinders or +size{K,M,G} (201-783, default 783): 1G
Value out of range.
Last cylinder, +cylinders or +size{K,M,G} (201-783, default 783): 400M
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# mke2fs /dev/sdb1 //格式化分区
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
100464 inodes, 401617 blocks
20080 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=415236096
13 block groups
32768 blocks per group, 32768 fragments per group
7728 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# mke2fs /dev/sdb2
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
100464 inodes, 401625 blocks
20081 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=415236096
13 block groups
32768 blocks per group, 32768 fragments per group
7728 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 6442 MB, 6442450944 bytes
255 heads, 63 sectors/track, 783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6582832e
Device Boot Start End Blocks Id System
/dev/sdb1 1 200 1606468+ 83 Linux
/dev/sdb2 201 400 1606500 83 Linux
[root@localhost ~]# mkdir /mnt/boot //创建挂载点
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/ //将分区挂载到挂载点
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb //安装grub,注意不要写错
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install‘.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
[root@localhost ~]# ll /mnt/boot/
总用量 24
drwxr-xr-x. 2 root root 4096 1月 12 10:21 grub
drwx------. 2 root root 16384 1月 12 10:18 lost+found
内核探测硬件的信息,被记录在日志文件/var/log/dmesg中。
通过dmesg可以查看。
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 2.6.32-573.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) ) #1 SMP Thu Jul 23 15:44:03 UTC 2015
Command line: ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
KERNEL supported cpus:
Intel GenuineIntel
AMD AuthenticAMD
Centaur CentaurHauls
grub命令详解:http://www.cnblogs.com/uptownBoy/articles/2041631.html
七、内核
linux内核是单内核设计,所有模块都存放在/lib/modules目录下,文件类型为ko。
如果内核需要加载的内容正是系统启动需要的,那么势必会造成两者的冲突,如何解决这个问题呢?
这就涉及到了两个方面,一方面可以在内核中集成需要的模块,而不是把它单独拿出来。另一方面需要内核在加载模块之前就可以启动,这就需要把他先加载到内存中ram disk(initrd)或者ram fs(initramfs)中,这个就类似一个临时的虚拟的根(/),这个虚拟根可以加载文件系统,这个很重要,然后再通过它切换的实际的根上。
引导内核的组成部分
/boot/vmlinuz-`uname -r` redhat5版本中的文件名称
/boot/initrd-`uname -r`.img redhat5版本中的文件名称
/boot/initramfs-`uname -r`.img redhat6版本中的文件名称
/
lib/modules/内核模块
/sbin/init内核组成部分,启动的第一个程序,所有程序的父进程
/bin/bashshell语言程序,人机交互语言
[root@37-test ~]# ll /boot/
总用量 45808
-rw-r--r-- 1 root root 108108 11月 19 03:30 config-2.6.32-642.11.1.el6.x86_64
drwxr-xr-x. 3 root root 1024 8月 26 2012 efi
drwxr-xr-x. 2 root root 1024 12月 8 09:52 grub
-rw------- 1 root root 20006313 12月 1 13:52 initramfs-2.6.32-642.11.1.el6.x86_64.img
drwx------. 2 root root 1024 8月 26 2012 lost+found
-rw-r--r-- 1 root root 215530 11月 19 03:30 symvers-2.6.32-642.11.1.el6.x86_64.gz
-rw-r--r-- 1 root root 2618532 11月 19 03:30 System.map-2.6.32-642.11.1.el6.x86_64
-rwxr-xr-x 1 root root 4269936 11月 19 03:30 vmlinuz-2.6.32-642.11.1.el6.x86_64
引导内核文件包含的内容:
一下就是linux6版本的引导内核经过解压后包含的内容,可以看出来里面就是一个精简的linux系统,包含常见的目录。
[root@37-test kernel]# mv initramfs-2.6.32-220.el6.x86_64.img initramfs-2.6.32-220.el6.x86_64.gz 将/boot目录下的引导内核复制到其他目录并重命名为*.gz。
[root@37-test kernel]# gunzip initramfs-2.6.32-220.el6.x86_64.gz 解压缩
[root@37-test kernel]# file initramfs-2.6.32-220.el6.x86_64 查看文件类型
initramfs-2.6.32-220.el6.x86_64: ASCII cpio archive (SVR4 with no CRC)
[root@37-test kernel]# cpio kernel<initramfs-2.6.32-220.el6.x86_64 再次解压缩
cpio: 你必须指定 -oipt 选项中的一个。
尝试 `cpio --help‘ 或者 `cpio --usage‘ 来寻找更多信息。
[root@37-test kernel]# cpio -id <initramfs-2.6.32-220.el6.x86_64
74369 块
[root@37-test kernel]# ls 解压缩后文件内容
bin initqueue mount sysroot
cmdline initqueue-finished pre-pivot tmp
dev initqueue-settled pre-trigger usr
dracut-004-256.el6 initqueue-timeout pre-udev var
emergency proc
etc lib sbin
init lib64 sys
[root@37-test kernel]#