Oct 13 FRI
20.1 Linux 的启动流程分析
系统启动的经过可以汇整成底下的流程的:
1. 加载 BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;
2. 读取并运行第一个启动装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
3. 依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
4. 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 信息;
5. init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络、时区等);
6. init 运行 run-level 的各个服务之启动 (script 方式);
- in /etc/rc.d/rc N
& /etc/sysconfig
- 我们可以ll /etc/rc5.d/
,可以看到最后一个被执行的选项是S99local,就是/etc/rc.d/rc.local (见下一步)
7. 用户自定义开机启动程序:init 运行 /etc/rc.d/rc.local 文件;
- 这个文件可以执行用户自己想要执行的系统命令。所以,如果有任何想要在启动时就进行的工作是,直接将它写入/etc/rc.d/rc.local,那么该工作就会在启动的时候自动被加载
8. init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦;
20.1.3 第一个进程init及配置文件/etc/inittab与runlevel
基本上,依据有无网络与有无 X Window 而将 run level 分为 7 个等级,分别是:
0 - halt (系统直接关机)
1 - single user mode (单人维护模式,用在系统出问题时的维护)
2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
3 - Full multi-user mode (完整含有网络功能的纯文字模式)
4 - unused (系统保留功能)
5 - X11 (与 runlevel 3 类似,但加载使用 X Window)
6 - reboot (重新启动)
/etc/inittab的内容与语法
这里的id:3:initdefault: 就是默认的run level设置。此run level为3.
这个文件的语法是利用冒号“:”将设置分隔成为四个字段,每个字段意义如下:
[设置选项]:[run level]:[init的操作行为]:[命令选项]
- 设置选项: 最多四个字符,代表init的主要工作选项
- run level:该选项在哪些run level下面进行。如果是35则代表runlevel 3/5 都会执行
- init的操作行为
20.1.9 Run level的切换
1. 通过修改/etc/inittab内的设置选项(里面的数字)
2. 如果只是想暂时更改系统的run level时,则使用 init [0-6]
来进行run level的更改,但下次重新启动时,依旧会是以/etc/inittab的设置为准。 可以用runlevel
查看当前run level。当执行runlevel切换的时候,只是加载的服务不同而已,所以会对比切换前后两个run level的服务,关闭不需要的服务,启动需要的新服务。
20.4.5 利用chroot切换到另一块磁盘工作
如果有两三个linux系统在同一个主机上面,假设第一个linux系统无法进入了,那么我可以换到第二个linux启动,然后再第二个linux系统下将第一个linux挂载起来,最后用chroot切换回第一个linux系统。
22.1.1 什么是开放源码、编译程序与可执行文件
如何判断一个文件是否为二进制呢?
# 先以系统的文件测试看看:
[root@www ~]# file /bin/
/bin/ : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/
Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
# 如果是系统提供的 /etc/init.d/syslog 呢?
[root@www ~]# file /etc/init.d/syslog
/etc/init.d/syslog: Bourne-Again shell script text executable
如果是 binary 而且是可以运行的时候,他就会显示运行档类别 (ELF 32-bit LSB executable), 同时会说明是否使用动态函式库 (shared libs),而如果是一般的 script ,那他就会显示出 text executables 之类的字样!
22.1.4 什么是Tarball的软件
Tarball 是一个软件包,将它解压缩之后,里面的文件通常就会有:
- 源代码文件
- 检测程序文件(可能是configure或config等文件名)
- 本软件的建议说明与安装说明(INSTALL或README)
22.2.3 调用外部函数库:加入链接的函数库
编译时加入额外函数库链接的方式:
gcc sin.c -lm -L/lib -L/usr/lib
./a.out <--尝试执行新文件
-lm 是有意义的:-l 表示加入某个函数库(library)的意思。m:则是libm.so这个函数库,其中, lib与扩展名(.a 或 .so) 不需要写。
-L :后面接的路径表示要找的函数库libm.so要到/lib或/usr/lib里面搜索。
# 仅将原始码编译成为目标档,并不制作连结等功能:
[root@www ~]# gcc -c hello.c
# 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档。
# 在编译的时候,依据作业环境给予最佳化运行速度
[root@www ~]# gcc -O hello.c -c
# 会自动的产生 hello.o 这个文件,并且进行最佳化喔!
# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
[root@www ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
# 这个命令较常下达在最终连结成 binary file 的时候,
# -lm 指的是 libm.so 或 libm.a 这个函式库文件;
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
# -I 后面接的是原始码内的 include 文件之所在目录。
# 将编译的结果输出成某个特定档名
[root@www ~]# gcc -o hello hello.c
# -o 后面接的是要输出的 binary file 档名
# 在编译的时候,输出较多的信息说明
[root@www ~]# gcc -o hello hello.c -Wall
# 加入 -Wall 之后,程序的编译会变的较为严谨一点,
# 所以警告信息也会显示出来!
22.3 用make进行宏编译
22.3.2 makefile的基本语法与变量
目标(target) : 目标文件1 目标文件2
[TAB] gcc -o 欲新建的可执行文件 目标文件1 目标文件2
make clean main
:
# 1. 先编辑 makefile 来创建新的守则,此守则的标的名称为 clean :
[root@www ~]# vi makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2. 以新的标的 (clean) 测试看看运行 make 的结果:
[root@www ~]# make clean <==就是这里!透过 make 以 clean 为标的
rm -rf main main.o haha.o sin_value.o cos_value.o
变量的使用:
[root@www ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
与 shell script 的语法有点不太相同,变量的基本语法为:
变量与变量内容以『=』隔开,同时两边可以具有空格;
变量左边不可以有 [tab] ,例如上面范例的第一行 LIBS 左边不可以是 [tab];
变量与变量内容在『=』两边不能具有『:』;
在习惯上,变量最好是以『大写字母』为主;
运用变量时,以 ${变量} 或 $(变量) 使用;
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
在命令列模式也可以给予变量。
- $@ : 代表目前的目标(target)
比如可以改成:gcc -o $@ ${OBJS} ${LIBS}
22.5.2 ldconfig与/etc/ld.so.conf
如果我们将常用到的动态函数库先加载到内存当中(缓存, cache),如此一来,当软件要使用动态函数库时, 就不需要从头由硬盘里面读出,可以以增进动态函数库的读取速度。
方法:
1. 在/etc/ld.so.conf里面写下想要读入告诉缓存当中的动态函数库所在的目录(文件夹)
2. 利用idconfig这个可执行文件将/etc/ld.so.conf的数据读入缓存当中
3. 同时也将数据记录一份在/etc/ld.so.cache这个文件中
ldconfig [-f conf] [-C cache]
ldconfig [-p]
#参数
#-f conf :那个 conf 指的是某个文件名称,也就是说,使用 conf 作为 libarary 函式库的取得路径,而不以 /etc/ld.so.conf 为默认值
#-C cache:那个 cache 指的是某个文件名称,也就是说,使用 cache 作为缓存缓存的函式库数据,而不以 /etc/ld.so.cache 为默认值
#-p :列出目前有的所有函式库数据内容 (在 /etc/ld.so.cache 内的数据!)
eg. 假设我的MYSQL数据库在/usr/lib/mysql中,如何读进cache?
vi /etc/ld.so.conf
添加一行: /usr/lib/mysql
然后输入ldconfig
再列出看看ldconfig -p
22.5.3 程序的动态函数库解析:ldd
如何判断某个可执行的二进制文件含有什么动态函数库呢?
ldd [-vdr] [filename]
# -v: 列出所有内容信息
# -d: 重新将数据有丢失的link点显示出来
# -r: 将ELF有关的错误内容显示出来
eg. 找出/usr/bin/passwd这个文件的函数库数据
ldd /usr/bin/passwd
22.6 检验软件正确性
md5sum [filename]
**在windows cmd 里查看某链接的DNS服务器IP地址:
nslookup www.baidu.com
Linux 14
###23.2.1 RPM安装install
rpm -ivh package_name
参数
- -i: install的意思
- -v: 查看更详细的安装信息画面
- -h: 以安装信息栏显示安装进度
eg:
rpm -ivh rp-pppoe-3.5-32.1.i386.rpm
rpm -ivh http://xxxxxxxxxxxxxxxx
用网络安装也是可以的
23.2.3 RPM升级与更新
参数
-Uvh : 后面接的软件如果没有安装过,则系统直接安装;如果有安装过旧版,则自动更新至新版
-Fvh:后面接的软件如果没有安装过,则不会安装,如果有安装过,则会被升级
23.2.4 查询 query
rpm -qa
—查询已安装软件
[root@www ~]# rpm -qa <==已安装软件
[root@www ~]# rpm -q[licdR] 已安装的软件名称 <==已安装软件
[root@www ~]# rpm -qf 存在於系统上面的某个档名 <==已安装软件
[root@www ~]# rpm -qp[licdR] 未安装的某个文件名称 <==查阅RPM文件
选项与参数:
查询已安装软件的资讯:
-q :仅查询,后面接的软件名称是否有安装;
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
-qi :列出该软件的详细资讯 (information),包含开发商、版本与说明等;
-ql :列出该软件所有的文件与目录所在完整档名 (list);
-qc :列出该软件的所有配置档 (找出在 /etc/ 底下的档名而已)
-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
-qf :由后面接的文件名称,找出该文件属於哪一个已安装的软件;
查询某个 RPM 文件内含有的资讯:
-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在於找出
某个 RPM 文件内的资讯,而非已安装的软件资讯!注意!
*如果想知道我的系统中以c开头的软件有几个,需要:rpm -qa | grep ^c | wc -l
*如果想知道httpd所有的设置文件放置在何处,可以:rpm -qc httpd
YUM
YUM: yellow dog Update Modified。 YUM是改进版的RPM软件管理器,YUM很好地解决了RPM所面临的软件包依赖问题。YUM可以从很多源中搜索软件以及他们的依赖包,并自动安装相应的依赖软件。使用YUM安装软件时至少需要一个YUM源(如HTTP, FTP或本地文件夹的方式访问YUM源)
yum list (pam*) #列出yum服务器上面提供的所有软件名称
yum search raid #搜索磁盘阵列(raid)相关的软件有哪些(根据关键字)
yum info mdadm #找出mdadm这个软件的功能是什么
yum list updates #列出目前服务器上可供本机进行升级的软件有哪些
yum install|update name #安装和升级功能
yum remove name #删除功能
yum clean [packages|headers|all] #将已下载的软件文件/软件文件头/所有数据删除
yum provides passwd #列出提供passwd这个文件的软件有哪些
YUM使用技巧
1 创建YUM源
- 安装createrepo
- 将所有的软件包保存在某个目录下,如/mysoft/
运行
createrepo /mysoft
即可25.2.1 备份
完整备份的增量备份(incremental backup)
- 完整备份A和第一次的B比较,得出增量备份1号;B和第二次的C比较,得出增量备份2号;C和第三次的D比较,得出增量备份3号…
- 完整备份的差异备份(differential backup)
- 差异备份指的是:每次的备份都是与原始的完整备份比较的结果。所以系统运行越久,离完整备份时间越长,那么差异备份的数据可能会越大。