专栏首页北京马哥教育系统启动及内核管理

系统启动及内核管理

一、知识整理

1、nohup 命令:

不挂断地运行命令,远程连接当断网或断开shell时还可以继续运行。无论是否将nohup命令的输出重定向到终端,输出都将附加到当前目录下的nohup.out文件中,如果当前不可写,则重定向到家目录nohup.out文件,除非定义了输出文件。

nohup COMMAND 输出重定向至文件

nohup COMMAND & 使用jobs查看任务,按后台任务关闭方式关闭。

2、设置和调节nice值:

[root@localhost ~]# nice -n -5 ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.039ms

64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058ms

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

6533 root15 -5 114380692 560 S 0.0 0.10:00.01 ping [root@localhost ~]# nice -5 ping 127.0.0.1

设置nice为5.

renice:调整nice值,普通用户只能调大自己进程的nice值,即降低程序优先级;

[root@localhost ~]# renice +5 -p 6578

6578 (process ID) old priority 5, new priority 5

[root@localhost ~]# renice 7 -p 6578

6578 (process ID) old priority 5, new priority 7

[root@localhost ~]# renice -2 -p 6578

6578 (process ID) old priority 7, new priority -2

3、rc#.d登录等级:

K和S开头的服务,数字越小,越先运行。

ramdisk虚拟内存盘技术:使用缓冲和缓存来加速对磁盘上的文件访问:centos6中为initramfs功能,文件为/boot/initramfs,若损坏可使用mkinitrd可以生成,命令如下:

[root@centos68 boot]# mkinitrd initramfs-`uname -r`.img `uname -r`

4、查看运行级别:

[root@centos68 boot]# who -r

运行级别 3 2016-09-08 04:51

[root@centos68 boot]# runlevel

N 3

runlevel显示上次启动级别和本次启动级别

5、、查看/boot/initramfs.***.img文件,

[root@centos68 ~]# file initramfs-2.6.32-642.el6.x86_64.img

initramfs-2.6.32-642.el6.x86_64.img: gzip compressed data, from Unix, last modified: Sat Sep 10 01:02:33

2016, max compression

[root@centos68 ~]# mv initramfs-2.6.32-642.el6.x86_64.img initramfs-2.6.32-642.el6.x86_64.img.gz

[root@centos68 ~]# gunzip initramfs-2.6.32-642.el6.x86_64.img.gz

[root@centos68 ~]# file initramfs-2.6.32-642.el6.x86_64.img

initramfs-2.6.32-642.el6.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

[root@centos68 ~]# cpio -vt < initramfs-2.6.32-642.el6.x86_64.img

-rwxr-xr-x 1 root root 587041 Sep 10 01:02 lib64/libm-2.12.so

-rwxr-xr-x 1 root root 1491968 Sep 10 01:02 lib64/liblvm2cmd.so.2.02

-rwxr-xr-x 1 root root 12688 Dec 8 2011 lib64/libfipscheck.so.1.1.0

lrwxrwxrwx 1 root root 15 Sep 10 01:02 lib64/libacl.so.1 -> libacl.so.1.1.0

lrwxrwxrwx 1 root root 17 Sep 10 01:02 lib64/libaudit.so.1 -> libaudit.so.1.0.0

-rwxr-xr-x 1 root root 272008 Sep 10 01:02 lib64/libreadline.so.6.0

140255 块

可以查看文件中的内容,此文件给内核驱动磁盘提供了必要文件。

6、centos5在文件/etc/inittab中

定义了ctrl alt delete重启,在虚拟机中用insert代替delete。在centos6中是/etc/init/control-alt-delete.conf文件。在centos5中inittab定义的信息在centos6中分散放置,详情可以由inittab查看。终端mingetty定义respawn,不能被杀死,centos6中定义在/etc/init/serial.conf中,可以更改F10为第六个终端等,按照格式写即可。

二、命令详解和事例

1、系统启动流程:

第一步:加电自检,加载BIOS

加电自检POST(power-on-self-test),是BIOS(basic input and output system)功能的一个部分,负责完成对CPU、主板、内存、硬盘等硬件情况监测。BIOS是集成在主板上的一个ROM芯片中,其中保存着计算机最重要的基本输入/输出程序、系统信息设置和自检程序等;而用户设定保存的各种参数信息是保存在RAM芯片中的,由UPS持续供电,这个设置叫CMOS。

第二步:读取MBR

磁盘第0磁道第一个扇区被称为MBR(master boot record),即主要引导记录,大小512字节,存放了预启动信息、分区表信息。而前446个字节就是boot loader,系统找到MBR后,就会将其复制到物理内存中。

第三步:Boot Loader

boot loader就是在操作系统内核运行前运行的一段小程序,通过将这段小程序放入物理内存,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便最终调用操作系统内核,而boot loader驱动的便是boot目录,内有内核和假文件系统initramfs的映像。

关于legacy grub典型grub的stage1、stage1.5和stage2:stage1就是MBR,有第一个扇区512字节的内容,作用就是bootloader的作用;stage1.5是后面27个扇区的内容,用于识别boot分区,以进行stage2,stage2用于打印选择内核界面、加密、运行grub.conf文件等,选择界面出现说明stage2已经完成。

第四步:加载内核

根据grub设定的内核映像所在路径,读取内核映像并解压缩,以加载内核。此时的问题就是,真正的根分区并不在boot目录下,系统启动需要的一些lib文件也并不在boot目录下,内核要启动根分区就得加载根分区的驱动,由于内核大小和开机速度限制,以及不同的主机不同的根文件系统的限制,boot并没有那么多驱动。此时就要借助一个假文件系统initramfs作为中介,此文件是安装系统的时候就生成的,按照主机的硬件情况存入必要的驱动,给内核驱动真正的根系统提供/proc /sys /dev等文件,因此内核便可以启动真正的rootfs来替换掉假文件系统,也就可以进行后续步骤。

步骤五:系统的第一个进程init

内核和分区被加载完成后,第一个运行的进程是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。inittab文件的作用是设定运行等级。init程序的类型:Upstart:init,centOS6;配置文件:/etc/fstab,/etc/init/*.conf。

步骤六:系统初始化

init执行/etc/rc.d/rc.sysinit系统初始化脚本:设置主机名,设置欢迎界面,激活udev和selinux,挂载fstab文件中定义的文件系统,检测根文件系统并以读写方式重新挂载根文件系统,设置系统时钟,激活swap,根据/etc/sysctl.conf文件设置内核参数,激活lvm及raid设备,加载额外设备的驱动程序等。

步骤七:启动内核模块

依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

步骤八:执行不同级别的脚本程序:

根据运行等级不同,运行rc0.d到rc6.d中的相应脚本程序,来完成相应的初始化工作和启动相应的服务。

步骤九:执行rc.local

rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方,是开机启动的最后一个文件,可以把想设置和启动的东西放在这里。正常级别下,最后启动的服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本。

步骤十:登录

mingetty tty-6-login。执行/bin/login,启动登录程序,输入账号密码登录系统。

2、chkconfig命令,图形化命令:

ntsysv

查看服务在所有级别的启动或关闭设定情形:chkconfig [–list] [name]

添加服务:chkconfig –add name

删除服务:chkconfig –del name

修改指定的连接类型 chkconfig [–level levels] name <on|off|reset>级别省略表示2345

3、grub命令行接口:

在grub.conf文件被破坏或有错误时,开机会进入grub命令行,也可以在选择内核时按c进入,也可以在命令行输入grub命令进入;grub命令行用于更改内核特性,开机参数,也可以指定内核和虚根文件等,输入help查看可以使用的命令。如果.conf文件损坏,可以添加如下两行,支持tab键补全:

kernel (hd0,0)/vmlinuz.2.6.13…. root=/dev/sda2 max_loop=100 selinux=0 init=/bin/bash rhgb quiet

initrd (hd0,0)/initramfs…..img

或者将(hd0,0)取出,单独成行:

root (hd0,0)

kernel /vmlinuz.2.6.13…. root=/dev/sda2 max_loop=100 selinux=0 init=/bin/bash rhgb quiet

initrd /initramfs…..img

最后boot重新开机。参数中rhgb不显示最后的加载图像,只显示启动情况;quiet隐藏内核加载信息,及初始化信息,只显示之后的开启服务信息。kernel和initrd前直接是根目录的原因:(hd0,0)指第一块磁盘的第一个分区,当刚开机的时候,只有boot,因此默认把boot当做根,当通过虚根识别了真正的rootfs后,才挂载为boot。

4、grub.conf配置文件:

default=#设定默认启动的菜单项;从0开始;

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

splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜单背景图文件路径

hiddenmenu隐藏选择菜单,不点击按键5秒后便跳过

password [–md5] STRING:启动菜单编辑认证,p键输入密码才可以进入编辑内核,即a、c、e三个模式,不影响开机。

title TITLE定义菜单标题

root (hd#,#) 给定stage2和内核的位置

kernel 启动的内核

initrd 虚根文件

password [–md5] STRING 选择内核后,需要输入密码。

5、安装或者修复grub:

第一种方法:在命令行或修复模式grub-install –root-directory=/PATH /dev/sd?;第二种方法:使用grub命令,依次输入root(hd#,#)和setup(hd#)。

[root@centos68 ~]# grub-install --root-directory=/ /dev/sda

Installation finished. No error reported.

This is the contents of the device map //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

[root@centos68 ~]# grub

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

GNU GRUB version 0.97 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB

lists possible command completions. Anywhere else TAB lists the possible

completions of a device/filename.]

grub> root (hd0,0)

root (hd0,0)

Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)

setup (hd0)

Checking if "/boot/grub/stage1" exists... no

Checking if "/grub/stage1" exists... yes

Checking if "/grub/stage2" exists... yes

Checking if "/grub/e2fs_stage1_5" exists... yes

Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded.

succeeded

Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded

Done.

三、课后练习

1、添加一个系统服务,

设置启动级别和开机启动:

写一个脚本,添加如下行:

#! /bin/bash

# chkconfig: 2345 10 90

# description: A

其中chkconfig一行定义了启动级别和启动顺序和关闭顺序,此优先级是按照字符顺序,跟数组大小无关;

放入/etc/init.d/目录下,使用chkconfig –add *.sh添加服务

使用chkconfig –list 查看服务启动级别

使用chkconfig –level # *.sh更改启动级别

ntsysv图形化界面,更改当前级别是否启动,–level=#更改指定级别;

使用service *.sh restart|stop|status|restart管理服务。

2、自制Linux系统:

步骤一:添加一块单独的硬盘,此硬盘是单个文件,以便于单独使用运行:

步骤二:分区,挂载;

将此磁盘为两分区,一个作为boot使用,一个作为根目录使用;然后挂载:

注意:boot的挂载点名称一定要使用boot,因为grub生成时,已经决定名称不能变化了。

步骤三:恢复内核,生成grub,注意文件参数的顺序:

[root@centos68 mnt]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 ./boot/

[root@centos68 mnt]# cp /boot/initramfs-2.6.32-642.el6.x86_64.img ./boot/

[root@centos68 mnt]# grub-install --root-directory=/mnt/ /dev/sdb

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@centos68 mnt]# vim boot/grub/grub.conf

[root@centos68 mnt]# cat boot/grub/grub.conf

default=0

timeout=5

title zizhicentos

kernel (hd0,0)/vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash

initrd (hd0,0)/initramfs-2.6.32-642.el6.x86_64.img

步骤四:创建必要配置文件和目录:

[root@centos68 sysroot]# ls

bin boot dev etc home lib lib64 media mnt proc root sbin sys usr var

[root@centos68 mnt]# vim sysroot/etc/fstab

[root@centos68 mnt]# cat sysroot/etc/fstab

/dev/sda2 / ext4 defaults 1 1

/dev/sda1 /boot ext4 defaults 1 2

步骤五:使用脚本复制命令及其相关的库文件并检测:

脚本内容如下

[root@centos68 mnt]# cat ~/copycmd0.sh

#!/bin/bash

ch_root="/mnt/sysroot"

[ ! -d $ch_root ] && mkdir $ch_root

bincopy() {

if which $1 &>/dev/null; then

local cmd_path=`which --skip-alias $1`

local bin_dir=`dirname $cmd_path`

[ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}

[ -f ${ch_root}${cmd_path} ] || cp -f $cmd_path ${ch_root}${bin_dir}

return 0

else

echo "Command not found."

return 1

fi

}

libcopy() {

local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')

for loop in $lib_list;do

local lib_dir=`dirname $loop`

[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}

[ -f ${ch_root}${loop} ] || cp -f $loop ${ch_root}${lib_dir}

done

}

read -p "Please input a command or quit: " command

while [ "$command" != "quit" ];do

if bincopy $command ;then

libcopy $command

fi

read -p "Please input a command or quit: " command

done

[root@centos68 ~]# ./copycmd0.sh

Please input a command or quit: /bin/bash

Please input a command or quit: /bin/ls

Please input a command or quit: /bin/hostname

Please input a command or quit: /bin/mount

Please input a command or quit: quit

[root@centos68 sysroot]# cd lib64/

[root@centos68 lib64]# ls

ld-linux-x86-64.so.2 libblkid.so.1 libdl.so.2 libselinux.so.1 libuuid.so.1

libacl.so.1 libcap.so.2 libpthread.so.0 libsepol.so.1

libattr.so.1 libc.so.6 librt.so.1 libtinfo.so.5

[root@centos68 mnt]# chroot sysroot/

bash-4.1# ls

bin boot dev etc home lib lib64 media mnt proc root sbin sys usr var

步骤六:将做好的磁盘单独作为一个系统运行并调试:

[root@centos68 mnt]# sync

[root@centos68 mnt]# sync

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux),作者:马哥教育

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux运维人员共用root帐户权限审计

    一、应用场景 在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。 这里...

    小小科
  • Python入门学习篇(10)-循环语句

    当我们需要执行一个语句或者语句组多次,不可能将同样的语句写多遍,一是比较繁琐, 二是不利于维护,这时候循环语句就应运而生。下面是在大多数编程语言中的循环语句的一...

    小小科
  • 文件管理类命令常用使用方法及其相关示例演示

    cat 使用语法:cat [-AbeEnstTuv][--help][--version] FILENAME 命令功能:查看文件内容或将多文件连接后传输到基本输...

    小小科
  • Centos 6.9下部署Oracle 11G数据库环境的操作记录

    操作系统:Centos6.9(64Bit) Oracle:11g 、11.2.0.4.0版本 Ip地址:172.16.220.139 废话不多说了,下面记录安装...

    洗尽了浮华
  • Centos6.X 下安装并使用VNC的操作记录

    VNC是一个的"远程桌面"工具。,通常用于“图形界面”的方式登录服务器,可视化操作。废话不多说了,操作记录如下: 1)安装桌面环境 [root@vm01 ~]#...

    洗尽了浮华
  • Linux基础之网络 原

    eth(Ethernet的缩写)新安装的虚拟机为eth0,为什么原来的eth0会变成eth1?

    云飞扬
  • ubantu下su命令Authentication failure失败的解决方式

    Tencent JCoder
  • 2017年,机器之心贡献过的开源项目

    机器之心
  • TLS与SSL的介绍及区别

    最近,Google要求Android下一个版本Android P 的应用程序,将默认使用加密连接,这意味着运行 Android P 系统的安卓设备无论是接收或者...

    安智客
  • 使用Certify来自动申请并配置Let’s Encrypt免费SSL证书到IIS8

    越来越多的网站在启用HTTPS,也就是SSL加密通讯连接访问。特别是去年开始BAT在国内的推广和应用要求。要知道部署发布一个苹果iOS企业应用,下载服务器就必须...

    崔文远TroyCui

扫码关注云+社区

领取腾讯云代金券