欢迎各位兄弟 发布技术文章
这里的技术是共享的
日志系统
linux系统启动流程
PC: OS (Linux)
POST (POWER ON SELF TEST)-->BIOS(Boot Sequence 引导序列)(根据次序找各个盘上的MBR)-->MBR(现在已形成虚设了,大于2T时,MBR能力有限,现在大于2T时,通常使用GBT格式)(bootloader,446字节)(根据MBR当中的分区表,查找活动分区,找到操作系统所在的那个分区,并加载那个分区上的操作系统内核)-->Kernel(有可能两个操作系统,需要用户选择)(探测硬件,cpu,内存,及其它硬件及驱动(就是装载驱动))(初始化完成之后,就要挂载根文件系统了 root=什么,告诉kernel根在哪个设备上)-->init()(/sbin/init)(所有用户空间的进程都由init来管理(所有用户空间的初始化都由init来完成),除非和硬件打交道,才由用户空间切换到内核空间)
POST->BIOS(Boot Sequence)-->MBR(bootloader,446)->Kernel->initrd(一般需要这个临时根)->(Rootfs) /sbin/init(一般情况下,是需要使用临时根,才能初始化的,记住一般情况下)
红帽中 MBR(grub stage1)-->grub stage2
Kernel initrd 这两个文件一定是位于同一个分区上的,同一块磁盘上的,这两个是由bootloader 一块装载的,
initrd装载进内存后,被kernel所使用
当找到第一块盘上有MBR(但是MBR损坏了,它也不会找第二块盘上的MBR)
bootloader,446字节,太小,可能是压缩过的,可能需要解压缩,,,,bootloader获得控制权后,BIOS就退出了
内核一般情况下也是压缩存放的,把内核装载进内存,在内存中完成解压缩,而后将控制权转交给内核,此时bootloader又退出了
硬件驱动那么多,不可能全部载入内存的,因为全部载入内存的话,消耗太多内存
内核设计风格:
单内核:把硬盘驱动,内存管理,进程管理,做在一个进程里面,任何一个子系统坏了,殃及池鱼,因为大家是一体的
它的工作模式简单 现在优化了,它有微内核的优势 linux现在是属于单内核的(对线程支持不太好,LWP:light weight Process 轻量级进程) (几千万行,解压后几百M)
(为支持更多的平台,内置20种架构的支持,ARM(安卓),(cpu架构ARM,省电,性能也不错),x_86,power pc 平台(苹果机),mips (嵌入式架构)) (真正的 我们中需要一种)(几块不同的硬盘就只需要几种)(因此源程序可能很大,但是做出来的内核只有十几M,(压缩,可能只有一两M的大小))
RedHat,(SUSE, Debian)等 模块化设计
核心很少,上面布满了孔洞,需要是加载,动态加载,(模块编译好了,用到这个模块,只要把这个模块放到外围的位置,让核心去自动装载这个模块)
核心,外围内核模块(ko)(kernel object) 内核专用模块,不能被进程使用的
初始化的时候,只是初始化内核 kernel 核心本身
内核模块: 一般在 /lib/modules/"内核版本号命名的目录"/ (模块可能有依赖关系)(内核有一个依赖关系文件,去自动识别这些依赖关系的)
[root@localhost proc]# cat version
Linux version 2.6.18-398.el5 (mockbuild@x86-027.build.eng.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-55)) #1 SMP Tue Aug 12 06:26:17 EDT 2014
wmlinuz-2.6.32
/lib/modules/2.6.32/ (能够做成模块的不仅是驱动程序,还有许额外的功能,比如文件系统 加密功能 进程管理(一般不会做成模块,有些进程管理的扩展功能可能都会做成模块))
微内核:内核很小,硬盘驱动,内存管理,进程管理做成子系统,需要用到时内核负责调度,装载这个子系统,某个子系统坏了,不会影响其它 协调是很复杂的 windows,Solaris (支持真正意义上的线程)
so 共享对象
chroot: chroot /PATH/TO/TEMPROOT [COMMAND...] (虚根,假根,临时根) (默认是bash,可以指定为ksh)
chroot /test/virroot /bin/bash (或者 /bin/ksh)
ldd: ldd /PATH/TO/BINARY_FILE:显示二进制文件所依赖的共享库 (ldd - print shared library dependencies)
windows很多进程在后台运行起来了,叫后台进程(服务进程)
windows 安全模式,启动的进程数(服务数)不一样,有些驱动程序是不会装载的,只装载最基本的硬件驱动程序,
安全模式是为了修复用的,比如驱动不兼容,在安全模式下卸载这个驱动,它是一种维护模式
windows带网络连接的安全模式
windows VGA模式 更新了显卡驱动后,(设置了分辨率太高,显卡支持不了)一启动,黑屏,它是一种维护模式
VGA下,不装载显卡驱动,只用最基本的驱动来驱动显卡,此时可以调回来分辨率,它是一种维护模式
linux 是多用户多任务的
linux中不叫维护模式,叫运行级别
启动的服务不同
运行级别: 0-6 7个级别 在不同的级别下,启动的服务不一样而已(不一定完全精确)
0: halt 关机
1:single user mode 单用户模式,相当于windows的安全模式,维护模式 直接以管理员身份切入(密码都不需要)
管理员密码忘了,通过这个模式可以进去改改
2:multi user mode 多用户模式,而且有网络功能,不启用NFS (no NFS)(network file system)
挂载了网络文件系统,它不会给你自动挂载的
当nfs出故障的时候,开机挂载nft系统时,nfs文件系统死活挂不上(系统down在那里)
出了这个问题,可以进入2级别
3:multi user mode 正常的多用户模式,text mode(文本模式) (只有命令行,不启动图形界面)
我们平时的时候,就是3级别 默认级别
4:reserved 保留模式,保留级别,尚未使用的模式,没有定义
5:multi user mode 多用户模式,graphic mode (图形终端模式)
6: reboot 重启
服务都是用户空间的程序,由用户空间的 /sbin/init 这个进程来控制
到底执行哪些服务,运行哪些级别,取决于/etc/inittab 这个配置文件
详解启动过程
bootloader (MBR) (不同的操作系统,bootloader不一样,它通常是由操作系统的安装程序提供的)
MBR是不属于任何一个操作系统的,它属于全硬盘级别的 (硬盘上如果装上多个操作系统,C盘上装了windows,其它盘上装了linux. 如果有个MBR两种都可以引导,可以让用户选择,就好了,,,,微软只引导自己的,不引导别人的,所以先装linux,后装windows,它就会把linux覆盖掉了,linux就无法启动了,更恶毒的是,如果装了win8,微软就会锁定MBR,装了win8后,MBR里面的程序是替换不了的,装了win8后,想并存linux是不可能实现的了,微软美其名曰,是为了避免病毒入侵MBR)(如果想并存,就是把MBR清掉,这样子的话,windows就无法引导了)(windows既不给别人引导它,也不引导别人)
linux的bootloader是非常开放的
linux的bootloader常用的方法有三种
LILO: LInux LOader (早期引导linux的bootloader)(不能引导1024柱面以后分区上的内核,即不支持大硬盘吧,超过8G的分区里装内核的话,它引导不了)(但是在嵌入式中好用,因为嵌入式小,是个卡)
GRUB: GRand Unified Bootloader GRand 宏大的,宏伟的 Unified 统一的
(redhat5 redhat6是不一样的) GRUB是一个程序,它是需要装在MBR中的bootloader位置来引导操作系统的
MBR只有446个字节,太小了,没法展现丰富的特性
Stage1: 装在了MBR,主要目的,是为了引导第二阶段,不是引导操作系统的 Stage1 阶段一
Stage1_5: (因为Stage1 不识别Stage2的文件系统,所以要用到Stage1_5阶段 )用来识别常用的不同类型的文件系统 Stage1 1.5阶段
Stage2: /boot/grub (位于跟内核所在的同一个分区的目录里面) 真正引导操作系统的
/boot/grub/grub.conf 顶格写的是grub的全局属性定义
title用来指定一个操作系统或一个内核 用来定义当前系统的不同版本的内核或当前硬盘上(当前系统上,当前主机上)不同的操作系统的
(同一个操作系统可以提供多个不同版本的内核)
default=0 #(设定默认启动的的title编号 默认启动哪个内核的,从上往下,第0个,第1个)
timeout=5 #等待用户选择的超时时长,单位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz #指定grub的背景图片
hiddenmenu #隐藏菜单 刚启动的时间,不会让你选择,只有敲任意键(应该是回车键吧)的时候,菜单才显示出来进行选择上面的操作系统,把这项去了,就不隐藏了 (hiddenmenu:表示隐藏选择kernel或操作系统菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。)
title Red Hat Enterprise Linux Server (2.6.18-398.el5) #引导的内核标题或操作系统名称(字符串,可自由修改)
root (hd0,0) #内核文件所在的设备在哪里(对于grub而言,所有硬盘不论什么接口的硬盘,都是hd;;对于光盘就是cdrom;;)(不能改)(格式 hd#,# 第一个#表示第几个磁盘设备,第二个#表示对应磁盘上面的分区)
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00 #kernel文件(内核文件)路径及传递给内核的参数 (不能改)
initrd /initrd-2.6.18-398.el5.img #临时根小根(小文件系统)ramdisk(ramfs)文件路径(它是安装操作系统后,最后一步生成的,既然是生成的,是动态选择的,它不会大,3,4M应该差不多了,当然它是压缩存放的)(不能改)
应该是在/boot目录下,为什么显示根/目录下
因为 grup的时候,根文件系统尚未加载,grub不能直接访问 /boot分区上的文件
把/boot分区当成根了
它是grub去访问的文件路径,而不是通过文件系统去访问的文件路径
/initrd-2.6.18-398.el5.img 版本号一定要跟vmlinuz-2.6.18-398.el5版本号保持一致,只不过后面加了.img,说明这是一个ramdisk文件(它是一个镜像文件,它可以展开之后,当作一个磁盘来用的,就像dd命令创建一个虚拟的swap设备一样,这种都称之为镜像设备,或者是本地回环设备)
内核功能
文件系统
进程管理
内存管理
网络管理
安全功能
驱动程序
/ rootfs 根文件系统
[root@localhost proc]# which init
/sbin/init
[root@localhost proc]#
[root@localhost proc]# cd /lib/modules/
[root@localhost modules]# ls
2.6.18-398.el5
[root@localhost modules]#
[root@localhost modules]# cd 2.6.18-398.el5/
[root@localhost 2.6.18-398.el5]# ls (map表示映射表,符号链接表)
(dep依赖关系对应的文件,依赖关系会自动生成,都位于这个位置)
build modules.alias modules.inputmap modules.seriomap updates
extra modules.ccwmap modules.isapnpmap modules.symbols weak-updates
kernel modules.dep modules.ofmap modules.usbmap
misc modules.ieee1394map modules.pcimap source
[root@localhost 2.6.18-398.el5]#
[root@localhost 2.6.18-398.el5]# cd kernel
[root@localhost kernel]# ls
arch crypto drivers fs lib net sound
arch 跟平台相关,驱动cpu的
crypto 加密解密相关的模块
drivers 驱动模块
fs 文件系统模块
kernel 内核自身的额外的其它功能
lib 库模块
mm (memory management)内存管理
net 网络相关的模块 不是网络驱动,是TCP/IP协议站
sound 声卡
[root@localhost kernel]# pwd
/lib/modules/2.6.18-398.el5/kernel
[root@localhost kernel]#
[root@localhost kernel]# ls drivers/
acpi cdrom dma_v3 hwmon isdn misc pci uio
ata char edac i2c leds mmc pcmcia usb
atm cpufreq firewire ide md mtd rtc video
block dca firmware infiniband media net scsi virtio
bluetooth dma hv input message parport serial xenpv_hvm
这里的net才是网卡驱动
[root@localhost kernel]#
[root@localhost kernel]# ls drivers/net
3c59x.ko cxgb4 mdio.ko pppoe.ko sungem.ko
8139cp.ko dl2k.ko mii.ko pppox.ko sungem_phy.ko
8139too.ko dummy.ko mlx4 ppp_synctty.ko sunhme.ko
8390.ko e1000 myri10ge qla3xxx.ko tg3.ko
acenic.ko e1000e natsemi.ko qlcnic tokenring
amd8111e.ko e100.ko ne2k-pci.ko qlge tulip
atl1e enic netconsole.ko r8169.ko tun.ko
b44.ko epic100.ko netxen s2io.ko typhoon.ko
benet fealnx.ko niu.ko sfc via-rhine.ko
bna forcedeth.ko ns83820.ko sis190.ko via-velocity.ko
bnx2.ko hyperv pcmcia sis900.ko virtio_net.ko
bnx2x ifb.ko pcnet32.ko skge.ko vxge
bonding igb phy sky2.ko wireless
cassini.ko igbvf ppp_async.ko slhc.ko
chelsio ixgb ppp_deflate.ko slip.ko
cnic.ko ixgbe ppp_generic.ko starfire.ko
cxgb3 ixgbevf ppp_mppe.ko sundance.ko
这些ko文件就是对应的网卡设备的驱动程序
[root@localhost kernel]#
通过这种机制,将大多数硬件的驱动程序做成模块,需要的时候,才装载,
这样就保证了内核自身的体积会很小,但是目录并不小
[root@localhost kernel]# du -sh /lib/modules/2.6.18-398.el5/ (各种模块大小111M)
111M /lib/modules/2.6.18-398.el5/
[root@localhost kernel]#
[root@localhost kernel]# ls /boot/vmlinuz-2.6.18-398.el5 -lh (内核大小2.1M)
-rw-r--r-- 1 root root 2.1M 2014-08-12 /boot/vmlinuz-2.6.18-398.el5
[root@localhost kernel]#
临时的根 小根
根切换
chroot (change root)根切换命令
[root@localhost ~]# man chroot (interactive 交互式的)
[root@localhost ~]# mkdir -p /test/virroot
[root@localhost ~]# chroot /test/virroot/
(期望以/test/virroot/ 为根 这个根下啥都没有,所以无法运行 下面没有bin bin/bash 等目录) (里面有个bash程序才能切换过去)
chroot: cannot run command `/bin/bash': No such file or directory
[root@localhost ~]#
[root@localhost ~]# mkdir /test/virroot/bin
[root@localhost ~]# cp /bin/bash /test/virroot/bin/
[root@localhost ~]# chroot /test/virroot/ (还是报错)(因为bash依赖的库不存在)
(切换过去之后 小根就自我独立运行)
chroot: cannot run command `/bin/bash': No such file or directory
[root@localhost ~]#
[root@localhost ~]# ls /test/virroot/bin/
bash
[root@localhost ~]#
[root@localhost ~]# man ldd (ldd 查看运行程序的库文件依赖)
[root@localhost ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffd8595000) (库文件访问入口,不用管它)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x000000367e200000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000034dee00000)
libc.so.6 => /lib64/libc.so.6 (0x00000034dea00000)
/lib64/ld-linux-x86-64.so.2 (0x00000034de600000)
[root@localhost ~]#
[root@localhost ~]# cp /lib64/libtermcap.so.2 /test/virroot/lib/
[root@localhost ~]# cp /lib64/libdl.so.2 /test/virroot/lib/
[root@localhost ~]# cp /lib64/libc.so.6 /test/virroot/lib/
[root@localhost ~]# cp /lib64/ld-linux-x86-64.so.2 /test/virroot/lib/
[root@localhost ~]#
[root@localhost ~]# tree /test/virroot/
/test/virroot/
|-- bin
| `-- bash
`-- lib
|-- ld-linux-x86-64.so.2
|-- libc.so.6
|-- libdl.so.2
`-- libtermcap.so.2
2 directories, 5 files
[root@localhost ~]#
[root@localhost ~]# chroot /test/virroot/ (我还是没有切换过来)
chroot: cannot run command `/bin/bash': No such file or directory
[root@localhost ~]# mv /test/virroot/lib/ /test/virroot/lib64 (我的是64位版本的 把lib改成lib64目录就可以切换过来了)
[root@localhost ~]#
(但是马哥已经切换过来了) (我的是64位版本的 把lib改成lib64目录就可以切换过来了)
# ls 外部命令不可用 ,cd 是内部命令可用
[root@localhost ~]# chroot /test/virroot/
bash-3.2#
bash-3.2# ls
bash: ls: command not found
bash-3.2# cd /bin
bash-3.2# cd ..
bash-3.2# cd /lib64/
bash-3.2# cd /root
bash: cd: /root: No such file or directory
bash-3.2#
bash-3.2# exit
exit
[root@localhost ~]#
监狱 jail (上面的chroot 后的根属于指定框框的,是 jail)
而我们的临时根小根属于完完全全的根切换
[root@localhost ~]# ls -la /sys (sysfs 文件系统总是被挂载在 /sys 挂载点上)
总计 8
drwxr-xr-x 11 root root 0 2018-10-29 .
drwxr-xr-x 27 root root 4096 10-29 08:15 ..
drwxr-xr-x 26 root root 0 10-29 08:15 block
drwxr-xr-x 16 root root 0 10-29 08:15 bus
drwxr-xr-x 42 root root 0 10-29 08:15 class
drwxr-xr-x 17 root root 0 10-29 08:15 devices
drwxr-xr-x 3 root root 0 2018-10-29 firmware
drwxr-xr-x 2 root root 0 2018-10-29 fs
drwxr-xr-x 4 root root 0 10-29 08:15 kernel
drwxr-xr-x 152 root root 0 10-29 08:15 module
drwxr-xr-x 2 root root 0 10-29 08:15 power
它这个切换不是chroot
(redhat5上,借助于另外的shell来实现 nash) switch_root
(redhat6上比较简单,风格统一)
临时根 就是个文件,由内核装载进内存当中,在内存中展开,把内存当作磁盘来用
(把内存当中的一段空间模拟成磁盘来用)
通常称为 ramdisk 内存磁盘
redhat5 ramdisk -->initrd(临时根小根 initial ramdisk) (random access memory,RAM) (随机存取存储器(random access memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。) (access 入口,出口;接近,进入;增长;爆发;访问)
redhat6 ramfs-->initramfs
[root@localhost ~]# man chroot
[root@localhost ~]# vim /etc/inittab
默认级别是几,
id:3:initdefault
[root@localhost ~]# ls /boot/grub/
device.map grub.conf minix_stage1_5 stage2
e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5
fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5
ffs_stage1_5 menu.lst stage1 xfs_stage1_5
[root@localhost ~]# ls -la /boot/grub/
stage2 这个阶段可以加载图片,显示图像的
linux一启动就有红色的背景图
那个图标就是 splash.xpm.gz 文件
stage2 还可以借助于grub.conf来完成工作
grub.conf 定义了 可以加载哪个图片,能够显示哪些操作系统让我们去选择,能够引导
哪些类型的操作系统,能够引导哪些内核等
[root@localhost ~]# rpm -q grub
grub-0.97-13.11.el5_10.1
[root@localhost ~]#
下面的命令是在红帽6中
[root@localhost ~]# rpm -q grub
grub-0.97-99.el6.x86_64
[root@localhost ~]#
[root@localhost ~]# cat /etc/grub.conf (它是一个软链接) (/boot/grub/grub.conf) (splash 泼洒 溅起 溅落)
# 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/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-398.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-398.el5.img
[root@localhost ~]# ls -la /etc/grub.conf
lrwxrwxrwx 1 root root 22 09-05 14:18 /etc/grub.conf -> ../boot/grub/grub.conf
[root@localhost ~]#
[root@localhost ~]# ls /proc
这个cmdline是传递给内核(文件)的参数(启动内核的命令是什么) 见上面的grub.conf 就可以看到
[root@localhost ~]# cat /proc/cmdline
ro root=/dev/VolGroup00/LogVol00
[root@localhost ~]#
[root@localhost ~]# cd /boot
[root@localhost boot]# ls
config-2.6.18-398.el5 lost+found vmlinuz-2.6.18-398.el5
grub symvers-2.6.18-398.el5.gz
initrd-2.6.18-398.el5.img System.map-2.6.18-398.el5
[root@localhost boot]#
[root@localhost boot]# mount
boot 其实是一个独立的分区
临时根其实是可以挂载在任意盘,未必一定要挂载在 hd0,0 ,也可以挂载在 hd0,1,即真正的根分区所在的盘,也可以挂载在/usr,/test所在的盘
linux 有个图形工具 叫 gimp 类似于 photoshop
[root@localhost yum.repos.d]# yum install gimp
[root@localhost yum.repos.d]# gimp & (我这边报错,应该是图形功能没装吧)
[1] 11434
[root@localhost yum.repos.d]# GIMP 无法初始化图形用户界面。
请确定您的显示环境已经正确安装。
Xshell 可以在windows当中打开linux图形界面 (我装上了xshell老是gimp,启动startx出问题) (Xshell 这个工具 在本站有看到如何下载)
马哥效果截图
对于linux命令行而言是后台,但是图形界面是在前台运行的
下面的做图可以不看
上面的调大小 好像不需要
上面的图就不用管了吧 ,又不是为做图的
不能用颜色变化太多的图,只能用简单的黑白图
文件扩展名要是 xpm
grub.conf里面的配置都可以改,改完之后,重启它就生效了
[root@localhost boot]# vim /etc/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/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-398.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-398.el5.img
~
~
~
~
~
(改之后的内容)
# 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/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title My Linux
root (hd0,0)
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-398.el5.img
进行重启 (尽量命令行执行,不要按重启按钮进行重启,否则有许多东西没保存,会丢失)(非要按重启按钮重启的话 先执行 # sync 命令)
# shutdown -r now