`

Linux读书笔记三

 
阅读更多
1.  磁盘配额 ( Quota )
 
quota 要使用的指令基本上分为两种,一种是查询功能 ( quota, quotacheck, quotastats, warnquota, repquota ),另一种则是编辑 quota 的内容 ( edquota, setquota ) 。

【quota】
[root@linux ~]# quota [-uvsl] [username]
[root@linux ~]# quota [-gvsl] [groupname]
参数:
-u :后面可以接 username ,表示显示出该使用者的 quota 限制值。若不接 username
,表示显示出执行者的 quota 限制值。
-g :后面可接 groupname ,表示显示出该群组的 quota 限制值。
-v :显示每个 filesystem 的 quota 值;
-s :可选择以 inode 或磁盘容量的限制值来显示;
-l :仅显示出目前本机上面的 filesystem 的 quota 值。
范例:
范例一:秀出目前 root 自己的 quota 限制值:
[root@linux ~]# quota -guvs

【quotacheck】
[root@linux ~]# quotacheck [-avug] [/mount_point]
参数:
-a :扫瞄所有在 /etc/mtab 内,含有 quota 支持的 filesystem,加上此参数后,
/mount_point 可不必写,因为扫瞄所有的 filesystem 了嘛!
-u :针对使用者扫瞄档案与目录的使用情况,会建立 aquota.user
-g :针对群组扫瞄档案与目录的使用情况,会建立 aquota.group
-v :显示扫瞄过程的信息;
-M :『强制』进行 quotacheck 的扫瞄。
范例一:将所有的在 /etc/mtab 内,含有 quota 支持的 partition 进行扫瞄
[root@linux ~]# quotacheck -avug


【edquota】
[root@linux ~]# edquota [-u username] [-g groupname]
[root@linux ~]# edquota -t <==修改恕限时间
[root@linux ~]# edquota -p username_demo -u username
参数:
-u :后面接账号名称。可以进入 quota 的编辑画面 (vi) 去设定 username 的限制值;
-g :后面接群组名称。可以进入 quota 的编辑画面 (vi) 去设定 groupname 的限制值;
-t :可以修改恕限时间 (就是超过 quota 的 soft limit 值后,还能使用硬盘的宽限期限)
-p :复制范本。那个 username_demo 为已经存在并且已设定好 quota 的使用者,
意义为『将 username_demo 这个人的 quota 限制值复制给 username 』!

【quotaon】
[root@linux ~]# quotaon [-avug]
[root@linux ~]# quotaon [-vug] [/mount_point]
参数:
-u :针对使用者启动 quota (aquota.user)
-g :针对群组启动 quota (aquota.group)
-v :显示启动过程的相关讯息;
-a :根据 /etc/mtab 内的 filesystem 设定启动有关的 quota ,若不加 -a 的话,
则后面就需要加上特定的那个 filesystem 喔!
范例:
范例一:启动所有的具有 quota 的 filesystem
[root@linux ~]# quotaon -auvg
/dev/hdb1 [/disk2]: group quotas turned on
/dev/hdb1 [/disk2]: user quotas turned on

【quotaoff】
[root@linux ~]# quotaoff [-a]
[root@linux ~]# quotaoff [-ug] [/mount_point]
参数:
-a :全部的 filesystem 的 quota 都关闭 (根据 /etc/mtab)
-u :仅针对后面接的那个 /mount_point 关闭 user quota
-g :仅针对后面接的那个 /mount_point 关闭 group quota
 
 
Linux 工作排程的种类: at, cron
• at : 这个工作仅执行一次就从 Linux 系统中的排程中取消;
• cron : 这个工作将持续例行性的作下去!

【at】
[root@linux ~]# at [-m] TIME
参数:
-m :当 at 的工作完成后,以 email 的方式通知使用者该工作已完成。
TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
HH:MM YYYY-MM-DD ex> 04:00 2005-12-03
强制规定在某年某月的某一天的特殊时刻进行该工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm December 3
也是一样,强制在某年某月某日的某时刻进行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。

范例一:再过五分钟后,将 /root/.bashrc 寄给 dmtsai 这个使用者
[root@linux ~]# at now + 5 minutes
at> /bin/mail dmtsai -s "testing at job" < /root/.bashrc
at> <EOT> <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样!代表结束!
job 8 at 2005-09-07 10:47
# 上面这行信息在说明,第 8 个 at 工作将在 2005/09/07 的 10:47 进行!
 
查询at 工作排程
[root@linux ~]# atq
[root@linux ~]# atrm [jobnumber]
范例一:查询目前主机上面有多少的 at 工作排程?
[root@linux ~]# atq
10 2005-09-15 23:00 a root
# 上面说的是:『在 2005/09/15 的 23:00 有一项工作,该项工作指令下达者为
# root』而且,该项工作的工作号码 (jobnumber) 为 10 号喔!

移除工作:atrm
范例二:将上述的第 10 个工作移除!
[root@linux ~]# atrm 10
 
 
【例行性命令设定crontab】
[root@linux ~]# crontab [-u username] [-l|-e|-r]
参数:
-u :只有 root 才能进行这个任务,亦即帮其它使用者建立/移除 crontab;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除 crontab 的工作内容

范例一:用 dmtsai 在每天的 12:00 发信给自己
[dmtsai@linux ~]$ crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
0 12 * * * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc
#分 时 日 月 周 |<==============指令串========================>|
 
每项工作的格式都是『 五个时间参数 实际动作指令 』,那么那五个时间参数代表什么呢?
代表意义
分钟
小时
日期
月份
数字范围
0-59
0-23
1-31
1-12
0-7(当周为 0 或 7 时,都代表『星期天』的意思)
  
特殊字符
代表意义
*
代表任何时刻都接受的意思!举例来说,上表的范例一,那个日、月、周都是 * , 就代表着『不论何月、何日的礼拜几的 12:00 都执行后续指令』的意思!
,
代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:
0 3,6 * * * command
还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!
-
代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:
20 8-12 * * * command
仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!
/n
那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:
*/5 * * * * command
很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!
  
系统的例行性任务设定  /etc/crontab
 
基本上, /etc/crontab 这个档案里面支持两种下达指令的方式,一种是直接下达指令, 一种则是以目录来规划,例如:
指令型态 01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt 以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令。
• 目录规划 */5 * * * * root run-parts /root/runcron 建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行档』都写到该目录下, 就可以让系统每五分钟执行一次该目录下的所有可执行档。
【工作管理 (job control)】: &, [ctrl]-z, jobs, fg, bg, kill
 
直接将指令丢到背景中『执行』的 &
[root@linux ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 24874 <== [job number] PID
输入一个指令后,在该指令的最后面加上一个『 & 』代表将该指令丢到背景中, 此时 bash 会给予这个指令一个『工作号码(job number)』,就是那个 [1] 啦! 至于后面那个 24874 则是该指令所触发的『 PID 』了! 而且,有趣的是,我们可以继续操作 bash 呢
 
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
[root@linux ~]# vi ~/.bashrc
# 在 vi 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped /usr/bin/vim ~/.bashrc
[root@linux ~]# <==顺利取得了前景的操控权!

观察目前的背景工作状态: jobs
[root@linux ~]# jobs [-lrs]
参数:
-l :除了列出 job number 之外,同时列出 PID
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@linux ~]# jobs -l
[1]+ 24988 Stopped /usr/bin/vim ~/.bashrc
[2]- 25006 Stopped /usr/bin/vim ~/.bash_history
 
将背景工作拿到前景来处理:fg
[root@linux ~]# fg %jobnumber
参数:
%jobnumber :工作的号码。注意,那个 % 是可有可无的!
范例:
[root@linux ~]# fg <==预设取出那个 + 的工作,亦即 [1]
[root@linux ~]# fg %2 <==直接规定取出的那个工作号码!

让工作在背景下进行: bg
[root@linux ~]# bg %jobnumber
 
管理背景当中的工作: kill
[root@linux ~]# kill -signal %jobnumber
[root@linux ~]# kill -l
参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的设定档 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
范例:
[root@linux ~]# kill -SIGTERM %1
[1]+ 终止 vim bashrc
# -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!
 
 
程序的观察ps, top, pstree
【ps】
[root@linux ~]# ps aux
[root@linux ~]# ps -lA
[root@linux ~]# ps axjf
参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
特别说明:
由于 ps 能够支持的 OS 类型相当的多,所以他的参数多的离谱!
而且有没有加上 - 差很多!详细的用法应该要参考 man ps 喔!

范例一:将目前属于您自己这次登入的 PID 与相关信息列示出来
[root@linux ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su
4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash
4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps

范例二:列出目前所有的正在内存当中的程序:
[root@linux ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]
root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0]
各个显示项目代表的意义为:
• USER:该 process 属于那个使用者账号的?
• PID :该 process 的号码。
• %CPU:该 process 使用掉的 CPU 资源百分比;
• %MEM:该 process 所占用的物理内存百分比;
• VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
• RSS :该 process 占用的固定的内存量 (Kbytes)
• TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
• STAT:该程序目前的状态,主要的状态有:
o R :该程序目前正在运作,或者是可被运作;
o S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号 (signal) 唤醒。
o T :该程序目前正在侦测或者是停止了;
o Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
• START:该 process 被触发启动的时间;
• TIME :该 process 实际使用 CPU 运作的时间。
• COMMAND:该程序的实际指令为何?

范例四:列出类似程序树的程序显示:
[root@linux ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 0 0 ? -1 S 0 0:01 init [3]
1 2 0 0 ? -1 SN 0 0:00 [ksoftirqd/0]
.....中间省略.....
1 5281 5281 5281 ? -1 Ss 0 0:00 /usr/sbin/sshd
5281 5651 5651 5651 ? -1 Ss 0 0:00 \_ sshd: dmtsai [priv]
5651 5653 5651 5651 ? -1 S 500 0:00 \_ sshd: dmtsai@pts/0
 
范例五:找出与 cron 与 syslog 这两个服务有关的 PID 号码?
[root@linux ~]# ps aux | egrep '(cron|syslog)'
root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0
root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond
root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog)
# 所以号码是 1539 及 1676 这两个啰!就是这样找的啦!


【top 监控程序动态】
top 这个程序可以持续的监测 (monitor) 整个系统的程序工作状态
[root@linux ~]# top [-d] | top [-bnp]
参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为档案。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。

范例一:每两秒钟更新一次 top ,观察整体信息:
[root@linux ~]# top -d 2
范例二:将 top 的信息进行 2 次,然后将结果输出到 /tmp/top.txt
[root@linux ~]# top -b -n 2 > /tmp/top.txt
范例三:假设 10604 是一个已经存在的 PID ,仅观察该程序?
[root@linux ~]# top -d 2 -p10604
 
top 底下的画面,则是每个 process 使用的资源情况。比较需要注意的是:
• PID :每个 process 的 ID 啦!
• USER:该 process 所属的使用者;
• PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;
• NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
• %CPU:CPU 的使用率;
• %MEM:内存的使用率;
• TIME+:CPU 使用时间的累加;
 
【pstree】
[root@linux ~]# pstree [-Aup]
参数:
-A :各程序树之间的连接以 ASCII 字符来连接;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。

范例一:列出目前系统上面所有的程序树的相关性:
[root@linux ~]# pstree -A
init-+-atd
|-crond
|-dhclient
|-dovecot-+-dovecot-auth
| `-3*[pop3-login]
|-events/0
|-2*[gconfd-2]


【程序的删除】
要给予某个已经存在的工作某些动作时,是直接给予一个讯号 (signal) 给该 PID 即可。 常见的工作可以使用 kill -l (L 的小写) 来查阅!而主要的讯号代号与名称对应及内容是:
代号
名称
内容
1
SIGHUP
代表『让该 PID 重新读取自己的设定档』 ,类似重新启动
2
SIGINT
代表用键盘输入的 [ctrl]-c 来中断一个程序的进行。
9
SIGKILL
代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim会有 .filename.swp 保留下来。
15
SIGTERM
以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
  
kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)
 
 
【killall】 将系统当中所有以某个指令名称启动的程序全部删除
[root@linux ~]# killall [-iIe] [command name]
参数:
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给使用者;
-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令
不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。

范例二:强制终止所有以 httpd 启动的程序
[root@linux ~]# killall -9 httpd
 
 
系统资源的观察
【free】
[root@linux ~]# free [-b|-k|-m|-g] [-t]
参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
k(Kbytes), 及 g(Gbytes) 来显示单位喔!
-t :在输出的最终结果,显示物理内存与 swap 的总量。

范例一:显示目前系统的内存容量
[root@linux ~]# free -m
total used free shared buffers cached
Mem: 376 366 10 0 129 94
-/+ buffers/cache: 141 235
Swap: 996 0 995
Mem 那一行显示的是物理内存的量, Swap 则是虚拟内存的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量。 后面的 shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及快取的量。

【uname】
[root@linux ~]# uname [-asrmpi]
参数:
-a :所有系统相关的信息;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称
-p :CPU 的类型
-i :硬件的平台 (ix86)

范例一:输出系统的基本信息
[root@linux ~]# uname -a
Linux linux.site 2.6.12-1.1398_FC4 #1 Fri Jul 15 00:52:32 EDT 2005 i686 i686 i386 GNU/Linux


【uptime】
显示出目前系统已经开机多久的时间,以及 1, 5, 15 分钟的平均负载,这个 uptime 可以显示出 top 画面的最上面一行
[root@linux ~]# uptime
18:06:30 up 52 days, 6:40, 1 user, load average: 0.00, 0.00, 0.00
# 上面表示,目前是 18:06 ,本系统已经开机 52 天又 6:40 ,有 1 个使用者在在线,
# 平均负载很低,所以都是 0 啊!
 
【netstat】
常被用在网络的监控方面
[root@linux ~]# netstat -[atunlp]
参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不已程序的服务名称,以端口号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的程序 PID

范例二:找出目前系统上已在监听的网络联机及其 PID
[root@linux ~]# netstat -tulnp

【dmesg】
开机的时候你会发现有很多的讯息出现吧,例如 CPU 的形式、硬盘、 光盘型号及硬盘分割表等等,也可以使用dmesg查看
范例一:输出所有的核心开机时的信息,因为讯息实在太多了,所以可以加入这个管线指令『 | more 』来使画面暂停
[root@linux ~]# dmesg | more
 
【关于程序的执行顺序】
使用 ps 还观察优先执行序,那个 PRI 就是 Priority 的简写,而 NI 是 nice 的简写,这两个东西是凑在一起才产生目前的 PRI 值的! PRI 越小时,代表该程序可以具有『越早被优先执行』的意思
PRI(new) = PRI(old) + nice
一般使用者的 nice 值为 0 ~ 19 ;
• root 可用的 nice 值为 -20 ~ 19 ;
• 一般使用者仅可将 nice 值越调越高,如果本来 nice 为 5 ,则未来仅能调整到大于 5 的 nice ;
• 一般使用者仅能调整属于自己的程序的 nice 值。

如何给予某个程序 nice 值呢?有两种方式,分别是:
• 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
• 调整某个已经存在的 PID 的 nice 值:用 renice 指令。

nice
[root@linux ~]# nice [-n] command
参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。

范例一:用 root 给一个 nice 植为 -5 ,用于执行 vi ,并观察该程序!
[root@linux ~]# nice -n -5 vi &

renice
[root@linux ~]# renice [number] PID
参数:
PID :某个程序的 ID 啊!

范例一:以上面 nice 范例中 ps -l 的结果,将 18852 那个 PID 修改 nice 为 10
[root@linux ~]# renice 10 18852
18852: old priority 0, new priority 10
 
 
【什么是 Tarball 的套件】
所谓的 Tarball 档案,其实就是将套件的所有原始码档案先以 tar 打包,然后再以压缩技术来压缩,通常最常见的就是以 gzip 来压缩了。因为利用了 tar 与 gzip 的功能,所以 tarball 档案一般的附档名就会写成 *.tar.gz 或者是简写为 *.tgz 啰,也就是说, Tarball 套件解压缩之后,里面的档案通常就会有:
• 原始程序代码档案;
• 侦测程序档案( 可能是 configure 或 config 等檔名 );
• 本套件的简易说明与安装说明( INSTALL 或 README )。
 
一个套件的 Tarball 是如何安装的呢?基本流程是这样的啦:
1. 将 Tarball 由厂商的网页下载下来;
2. 将 Tarball 解开,产生很多的原始码档案;
3. 开始以 gcc 进行原始码的编译( 会产生目标文件 object files );
4. 然后以 gcc 进行函式库、主、子程序的连结,以形成主要的 binary file;
5. 将上述的 binary file 以及相关的设定文件安装至自己的主机上面。
 
【gcc的使用】
gcc 为 Linux 上面最标准的编译器
开始将原始码编译成为可执行的 binary file :
[root@linux ~]# gcc hello.c
# 这个时候,在本目录下会产生一个名为 a.out 的执行档!
# 在预设的状态下,如果我们直接以 gcc 编译原始码,并且没有加上
# 任何参数,则 执行档的档名会被自动设定为 a.out 这个文件名称!

# 仅将原始码编译成为目标文件,并不制作连结等功能:
[root@linux ~]# gcc -c hello.c
# 会自动的产生 hello.o 这个档案,但是并不会产生 binary 执行档。

# 在编译的时候,依据作业环境给予最佳化执行速度
[root@linux ~]# gcc -O hello.c -c
# 会自动的产生 hello.o 这个档案,并且进行最佳化喔!

# 在进行 binary file 制作时,将连结的函式库与相关的路径填入
[root@linux ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
# 这个指令较常下达在最终连结成 binary file 的时候,
# -lm 指的是 libm.so 或 libm.a 这个函式库档案;
# -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
# -I 后面接的是原始码内的 include 档案之所在目录。

# 将编译的结果输出成某个特定档名
[root@linux ~]# gcc -o hello hello.c
# -o 后面接的是要输出的 binary file 檔名
 
【make 的简易用法】
make 的功能是可以简化编译过程里面所下达的指令, 同时还具有很多很方便的功能!
make 的基本语法与变量
make 的运行需要makefile 这个档案,makefile 规则是这样的:
标的(target): 目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2

那个标的(target)就是我们想要建立的信息,而目标文件就是具有相关性的 object files ,那建立执行文件的语法就是以 <tab> 按键开头的那一行!

• 在 makefile 当中的 # 代表批注;
• <tab> 需要在命令行的第一个字符;
• 标的(target)与相依档案(就是目标文件)之间需以『:』隔开。

makefile 当中变量的基本语法为:
1. 变量与变量内容以『=』隔开,同时两边可以具有空格;
2. 变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
3. 变量与变量内容在『=』两边不能具有『:』;
4. 在习惯上,变数最好是以『大写字母』为主;
5. 运用变量时,以 ${变量} 或 $(变量) 使用;
6. 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!
7. 在指令列模式也可以给予变量。
8. $@:代表目前的标的(target)
 
用『变量』来更简化 makefile
[root@linux ~]# 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}
 
大部分的 tarball 软件安装的指令下达方式:
1.  ./configure, 这个步骤就是在建立 Makefile 这个档案啰!通常程序开发者会写一支 scripts 来检查您的 Linux 系统、相关的套件属性等等. 例如[root@linux ntp*]# ./configure --prefix=/usr/local/ntp,# --prefix 后面接的路径就是『这个软件未来要安装到那个目录去?』
2.  make clean, make 会读取 Makefile 中关于 clean 的工作。这个步骤不一定会有,但是希望执行一下!它会将目标文件( object file )清除掉。
3.  make, make 会依据 Makefile 当中的预设工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被执行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的执行档!
4. make install, 通常这就是最后的安装步骤了,make 会依据 Makefile 这个档案里面关于 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中, 就完成安装啦!
 
 
静态函式库:
•附檔名: 这类的函式库通常附档名为 libxxx.a 的类型;
•编译行为: 这一类型的函式库在被使用到程序当中的时候,都是整个函式库的所有数据被整合到执行文件当中, 也就是说,当我们在进行编译的动作时,这个函式库会被加入到执行档内,所以 利用静态函式库编译成的档案会比较大一些喔
•独立执行的状态: 这类函式库最大的优点,就是编译成功的可执行档 可以独立执行,而不需要再向外部要求读取函式库的内容( 请参照动态函式库的说明 )。

动态函式库:
附檔名: 这类函式库通常附档名为 libxxx.so 的类型;
• 编译行为: 动态函式库与静态函式库的编译行为差异挺大的, 静态函式库是整个被编译到执行文件当中,但是动态函式库在编译的时候,在程序里面只有一个『 指向( Pointer )』 的位置而已。
• 独立执行的状态: 这类型的函式库不能被独立执行, 因为当我们使用到函式库的机制时,程序会去读取函式库。

在目前的 Linux distribution 当中,我们比较倾向于使用动态函式库, 因为如同上面提到的最重要的一点,就是函式库的升级方便!
 
【ldd】
何判断某个可执行的 binary 档案含有什么动态函式库
[root@linux ~]# ldd [-vdr] [filename]
参数:
-v :列出所有内容信息;
-d :重新将资料有遗失的 link 点秀出来!
-r :将 ELF 有关的错误内容秀出来!
范例一:找出 /usr/bin/passwd 这个档案的函式库数据
[root@linux ~]# ldd /usr/bin/passwd
 
 
【md5sum】
[root@linux ~]# md5sum [-bct] filename
[root@linux ~]# md5sum [--status|--warn] --check filename
参数:
-b :使用 binary 的读档方式,预设为 Windows/DOS 档案型态的读取方式;
-c :检验 md5sum 档案指纹;
-t :以文字型态来读取 md5sum 的档案指纹。
[root@linux ~]# md5sum grep-2.5.1-7.8.i386.rpm
5a0c3fcfcd4c3f937644b8cd71a0cf89 grep-2.5.1-7.8.i386.rpm

【RPM】
RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程序。缺点是安装的时候一定需要当初安装时的主机环境才能安装。

【SRPM】
Source RPM 的意思,也就是这个 RPM 档案里面含有原始码( Source Code )哩!特别注意的是,这个 SRPM 所提供的套件内容『并没有经过编译』,他提供的是原始码喔!通常 SRPM 的附檔名是以 ***.src.rpm 这种格式来命名的。SRPM 既然是原始码的格式,自然我们就可以透过修改 SRPM 内的参数设定档,然后重新编译产生能适合我们 Linux 环境的 RPM 档案,如此一来,就可以将该套件安装到我们的系统当中了。
 
RPM 与 SRPM 的格式,分别为:
xxxxxxxxx.rpm <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
xxxxx.src.rpm <==SRPM的格式,包含未编译的原始码信息。

如 rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:
rp-pppoe - 3.1 - 5 .i386 .rpm
套件名称 套件的版本信息 释出版本的次数 适合的硬件平台 附文件名
 
RPM 预设安装的路径
RPM 类型的档案安装完毕之后, rpm 就会将套件的信息写入:/var/lib/rpm 这个目录中去!
RPM 类型的套件所拥有的档案都放置在系统预设放置的目录底下:
/etc 一些设定文件放置的目录,例如 /etc/crontab
/usr/bin 一些可执行档案
/usr/lib 一些程序使用的动态函式库
/usr/share/doc 一些基本的软件使用手册与说明文件
/usr/share/man 一些 man page 档案
 
【RPM 安装( install )】
[root@linux ~]# rpm -ivh package_name
参数:
-i :install 的意思
-v :察看更细部的安装信息画面
-h :以安装信息列显示安装进度
范例一:安装 rp-pppoe-3.1-5.i386.rpm
[root@linux ~]# rpm -ivh rp-pppoe-3.1-5.i386.rpm
Preparing... ####################################### [100%]
1:rp-pppoe ####################################### [100%]
范例三、直接由网络上面的某个档案安装,以网址来安装:
[root@linux ~]# rpm -ivh http://website.name/path/pkgname.rpm

【RPM 升级与更新】
-Uvh  后面接的套件即使没有安装过,则系统将予以直接安装; 若后面接的套件有安装过旧版,则系统自动更新至新版;
-Fvh  如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;亦即只有安装至您 Linux 系统内的套件会被『升级』!

【RPM 查询】
[root@linux ~]# rpm
参数:
在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!
查询主要分为两部分,一个是查已安装,另一个则是查某个 rpm 档案内容。
查询已安装套件的信息:
-q :仅查询,后面接的套件名称是否有安装;
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有套件名称;
-qi :列出该套件的详细信息 (information),包含开发商、版本与说明等;
-ql :列出该套件所有的档案与目录所在完整文件名 (list);
-qc :列出该套件的所有设定档 (找出在 /etc/ 底下的檔名而已)
-qd :列出该套件的所有说明档 (找出与 man 有关的档案而已)
-qR :列出与该套件有关的相依套件所含的档案 (Required 的意思)
-qf :由后面接的文件名称,找出该档案属于哪一个已安装的套件;
查询某个 RPM 档案内含有的信息:
-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在于找出
某个 RPM 档案内的信息,而非已安装的套件信息!注意!

范例一:找出你的 Linux 是否有安装 logrotate 这个套件?
[root@linux ~]# rpm -q logrotate
logrotate-3.7.1-10
范例二:列出上题当中,该套件的所有目录与档案:
[root@linux ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
......以下省略......
# 可以看出该套件到底提供了多少的档案与目录。
 
 
【RPM 验证与数位签章】
[root@linux ~]# rpm
参数:
-V :后面加的是套件名称,若该套件所含的档案被更动过,才会列出来;
-Va :列出目前系统上面所有可能被更动过的档案;
-Vp :后面加的是文件名称,列出该套件内可能被更动过的档案;
-Vf :列出某个档案是否被更动过~
范例一:列出你的 Linux 内的 logrotate 这个套件是否被更动过?
[root@linux ~]# rpm -V logrotate
# 如果没有出现任何讯息,恭喜你,该套件没有被更动过。

【RPM 卸载与重建数据库】
[root@linux ~]# rpm -e logrotate <==卸载 logrotate 套件
[root@linux ~]# rpm --rebuilddb <==重建数据库

【SRPM 的使用】
安装 SRPM 档案rpmbuild
参数主要有底下两个:
--rebuild
这个参数会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的档案,但是产生的 RPM 档案并没有安装到系统上。当您使用 --rebuild 的时候,最后通常会发现一行字体: Wrote: /usr/src/RPM/RPMS/i386/pkgname.i386.rpm
这个就是编译完成的 RPM 档案啰!那么这个档案就可以用来安装啦!安装的时候请加绝对路径来安装即可!
--recompile
这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!
 
【SRPM 的编译指令】
[root@linux ~]# rpmbuild -bb rp-pppoe.spec <==编译成RPM档案
[root@linux ~]# rpmbuild -ba rp-pppoe.spec <==打包成SRPM档案
 
【daemon】
daemon 就是一支可以在系统背景下面运作的程序 (program)

daemon 的启动方式: service
[root@linux ~]# service [service name] (start|stop|restart|...)
参数:
service name:亦即是需要启动的服务名称,需与 /etc/init.d/ 对应;
start|... :亦即是该服务要进行的工作。
范例一:重新启动 crond 这支 daemon :
[root@linux ~]# service crond restart
[root@linux ~]# /etc/init.d/crond restart
 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics