第六十八讲——手动攒linux系统 当我们自己攒一个系统的时候,我们需要拿一块硬盘,先对其分区,boot应单独分区,避免空间使用殆尽操作系统无法启动,在分区上应有根目录,且要有/boot目录(挂载点的名称),分区好之后将分区挂载到对应的目录。 根目录下应有: /sbin、/bin、/etc、/var、/tmp、proc、/sys、/dev、/lib、/usr、/home 在目录建立好之后,我们应对硬盘安装grub引导程序,用于引导操作系统、 安装grub:grub-install –root-directory=/tmp /dev/sd# 我们把init程序及其依赖的库文件拷贝到对应目录。 将/boot/vmlinuz...cp到挂载点为*/boot的目录下,接下来生成initrd脚本。 对于rhel5来说,生成initrd的命令为mkinitrd 对于rhel6来说,生成initrd的命令为dracut,当然,也是支持mkinitrd命令的。 #mkinitrd initrd文件路径 #mkinitrd /boot/initrd-`uname -r`.img`uname -r`为当前系统创建initrd文件,uname –r调用的是当前系统的内核版本。我们需要注意的是,此命令不能对我们新的内核创建 initrd文件,所以我们需要将/boot/目录下的initrd-*.img文件展开进行修改,而后再组装起来,我们先拷贝一份initrd文件。 此init文件是一个压缩格式的文件,在拷贝时注意添加上.gz的后缀,使得解压缩时程序能够识别,我们可以使用file命令查看initrd文件的类型,可以看到是gzip格式的文件。 我们使用gzip –d将initrd文件进行解压缩,再次使用file命令查看initrd文件,会发现这是一个cpio类型的文件,这是一个比较古老的归档格式,我们还需要对其进行展开,为了避免展开后产生小文件,我们应当在目录中进行展开。在展开cpio类型的文件时,我们使用的是cpio命令。 cpio –id -i 进入copy-in模式,也就是解压缩模式 -d 在需要的地方创建开始目录。 在展开之后我们会发现有很多的目录,和根目录下的目录结构相似,简直就是一个linux操作系统,在对initrd文件进行操作的时候我们可以简化操作: zcat /boot/initrd-*.img |cpio –id 不解压缩查看压缩包的内容,并将其送给cpio命令,此命令只能解压到当前目录下。 我们需要编辑init文件(nash脚本),rhel5中init页末有指定根的位置,在修改完之后我们还需要对文件进行归档(cpio归档),依旧是在当前目录下对所有的文件进行归档: find . |cpio –H newc –quiet –o |gzip -9>/tmp/boot/initrd.gz -H newc 指定类型 --quiet 静默模式 -o 归档 gzip -9指定压缩比 并定向到指定目录下。 在sysroot挂载点目录下创建必要的目录(根目录下的文件) cd /path/to/somewhere mkdir –p /sbin /bin /lib /proc /sys /usr/{sbin,bin}/var/log /etc/rc.d /boot /dev /tmp 在创建完目录后,我们将常用的程序以及依赖的库文件cp到对应的目录下。 我们使用ldd查看对应程序所依赖的库文件,并将这些文件cp到lib目录下。 在正常的操作系统下有/etc/inittab文件,因此我们需要手动创建并写入几句: id:3:initdefault 设置默认的启动级别 我们可以将需要开机启动的脚本或者程序写入rc.local中,因为rc.local是最后启动的一个脚本。 我们在拷贝一个命令的时候,如果不知道命令的位置在哪里,我们可以使用which命令 #which COMMAND 查看命令的位置 #ldd COMMAND 查看命令所依赖的库文件。 bash的特性: 在刚才我们在mkdir命令中使用到了花括号展开{},这是bash的特性,其实bash的特性还有很多。为了使应用程序及其所依赖的库文件能够快速复制,我们应当写成脚本的形式,为了更方便的操作,我们需要介绍一下一个bash特性,距离来说明。 FILE=/etc/rc.d/rc/local echo ${FILE#/} 输出的结果为etc/rc.d/rc.local #号后为指定的关键字,关键字左边的内容会被统统去除。 echo ${FILE##*/} 输出的结果为rc.local ##*表示最后一次关键词左边的内容全部去除,包括关键字本身。 “#”以指定的字符为分隔符,从左向右第一次匹配到的字符串内容去除。只保留第一次匹配之后的字符串。 这个方法常用来取出一个文件的名称,我们还可以使用一种方法来提取一个文件的目录 %:从右向左去除关键字后的内容。 FILE=/tmp/1/2/3/4/5 echo ${FILE%/*} 输出结果为/etc/rc.d 即取得了一个文件的目录。 echo ${FILE%%/*}输出结果为空行,%%为最后一次匹配。 “%”以指定的字符为分隔符,而后从右往左第一次匹配到的字符串内容移除,只保留第一次匹配之前的字符串 为了实现手动攒系统的目的,我们还需要继续弄清楚系统的启动流程: POST加电自检,将ROM中的程序映射到内存中,以实现硬件的检 -->BIOS(boot sequence)引导程序,根据BIOS启动顺序去找到对应存储设备上的MBR,MBR存在则寻找MBR中的boot loader,boot loader中配置了所需要引导的操作系统的位置,当boot loader载入内存时,BIOS会将系统的控制权限移交给boot loader,boot loader会依靠配置寻找操作系统的内核(根据用户的选择),将内核装载进内存并解压缩,内核完成初始化后将权限移交内核。 -->kernel(initrd,initramfs) 内核初始化完成的工作: 一是硬件探测 二是装在驱动,借助initrd或者initramfs过渡到根 三是挂载根文件系统(rootfs) 四是启动用户空间中的第一个进程init initrd或者initramfs可以实现将真正的根文件系统同内核连接起来 -->执行init,配置文件为/etc/inittab,在红帽6上init不再是传统意义上的init,而是一个被称为upstart的程序,为了兼容还是命名为init upstart的配置文件为/etc/inittab、/etc/init/*.conf init完成的工作主要取决于/etc/inittab文件 一是设定默认的运行级别 二是系统初始化的脚本rc.sysinit 三是启动指定级别的服务脚本 /etc/rc.d/init.d/* 使用ln –s链接到/etc/rc.d/rc#.d,即0-6各级别下,链接文件以K/S开头 四是启动虚拟终端,如果运行级别为init5,还需要启动图形终端 以上就是init的工作 -->执行/etc/rc.d/rc.sysinit(系统初始化脚本),系统初始化完成的任务,我们再次强调,内核在装载根文件系统时为了避免根文件系统的损坏,是以只读方式挂载的。 第一步此脚本会检测并且以读写的方式重新挂载根文件系统 第二步是设置主机名 第三步是挂载文件系统,需要挂载的文件系统定义在/etc/fstab配置文件中,以实现开机自动挂载 第四部启用swap分区 第五步可能需要装载外围硬件设备驱动,内核的初始化只加载最核心的设备驱动(CPU内存等),网卡、显卡等设备都是在init的执行过程中完成驱动的。 第六步根据/etc/sysctl.conf设定内核参数 第七部激活udev、SElinux 第八步激活lvm、RAID设备 第九步清理过期的锁文件和PID文件 第十步装载键映射(键盘上的每一个键的具体功能) 给自己讲linux 2017-02-06 评论 1639 次浏览
第六十七讲——内核的编译 在内核中,除了最核心的功能不能选择,需要做进内核外,其它的大多数功能在编译的时候都有三种选择: 一是不使用此功能 二是编译成内核模块 三是编译进内核文件,即成为内核的一部分。 编译内核: 红帽系列有一个特性,即在5.x、6.x时使用的都是同一内核,如果我们突然将内核升级到最新,可能会造成不兼容,所以内核的升级一定要慎重。 编译内核需要安装所需的工具: development tools development libraries 下载内核文件并解压缩,一般下载的为源码包。 tar –xf linux-2.6.23.10.tar.gz –C /usr/src指定解压缩目录为/usr/src,/usr/src下为源码 内核解压后是源代码,内核的编译不能像编译软件那样config,因为内核的编译选项非常的多,解压后我们需要创建一个链接文件,一般来说,我们当前使用的内核或当前编译的内核为linux,类似于将解压后的目录改名为linux。 切换到linux目录下: */arch/ 目录下为各类平台 */mm/ 内存管理 */net/ 和网络功能相关 */virt/ 虚拟化的相关功能 /kernel/ 内核相关 /ipc/ 进程间通信 /documentation/文件 应当看一看,在后期深入学习linux时应当学习。 手动编译内核提供了两种方式选择内核的特性: 一是编译时图形环境下内核特性的选择 make gconfig make gconfig为Gnome桌面环境 makekconfig make kconfig 为KDE桌面环境 需要安装图形开发库: GNOME software development(GNOME环境) KDEsoftware development(KDE桌面环境) 需要依赖桌面环境,所以并不是很常用。 二是命令行界面下的操作: 我们在命令行下使用较多,所以在命令行下的操作方式 make menuconfig:打开一个图形的文本窗口,这个窗口必须要能够容纳19行,80列,否则就会报错—>#least 19 lines by 80 columns 我们使用uname –r会发现除了内核的版本还有一长串的字符,这一串字符为本地版本号,我们在make menuconfig弹出的菜单中general setup中有一项local version即为设置此版本号。 在弹出的图形选择界面上使用空格进行选择项的切换,M表示做成模块,*表示做进内核。在选择结束后会询问是否保存,若保存则会在当前目录下生成.config的隐藏配置文件。接下来的编译就和其他软件一样了。 一是执行make,此过程出错的可能性很大,我们可以借助红帽公司的模板/boot/config,在此基础上进行修改,cp到解压缩的目录下更名为.config。 下载内核源码包 tar –xf ./linux /usr/src/ cd /usr/src ln –sv linux.. linux cd linux cp /boot/config ./.config make menuconfig 等待make等待编译结束 make modules-install先安装模块 make install 当安装结束后需要重启操作系统,在引导界面有内核的选择(在内核安装完成后,会自动将信息写入grub) 我们在编译内核时,一定不要使用远程连接,一旦连接中断编译过程也就中断。如果非要使用远程编译内核,我们可以安装screen工具,这个工具可以模拟很多个窗口。 yum install screen 当中断连接断开,重新登录即可,使用screen –ls可以查看模拟的窗口。 我们使用screen –r ID 返回窗口。 screen –ls 显示已经建立的窗口 screen –r ID 还原回某屏幕 ctrl+a,d拆除当前屏幕(类似后台) screen 建立一个新的屏幕 exit退出 二次编译时需要清理之前的编译。 make clean清理之前编译好的二进制模块 make mrproper清理此前编译的任何操作,包括.config也会被清理,在make mrproper清理之前,应当备份配置文件。 我们也可以只编译内核中的一部分,甚至可以只是一个目录。 给自己讲linux 2017-02-05 评论 1746 次浏览
第六十六讲——linux启动(内核) 我们从之前讲过的只是可以知道,内核是由两部分组成的: 核心:位于/boot目录下,/boot/vmlinuz-version(版本号) 内核模块(KO):/lib/modules/version/以版本号命令的目录 内核的设计有两种风格: 单内核:模块化设计(采用了微内核的思想) 微内核 模块化设计的好处是缩小内核的体积,在需要时才将模块载入内核,装载内核的命令: insmode modprobe 内核版本的区分: 主版本号.次版本号.修正号 次版本号为奇数时为测试版,此版本为偶数时为稳定版 但是在2.6.*以后的区分不同。 每一个版本出来后会有两个分支,稳定版本的编号为2.6.*.*多一个次修正号,为了方便记忆这么理解。 测试版的编号为2.6.*+1-rc* 如果测试版的编号从2.6.*+1-rc.1----2.6.*+1-rc.5如果rc..5稳定以后,则发行下一个版本,下一个版本再分为两个分支。 我们在服务器上应当选择稳定版,我们可以使用uname –r查看内核的版本。 内核虽是运行在内核空间,但是我们用户是可以跟内核打交道的,用户空间访问和监控内核的方式是通过两个目录完成。 /proc /sys 用户空间通过执行一些命令进行修改/proc、/sys目录下的某个文件来完成的。 /proc、/sys目录下的文件通常为内核中某个参数的映射,对于/proc目录来说,目录下的大多数文件为只读,对于/sys目录来说,/sys目录下的大多数文件是可以读写的。这就意味着我们可以修改文件中的内容,以达到修改内核运行特性。但是对于这类文件我们不能使用vim编辑器,而是使用echo重定向的方式写入。 设定内核参数的方法: echo 1 >/proc/sys/vm/drop_caches清空缓冲和缓存。 sysctl –w vm.drop_caches=1 sysctl –w *=value(参数) sysctl –w所指定的对象在/proc/sys目录下,且文件与文件父目录之间使用点隔开,这两种方式能立即生效,但是不能永久有效,需要永久有效需要写入配置文件。 我们可以将需要修改的参数写进/etc/sysctl.conf文件中,语句的格式类似sysctl命令,为sysctl –w所指定的部分。 即vm.drop_caches=1的格式 sysctl –w默认指定的是/proc/sys/目录下的文件,命令中目录使用点‘.’作为分隔符。 sysctl –p 通知内核重新读取/etc/sysctl.conf配置文件。 sysctl –a显示所有内核参数,及其值,这些参数并不是所有的都能够修改,而且每个参数的值和范围不一样。 /proc/sys/net/ipv4/ip_forward 当这个参数启用(为1时),如果本机有两块网卡,当一块网卡出现ping不通的情况时,会将数据通过另一张网卡进行发送。 也就是说/proc/sys/net/ipv4/ip_forward的值为1时,本机充当网关,将故障网卡的信息进行收发。 我们来说一说调优的几个参数,调优其实就是通过/proc、/sys目录下的内核参数映射文件来进行调整参数,调优都是通过访问这些接口完成的。 /proc/sys/kernel/hostname 修改主机名 /proc/sys/vm/drop_caches 清空缓存 /proc/sys/net/ipv4/ip_forward 是否允许本机充当路由。 内核的模块管理: #lsmod 查看,显示已经装载的模块,分为三列:moudle(模块名称) size(模块大小) used by(被调用了几次,由谁调用) #modprobe MOD_NAME:装载模块 #modprobe –r MOD_NAME:卸载模块(从内核上拆除),手动实现内核模块的装载,卸载。 #modinfo MOD_NAME:查看内核模块信息,其中有一列为depends(依赖关系,所依赖的模块名称) #insmod /PATH/TO/MODULE_NAME 装载内核模块,使用insmod装载模块时,必须要指定文件路径。 #rmmod MOD_NAME 卸载模块,卸载模块时无需指定路径 #depmod /PATH/TO/MODULES_DIR 指定模块的存放路径,并生成模块间的依赖关系,生成后会保存在对应目录下,使用不多。 如果有一个硬件设备没有驱动,则需要我们到官网去下载源代码手动编译成ko的模块,放在/lib/modules/下,且内核模块要与内核完全匹配,否则不能运行。即2.6.32-1的内核只能在2.6.32-1上编译驱动。 给自己讲linux 2017-02-04 评论 1754 次浏览
第六十五讲——kernel初始化的过程 一是设备探测 二是驱动初始化(从initrd文件中装在驱动模块) 三是以只读方式挂载根文件系统,为了文件系统的安全选择只读挂载,避免写入或者损坏数据。 四是装在第一个PID为1的进程:init。 在第三步以只读方式挂载,避免了BUG影响整个根文件系统,当装载完成后由init重启文件系统为读写。 /sbin/init (/etc/inittab) 早先这个init可能是一个脚本,也可能是一个二进制程序,但是在rhel6.0之后,使用的就不再是传统的Unix init了。 在6.0之后,使用的是upstart,但是名称依然是init,另一个版本的init(可执行程序)。 upstart由Ubuntu组织开发,upstart可以实现并行的启动进程,但是有些服务是有依赖关系的,这些依赖关系各自都有体现。 upstart的配置文件/etc/inittab只有一行,因为upstart使用d-bus进行通信,所以不再需要各种指定的子系统。(IPC机制,进程间通信,实现事件驱动基于d-bus各子系统之间的通信) 理解init的工作机制有助于理解其他类型的机制,所以先讲一讲6.0之前的inittab。 /etc/inittab 由三个冒号分隔为四段: 首先是id,标识符,区分不同的行 其次是runlevels,在哪些级别下会执行此命令。 接下来是action,采取的动作,即什么时候启动进程。 最后是process,执行的进程,即需要运行的程序。 id:runlevels:action:process 所以/etc/inittab中每一行都代表一个要启动的进程。 省略级别则表示所有级别生效。 id::sysinit:/etc/rc.d/rc.sysinit 系统的初始化脚本:rc.sysinit ACTION: initdefault:设定默认的运行级别 sysinit:系统的初始化 wait:等待级别切换,级别切换一次就执行一次,但是只是在切换到指定级别时执行。 respawn:重新启动,可能会启动多次,一旦程序终止会重新启动(指定级别下) 下面来说一说系统初始化脚本/etc/rc.d/rc.sysinit的任务: 系统初始化执行的脚本位于/etc/rc.d/rc.sysinit,此脚本间隙详细阅读,前两百行可以略过。 一是激活udev和SELinux 二是根据/etc/sysctl.conf文件来设定内核参数 三是设定系统时钟 四是装在键盘映射 五是启用交换分区 六是设置主机名 七是根文件系统检测,并以读写方式重新挂载 八是激活RAID和LVM设备 九是启用磁盘配额 十是根据/etc/fstab,检查并挂载其他文件系统 十一是清理过期的锁文件和PID文件 在/etc/rc#.d下的文件,K*、S* K# 后面为数字,表示关闭的优先级,数字越小越优先关闭 S# 后面跟数字,表示开启服务的优先级,数字越小越优先。 我们应当遵循先关闭后启动的原则,先关闭以K开头的程序,在启动S开头的程序,都是链接文件。 只要一个陈故乡支持start,restart等等放入/etc/initrd/目录下,可以通过命令自动创建链接文件到/etc/rc.d/下的各级别下。 服务类脚本: 红帽在编排时遵循sys-V风格,在/etc/rc.d/init下的脚本,至少支持(接受)四个参数:start|stop|restart|status 额外的参数: reload:无需重启读取配置文件,1号信号也能够重新加载配置文件 configtest:用于检测配置文件中是否有语法错误。 /etc/rc.d/init/下所有的脚本有两行: #chkconfig:定义 `#description` 这一类脚本依靠这两个能够实现称为系统服务。 chkconfig命令:指定/etc/init.d下的这一类脚本,能够自动给他们创建连接到/etc/rc.d/rc#.d目录下,这一类脚本必须要有chkconfig、description两行。 `#chkconfig #1# #2# #3#` 1启动的级别,runlevels(345等等), 2SS启动的游优先顺序 3KK关闭的优先顺序 当chkconfig命令来为此脚本在rc#.d目录创建连接时,runlevels表示默认创建默认为S#开头的连接,除此之外的级别默认创建为K#。 description:描述信息 用于说明此脚本的简单功能,“\”为换行,每一行不能超过80个字符,否则在图形化界面显示不出来。 chkconfig、description为注释的内容,但是chkconfig命令会读取这两行中的内容。 一般来说,先开启的服务后关闭,后开启的服务先关闭。因为开启的服务可能有其他服务依赖。 当一个程序启动起来之后,就在/var/lock下创建一个锁文件,当程序关闭时就删除锁文件,我们可以通过锁文件判断程序是否运行。 chkconfig –list查看所有独立守护进程的启动设定 chkconfig—list [SERVICE_NAME]查看特定的进程 我们将脚本文件放在/etc/init.d目录下,使用chkconfig –add SERVICE_NAME 将脚本加入服务列表,加入由chkconfig控制的服务中去。 但凡能够在对应级别下可以设置其启动、停止状态的服务都叫独立守护进程(可以管理在哪些级别下是开启的,在哪些级别下是关闭的。) 卸载对应的进程: chkconfig –del SERVICE_NAME 将创建连接的文件全部删除。 chkconfig –level RUNLEVES_NSME(on|off)改变守护进程的启动级别开关。 chkconfig runlevels SS KK runlevels可以为一个短横线:- 表示没有级别默认为S#开头的链接,即所有的链接都以K#开头。 /etc/rc.d/rc.local脚本 /etc/rc.d/rc3.d/S99local S99为所有服务的最后一个脚本,所以一些不期望写成服务加入守护进程,也不希望特别麻烦的操作,都可以写入到这个脚本中,随开机启动,在用户登录前执行。 local是系统启动时最后执行的脚本。 action: respawn,只要进程停止就会重启,启动终端0-6,respawn用于终端和图形界面 继续讲一讲/etc/inittab的任务 一是设定默认的运行级别 二是运行系统初始化脚本 三是运行指定运行级别对应目录下的脚本 四是设定Ctrl+Alt+Del组合键的操作 五是设定UPS电源在电源故障/恢复时执行的操作 六是启动虚拟终端(2345级别) 七是启动图形终端(只在对应的级别下启动) 守护进程的类型: 独立守护进程 瞬时守护进程:不需要关联运行级别,由一个独立守护进程xinetd进行管理,xinetd被称为超级守护进程,对瞬时守护进程进行管理,需要时才启动。 xinetd超级守护进程: 用于管理瞬时守护进程,xinetd默认是没有安装的,当xinetd安装的时候,会有许多的瞬时守护进程,它没有运行级别的概念,有xinetd调用,我们需要知道的是,当我们将一个程序加入守护进程的时候,对当前的服务是没有影响的,重启才会生效,有需要时可以直接将对应的服务启动。 chkconfig [--level RUNLEVELS] SERVICE (on|off) 指定的级别如果省略。默认为2345级别。 给自己讲linux 2017-02-03 评论 1799 次浏览
第六十四讲——boot loader之GRUB grub除了能够提供给我们一个系统选择的界面之外,还可以给我们提供一个编辑界面: e:进入编辑模式 a:修改内核参数 c:进入命令行模式 当我们处于引导界面的时候,定位好光标,按e键进入二级菜单,也就是title后面的三,我们想要编辑某一项时直接敲e键即可,进入编辑界面,添加字符(按空格) 添加1,装载内核启动的第一个程序时的启动级别(0-6) 1为单用户模式,s/S,single都可以进入单用户模式,完成后回车 d,删除一行。o,新增一行。使用同vim 如果不希望有人进入单用户模式(使用grub)。我们还可对grub进行加密,我们在grub.conf配置文件中的任何一个title上面加入一个人全局变量,使用password定义一个密码(明文)。当然,我们还可以以加密的方式进行添加密码。 passwd –md5 带杂质的密码 grub-md5-crypt可以生成一个带杂质的密码串。 我们将生成的密文加入/etc/grub.conf或者/boot/grub/grub.conf,也可以将password一行放到title中,这就意味着需要输入密码才能够启动操作系统或者内核,在引导界面按p输入密码。 在命令行下,我们查看当前的运行级别使用runlevel,显示的结果可能是两个数字,第一个数字表示的是上一个级别,N为没有切换过,第二个数字表示当前运行级别。 uname –r/-a 查看内核,平台架构等信息,uname也可以单独使用。 uname –r显示内核的版本号(releas号) uname –a 显示所有 grub修复 当grub损坏的时候,我们可以使用grub命令进入grub的访问接口进行修复。 #grub 为了实现在命令行下的grub修复,我们先将MBR中的前446byte破坏掉,也就是先将grub的第一阶段破坏掉。 #dd if=/dev/zero of=/dev/sda bs=446count=1 第一步,安装stage1 grub的第一阶段 grub>一定要指定内核所在分区(/boot) grub > root(hd0,0)第一块硬盘上的第一个分区,并指定root。 grub> setup(hd#) 安装grub,安装在哪一个硬盘,需判定是哪一个磁盘。 grub > quit 退出 第二步,安装grub #grub-install –root-directory=/(/boot目录的父目录) /dev/hd# 内核的所在分区一定要挂载到/boot目录,只要知道boot的父目录并挂载到某个目录,指定硬盘。会自动安装stage1.5的文件(文件系统格式),手动编辑grub.conf cd到相应目录,一般为/boot/grub/ #vim grub.conf default=0 引导指定的title,从0开始编号 timeout=5 界面超时时长 hiddenmenu 隐藏菜单 splashimage=(hd0,0)/grub/spash.xmp.gz图片文件可以省略不写 title 自定义系统或者内核的名称 root (hd0,0) kernel /vmlinuz initrd /initrd.img 当grub配置文件损坏的时候,只有第一步的boot loader加载,第二步因为无法读取stage2配置文件,所以会提供一个grub的命令行,我们只需要知道内核在哪儿,根在哪儿就能够启动起来。 当第一步的boot loader启动起来,加载不了stage2的时候,会出现一个grub的引导字符界面,在这个界面里,支持find命令,可以查找硬盘上是否存在内核。 grub > find (hd0,0)/ grub > root (hd0,0)指定root grub > kernel /vmliuz...可以使用TAB键补全 grub > initrd /initrd......,必须同内核版本保持一致,可以使用TAB键补全。 grub > boot 重启当前系统 给自己讲linux 2017-02-02 评论 1702 次浏览
第六十三讲——boot loader 这一讲来说一说操作系统中的引导程序boot loader,boot loader存在于MBR的前446个字节,从启动顺序来看,boot loader能够访问的一定是一个基本的磁盘设备,kernel一定能够访问。因此boot loader能够访问的分区,kernel也能够访问,所以kernel和initrd(或者initramfs)这两个文件一定是位于同一个分区上的,由boot loader同时一块儿加载进内存的,kernel借助initrd(initramfs)中的驱动、模块,最终实现根的访问。 然后加载/sbin/init,所有用户空间下的程序都是由init来完成初始化,在windows当中,系统启动起来之后会有许多的服务随之启动,且有所谓的安全模式,当设备驱动不兼容的时候,可以进入安全模式卸载相应的驱动程序。 VGA模式,当显卡分辨率太高而无法进入操作系统时,以最基本的驱动程序进入操作系统。 在linux操作系统下,不同服务的启动划分为运行级别,在不同的运行级别下启动相应的服务。 所谓的运行级别也就是在不同的级别下所启动的服务不一样,运行级别的核心就是启动的服务不同。 在linux操作系统中运行级别分为0-6,一共7个运行级别。 init 0:halt 关机 init 1:单用户模式,类似于Windows操作系统下的安全模式,直接以管理员的身份进入系统,可能不需要密码。 init 2:多用户模式,multi user mode 有网络功能,但是不启用nfs(网络文件系统)。 init 3:正常多用户模式,multi user mode 但是这种是纯文本的多用户模式(命令行)。 init 4:保留的运行级别 init 5:正常的多用户模式,图形界面,graphic mode init 6:reboot 重启 默认运行级别可以再/etc/inittab文件中进行修改。 讲了大半天的运行级别,我们还是回过头来讲一讲boot loader,详细的讲一讲启动的流程。 首先我们需要知道的是,boot loader也是一个程序,对于不同的操作系统其boot loader是不一样的,boot loader是由操作系统提供并安装在MBR中的前446个字节。 boot loader是位于MBR中的,且MBR不属于任何一个操作系统,是全硬盘级别。在Windows8以后,boot loader不能引导其他的操作系统,而且会将MBR锁死,美名其曰安全。 linux常用的boot loader有两种: LILO:linux loader,早期linux用于引导linux启动的一个boot loader,但是它不能够引导1024柱面分区以后的内核,因此它不支持大硬盘,在嵌入式领域应用很多。 GRUB:Grand Unified Bootloader(统一的引导程序),GRUB是两阶段的引导程序。 stage 1:GRUB的第一阶段是在MBR中,作用是用于引导第二阶段。 stage 2:第二阶段,位于内核所在分区的/boot/grub/stage2,也就是说MBR中的第一阶段需要刚问这个目录。 /boot是一个基本的磁盘分区,但是这个分区需要格式化并安装文件系统,这个文件系统的类型可能不一样。因此,在stage2之前还有一个步骤,称为stage1.5,用于识别常见的不同类型的文件系统,在/boot/grub下有很多的*1.5的文件,这些都是不同类型的文件系统,在加载对应的文件系统之后启动stage2,stage是一个很强大的程序,它完全突破了446byte的限制,第二阶段还能加载图片进行显示,但是需要借助一个配置文件grub.conf 在grub.conf配置文件中,可以定义开机界面操作系统选择时加载的背景图片,提供操作系统的选择,能引导哪些内核。 GRUB的使用: /etc/grub.conf为/boot/grub.conf文件的连接文件 在grub.conf配置文件中,顶格写都是全局的属性定义,下面的每一个title用于定义一个操作系统或者一个内核,linux操作系统可以提供不同版本的内核,我们启动不同内核的话,每一个内核都需要在title中声明,所以,title是用于定义当前硬盘上不同操作系统或者当前系统不同版本的内核。 grub.conf配置文件的内容需要手动写入,在配置文件出现错误的时候需要能够在grub中正确的指定。 default=0 默认启动的title(从上往下编号,从0开始),用于设定默认启动的内核或者系统的。 timeout=5 等待用户的超时时长,单位为秒。 splashimage=(hd0,0)/grub/splash.xpm.gz指定grub的背景图片。 hiddenmenu 隐藏菜单 title centOS。。。。。(可以随意更改,需要引导的操作系统或内核的标题) root (hd0,0)# 指定内核所在的设备 kernel /vmlinuz-2.6.32-431.el6.x86_64 roroot=/dev/mapper/volgroup-lv_root rd_NO_L....装在逻辑卷上的操作系统。 从ro开始为向内核传递参数,我们之前说过,在/proc目录下的每一个进程目录中都有一个cmdline为启动这个进程所执行的命令。在/proc目录下有一个cmdline文件(与内核有关),这个文件中的内容就是由grub传递给内核的。 initrd /initromfs-2.6.32...........img为虚根的文件系统,ramdisk文件的路径。 grub识别硬盘时,不论是什么接口的硬盘一律识别为hd,hd# 表示第N块磁盘,从0开始编号。hd#,#第二个井号表示硬盘的分区。格式为hd#,N,N为0.1.2.3(主分区) grub访问磁盘时,文件系统尚未存在,多以grub是直接访问硬盘的分区,所以这个分区被当做根。 .img是一个镜像文件,在展开后可以作为磁盘使用,这些文件被称为镜像文件,或者本地回环设别,initrd文件一定要与内核的版本号时刻保持一致。 xshell可以在windows下打开linux下的图形界面,结合xmanage,gimp类似于ps的工具。修改图片的宽为640.高为480,14位色,选择文件扩展名的类型的xpm格式,并保存,压缩后放入/boot/grub目录下,修改图片的地址和名称即可。 给自己讲linux 2017-02-01 评论 1642 次浏览