Linux Sysadmin–part4

一、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)

A.POST加电自检

主板在接通电源后,系统首先由POST程序来对内部各个设备进行检查,自检中如发现有错误,将按两种情况处理:对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;对于非严重故障则给出提示或声音报警信号,等待用户处理。

B.BIOS Sequence启动引导阶段

自检通过之后,按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备。一般电脑是按”F2″或”Del”键等等进入BIOS,在里面我们可以调整硬盘的启动顺序。找到第一个有引导程序的设备后,BIOS会找到设备中的MBR,读取其中的Bootloader。

C.GRUP引导阶段

这时候就可以看到我们的Centos系统了,但是一般都不需要操作,会自动启动系统。其实我们也可以自己手动启动系统的。

1).手动在grub命令行接口启动系统:

grub> root (hd#,#)

grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

grub> initrd /initramfs-VERSION-RELEASE.img

grub> boot

2).grub的命令行接口:

e: 编辑模式,用于编辑菜单;

c: 命令模式,交互式接口;

help: 获取帮助列表

help KEYWORD: 详细帮助信息

find (hd#,#)/PATH/TO/SOMEFILE:

root (hd#,#) 设定grup的根设备

kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;

例如:init=/path/to/init, selinux=0

initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;

boot: 引导启动选定的内核;

3).配置文件:/boot/grub/grub.conf

配置项:

default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;

timeout=#:指定菜单项等待选项选择的时长;

splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;

hiddenmenu:隐藏菜单;

password [–md5] STRING: 菜单编辑认证;

title TITLE:定义菜单项“标题”, 可出现多次;用来引导多个内核或者操作系统

root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;

kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核

initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;

password [–md5] STRING: 启动选定的内核或操作系统时进行认证

D.kernel加载内核阶段内核会自身初始化

探测可识别到的所有硬件设备;加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init5.init初始化阶段内核加载完毕,会运行init程序,init进程起来后,系统启动的控制权移交给init进程/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:

1).执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;

2).确定启动后进入的运行级别;

3).执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。

4).有关key sequence的设置

5).有关UPS的脚本定义

6).启动虚拟终端/sbin/mingetty

7).在运行级别5上运行X配置文件:/etc/inittab每行定义一种action以及与之对应的processid:runlevels:action:processid:一个任务的标识符;runlevels:在哪些级别启动此任务;#,###,可以为空,表示所有级别;action:在什么条件下启动此任务;process:任务;(脚本或程序)action:wait:等待切换至此任务所在的级别时执行一次;respawn:一旦此任务终止,就自动重新启动之;initdefault:设定默认运行级别;此时,process省略;sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态;查看:chkconfig –list [name]添加:chkconfig –add name删除:chkconfig –del name修改指定的链接类型:chkconfig [–level LEVELS] name–level LEVELS:指定要控制的级别;默认为2345;

init命令:

级别切换:init #

级别查看:who -r

注:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

二、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;

(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

(4) 为grub提供配置文件;

(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

~]# cat /proc/partitions

major minor #blocks name

8 16 83886080 sdb

8 17 10485760 sdb1

8 18 1 sdb2

8 21 5242880 sdb5

8 22 5242880 sdb6

8 23 5242880 sdb7

8 24 5242880 sdb8

8 25 5242880 sdb9

8 0 125829120 sda

8 1 1048576 sda1

8 2 124779520 sda2

8 32 5242880 sdc

8 33 2097152 sdc1

8 34 2097152 sdc2

8 48 5242880 sdd

8 49 5241856 sdd1

8 64 5242880 sde

8 65 5241856 sde1

11 0 8086528 sr0

253 0 52428800 dm-0

253 1 2097152 dm-1

253 2 70246400 dm-2

[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc1

[root@ronny1 ~]# mke2fs -t ext4 /dev/sdc2

###准备boot目录###

[root@ronny1 ~]# mkdir /mydata/boot

[root@ronny1 ~]# mount /dev/sdc1 /mydata/boot

[root@ronny1 ~]# ls /mydata/boot

lost+found

###安装grub###

[root@ronny1 ~]# grub-install –root-directory=/mnt /dev/sdc

Probing devices to guess BIOS drives. This may take a long time.

Installation finished. No error reported.

[root@ronny1 ~]# ls /mydata/boot

grub lost+found

###复制内核文件和initramfs###

[root@ronny1 ~]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mydata/boot/vmlinuz

[root@ronny1 ~]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mydata/boot/initramfs.img

###添加grub配置文件###

[root@ronny1 ~]# vim /mydata/boot/grub/grub.conf

default=0

timeout=5

title CentOS-HAN

root(hd0,0)

kernel /vmlinuz ro root=/dev/sdc2

initrd /initramfs.img

###此处: root配置rootfs根分区###

###准备根目录结构和程序###

[root@ronny1 ~]# mkdir /mydata/sysroot

[root@ronny1 ~]# mount /dev/sdc2 /mydata/sysroot

[root@ronny1~]# cd /mydata/sysroot

[root@ronny1 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media

mkdir: created directory `etc’

mkdir: created directory `bin’

mkdir: created directory `sbin’

mkdir: created directory `lib’

mkdir: created directory `lib64′

mkdir: created directory `dev’

mkdir: created directory `proc’

mkdir: created directory `sys’

mkdir: created directory `tmp’

mkdir: created directory `var’

mkdir: created directory `usr’

mkdir: created directory `home’

mkdir: created directory `root’

mkdir: created directory `mnt’

mkdir: created directory `media’

[root@ronny1 sysroot]# cp /bin/bash /mydata/sysroot/bin/

[root@ronny1 sysroot]# ldd /bin/bash

linux-vdso.so.1 => (0x00007ffdb9371000)

libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003787200000)

libdl.so.2 => /lib64/libdl.so.2 (0x000000377f600000)

libc.so.6 => /lib64/libc.so.6 (0x000000377fa00000)

/lib64/ld-linux-x86-64.so.2 (0x000000377f200000)

[root@ronny1 sysroot]# cp /lib64/libtinfo.so.5 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libdl.so.2 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libc.so.6 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /bin/ls /mydata/sysroot/bin/

[root@ronny1 ~]# ls /mydata/sysroot/bin

bash ls

[root@ronny1 sysroot]# cp /lib64/libselinux.so.1 /mydata/sysroot/lib64/ [root@ronny1 sysroot]# cp /lib64/libacl.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libattr.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libpcre.so.1 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# cp /lib64/libpthread.so.0 /mydata/sysroot/lib64/

[root@ronny1 sysroot]# ls /mydata/sysroot/lib64

ld-linux-x86-64.so.2 libc.so.6 libpthread.so.0

libacl.so.1 libdl.so.2 libselinux.so.1

libattr.so.1 libpcre.so.1 libtinfo.so.5

###测试命令###

[root@ronny1 sysroot]# chroot /mydata/sysroot

bash-4.1# ls

bin etc lib lost+found mnt root sys usr

dev home lib64 media proc sbin tmp var

bash-4.1# exit

exit

[root@ronny1 sysroot]# sync

[root@ronny1 sysroot]# sync

[root@ronny1 sysroot]# sync

###修改init程序,指定init程序(bash)###

default=0

timeout=5

title CentOS-HAN

root(hd0,0)

kernel /vmlinuz ro root=/dev/sdc2 selinux=0 init=/bin/bash

initrd /initramfs.img

[root@ronny1 sysroot]# sync

三、制作一个kickstart文件以及一个引导镜像。描述其过程

1. 准备系统iso镜像目录(centos7.2)

[root@ronny1 ~]# mkdir /mnt/cdrom

[root@ronny1 ~]# mount /dev/sr0 /mnt/cdrom

mount: /dev/sr0 is write-protected, mounting read-only

[root@ronny1 ~]# mkdir /mnt/iso

[root@ronny1 ~]# cd /mnt/cdrom

[root@ronny1 cdrom]# cp -frav * /mnt/iso

[root@ronny1 cdrom]# cp .discinfo /mnt/iso

2. 定制kickstart

[root@ronny1 ~]# yum -y install system-config-kickstart

[root@ronny1 ~]# system-config-kickstart

[root@ronny1 ~]# ksvalidator ks.cfg

3. 整合镜像文件和ks文件,并修改相关配置

[root@ronny1 ~]# cd /mnt/iso

[root@ronny1 iso]# vim isolinux/isolinux.cfg

定制启动标签 ,指定ks位置

label custom

menu label ^Install CentOS 7

menu default

kernel vmlinuz

append initrd=initrd.img inst.ks=cdrom:/isolinux/ks.cfg inst.stage2=hd:LABEL=CENTOS7 quiet

其中,需要把其它启动项中的menu default去掉,加在上面的自定义启动项中,这样当你从光盘启动时,才会默认选择该项,并且有倒计时,由于默认的光盘倒计时时间太久了,为600秒,我们把timeout 600改成timeout 100,这样默认就是10秒倒计时了。

拷贝ks文件到光盘根目录

[root@ronny1 iso]# cp /root/ks.cfg isolinux/

[root@ronny1 iso]# ls isolinux/

boot.cat grub.conf isolinux.bin ks.cfg splash.png upgrade.img vmlinuz

boot.msg initrd.img isolinux.cfg memtest TRANS.TBL vesamenu.c32

4. 重新打包ISO

[root@ronny1 iso]mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V “CentOS 7 x86_64 boot” -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso iso/

5. 加载新生成的镜像,并启动

使用Xshell 将生成的boot.iso copy到windows系统下,就可以用虚拟机引导启动了。

四、写一个脚本

(1) 能接受四个参数:start, stop, restart, status start: 输出“starting 脚本名 finished.” …

(2) 其它任意参数,均报错退出;

#!/bin/bash

#description:

case $1 in

start)

echo “staring $0 finished”

;;

stop)

echo “stop $0 finished”

;;

restart)

echo “restart $0 finished”

;;

status)

echo “status $0 finished”

;;

*)

echo “error”

exit 1

;;

esac

五、写一个脚本,判断给定的用户是否登录了当前系统;

(1) 如果登录了,则显示用户登录,脚本终止;

(2) 每3秒钟,查看一次用户是否登录;

#!/bin/bash

#description:

while true; do

if who |grep $1 &> /dev/null;then

echo “$1 is login”

exit 0

fi

sleep 3

done

6、写一个脚本,显示用户选定要查看的信息;

cpu) display cpu info

mem) display memory info

disk) display disk info

quit) quit

非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;

#!/bin/bash

#description:display cpu,memory,disk info

cat << EOF

cpu)display cpu info

mem)display memory info

disk)display disk info

quit)quit

EOF

read -p “please input your choice ” choice

while true;do

case $choice in

cpu)

lscpu

exit 0

;;

mem)

free -m

exit 0

;;

disk)

fdisk -l

exit 0

;;

quit)

echo “quit”

exit 0

;;

*)

echo “Error please input cpu,mem,disk,quit”

read -p “please input your choice ” choice

;;

esac

done

7、写一个脚本

(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;

(2) 提示用户输入一个用户名或输入“quit”退出;

当输入的是用户名,则调用函数显示用户信息;

当用户输入quit,则退出脚本;

进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:

userinfo() {

if id “$username” &> /dev/null; then

grep “^$username\>” /etc/passwd | cut -d: -f3,7

else

echo “No such user.”

fi

}

read -p “please input one username or quit: ” username

while true;do

if [ $username == “quit” ];then

exit

else

userinfo

read -p “please input one username or quit: ” username

fi

done

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:/87723

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐注册  万达娱乐主管  万达娱乐注册  万达登录  万达娱乐平台  万达主管QQ  guoqibee.com  万达招商QQ  万达招商