1、man 和 info
2、关机:who查看谁在线上;nestat -a 查看网络的联机状态;ps -aux查看背景执行的程序;sync 将数据同步写入硬盘中;
3、文档
十元组,如drwxrwxr--
第一个为文档类型:
- 正规文档:纯文字、二进制、数据文件。前面二者可以用cat读取文件内容,后者只能使用last查看文件内容
d 目录
l 类似window下的快捷方式
b 设备档,即硬盘
c 串行设备,如键盘、鼠标等
s 资料接口文档,通常被用在网络上的数据承接。更多请查阅 man socket
p 数据传输文件,目的在于解决多个程序同时存取一个档案所造成的错误问题。更多请查阅man fifo
后面九个分别为拥有者、所属群组、其他人的权限
权限分为r(读取)w(写入,对于目录来说为可控制)x(可执行,对于目录来说为可进入)
4、档案和目录
搜寻:
which 查找执行档案,且参数为完整档名
whereis 搜索数据库 可能找到已经被杀掉的档案,找不到刚刚新建的档案
locate 搜索数据库 参数为档案的部分名称。可能找到已经被杀掉的档案,找不到刚刚新建的档案
find 搜索硬盘
5、档案的压缩与打包
压缩
compress -d uncompress
gzip -d
bzip2 -z -d bunzip2
打包
tar
tar -cvf 打包,不压缩
tar -zcvf 打包后,以gzip压缩
tar -jcvf 打包后,以bzip2压缩
tar -ztvf 查看tar file内的档案
tar -zxvf 解压缩
备份
dd
dd if="input_file" of="output_file" bs="block_size" count="number"
if:就是input_file,可以是装置
of:就是output_file,可以是装置
bs:规划的一个block大小,默认为512bytes
count:多少个bs的意思
cpio
6、文字处理器vi
7、shell,bash
1、type 查看命令是否为bash内建的命令
2、环境变量
3、查看环境变量 echo $PATH 、echo ${PATH}
4、设定变量 name="$PATH"111
5、变量在其子程序中仍然有效 export name
6、引用其他命令行结果`command`,eg:myname="$MAIL"`ll /tmp`asjdljsk echo $myname
7、取消变量内容 unset name
8、特殊字符需要用双引号或者单引号,双引号中可以使用已经存在的变量,单引号中变量为一般字符,eg:"$PATH" 和 '$PATH'
9、特殊字符也可以用转义字符\进行转义
10、环境变量 env 或者 export
11、shell变量,即和当前的PID相关联 set
PS1,后面是数字1,提示字符的设定
\d 日期
\H 主机全称
\h 主机名称的第一个名字
\t 时间,24小时制,HH.MM.SS
\T 时间,12小时制
\A 时间,24小时制,HH:MM
\u 当前用户
\v BASH版本
\w 完整的工作目录
\W basename,最后一个目录名
\# 下达的第几个命令
\$ 提示字符,root为#,其他$
$ 本shell的PID
? 上个指令的回传码,上个指令执行成功,则回传码为0
OSTYPE,HOSTTYPE,MACHTYPE 主机硬件与核心的等级
自定变量转为环境变量 export
语系命令 locale
修订编码 LANG 或者 LC_ALL
12、read 读取来自键盘的输入,通常放在shell scripts中,以跟使用者进行交谈
declare/typeset 他们是一样的功能,声明变量的属性。
declare -a 数组
-i 整数
-x 将后面的变量变成环境变量
-r 将变量设定为readonly,不能被更改内容,也不可以unset
13、与档案系统及程序的限制关系:ulimit
如果linux主机同时登录10个人,同时开启100个文档,每个档案100MBytes,那么内容得10*100*100MBytes,为了预防这种情况
可以限制使用者的某些资源,包括可以开启的档案数、可以使用的CPU时间,可以使用的内存等。
ulimit
-H hard limit,严格的设定,必定不可以超过的设定值
-S soft limit,警告的设定,可以超过,但是会有警告,而且必定不可以超过hard limit
-a 列出所有的额度
-c 可以建立的最大核心档案容量
-d 程序数据可以使用的最大容量
-f 此shell可以建立的最大档案容量(一般为2GB),单位为Kb
-l 可用于锁定(lock)的内容存量
-p 可用于管线(pipe)处理的数量
-t 可以使用的最大CPU时间,单位为秒
-u 单一使用者可以使用的最大程序(process)数量
14、额外的变量设定功能
取变量的用法,echo $HOME 和 echo ${HOME}
${变量}的方法,我们可以对变量进行一些修订,eg:name="/home/vbird/testing/testing.x.sh"
echo ${name}
echo ${name##/*/}
echo ${name#/*/}
echo ${name%%/*}
echo ${name%/*}
echo ${name/testing/TEST}
echo ${name//testing/TEST}
##后面/*/表示从前面开始匹配的字符串中,取最长的那段,#为取最短的那段
%%后面/*表示从后面开始匹配的字符串中,区最长的那段,#为取最短的那段
//后面testing从前开始被替换为TEST,替换所有,/替换第一个
15、变量内容可以进行判断,var和str,要针对str是否被设置为一个字符串,即"expr",来决定var的内容
var=${str-expr}
var=${str:-expr}
var=${str+expr}
var=${str:+expr}
var=${str=expr}
var=${str:=expr}
var=${str?expr}
var=${str:?expr}
16、变量别名和历史
alias ls='ls -al | more'
unalias ls
history
-n 列出最近n个命令列表
-c 将目前shell中的所有history内容全部清除
-a histfiles 将目前新增的history指令新增入histfiles中,若没有加histfiles,则预设写入~/.bash_history
-r histfiles 将histfiles的内容读到当前shell的history中
-r histfiles 将目前的history记忆内容写入到histfiles中
!n 执行第几笔命令
!command 由最近的指令向前搜寻指令串开头为command的那个指令,并执行
!!执行上一个命令
17、登录提示信息,设置在/etc/issue, /etc/motd为想要让大家都知道的信息 /etc/issue.net为talnet远程登录用的
18、环境设定档: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source
系统设定值
/etc/sysconfig/i18n
/etc/profile 档案设定了几个重要的变量,例如:『PATH、USER、MAIL、 HOSTNAME、HISTSIZE、umask』等等
所有的使用者皆会使用到这个档案的信息
/etc/bashrc 规划 umask 的功能,也同时规划出提示字符的内容 (就是里头那个 PS1 啦!)
/etc/profile.d/*.sh 颜色、语系、vim 及 which 等指令进行一些额外的设定
/etc/man.config 规范了使用 man 的时候, man page 的路径到哪里去寻找! MANPATH 这个变量设定
设定完了这几个档案之后,都需要先 logout 在 login 之后才会将设定整个启动起来!
个人设定值
~/.bash_profile, ~/.bash_login, ~/.profile 这三个档案通常只要一个就够了,一般预设是以 ~/.bash_profile
的檔名存在。bash 启动时,会先去读取 ~/.bash_profile,找不到时,就去读取 ~/.bash_login ,然后才是 ~/.profile
~/.bashrc 档案在您每次执行 shell script 的时候都会被重新使用一遍
~/.bash_history
~/.bash_logout 当我注销 bash 后,系统再帮我做完什么动作后才离开
读取先后
1. 先读取 /etc/profile ,再根据 /etc/profile 的内容去读取其它额外的设定档, 例如
/etc/profile.d 与 /etc/inputrc 等等设定档;
2. 根据不同的使用者,到使用者家目录去读取 ~/.bash_profile 或 ~/.bash_login 或 ~/.profile
等设定档;
3. 根据不同使用者,到他家目录去读取 ~/.bashrc
source 或小数点 (.) 都可以将设定档的内容读进来目前的 shell 环境中!eg: source ~/.bashrc or . ~/.bashrc
login 与 non-login shell
当登入Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile
non-login shell ,读取的就是仅有 ~/.bashrc
终端机的环境设定: stty, set
stty -a
^ 代表Ctrl
stty erase ^h 设定[ctrl+h]删除字符
set 也可以进行环境的设定
其它的按键设定功能就在 /etc/inputrc
19、数据流重导向
将某个指令执行后应该要出现在屏幕上的数据, 给他传输到其它的地方
> >> 1> 2>
>和1>一个意思
1> 正确信息的流向
2> 错误信息的流向
>>写在文档的后面
find /home -name testing > list_right 1> list_error
find /home -name testing > list 2>&1 正确消息和错误消息写在同一个档案中
dev/null 垃圾桶
< 将原本需要由键盘输入的数据,经由档案来读入
cat > catfile 通过键盘输入数据到 catfile中 (Ctrl + d)结束
使用其它档案来取代键盘输入,cat > catfile < somefile
<<结束的输入字符
eg:cat > catfile <<eof
行首输入eof则代表结束,和(Ctrl + d) 效果一样
20、管线命令 (pipe)
数据必需要经过几道手续之后才能得到我们所想要的格式,管线命令『 | 』仅能处理经由前面一个指令传来的正确信息
撷取命令: cut, grep
将一段数据经过分析后,取出我们所想要的,撷取讯息通常是针对『一行一行』来分析的
echo $PATH | cut -d ':' -f 5
export | cut -c 12- 将 export 输出的讯息,取得第 12 字符以后的所有字符串
grep
参数:
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
排序命令: sort, wc, uniq
[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(预设是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,预设是 tab 键;
-k :以那个区间 (field) 来进行排序的意思,
eg:cat /etc/passwd | sort -t ':' -k 3 /etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序
排序完成了,想要将重复的资料仅列出一个显示
[root@linux ~]# uniq [-ic] 类似数据库的group by
参数:
-i :忽略大小写字符的不同;
-c :进行计数
[root@linux ~]# wc [-lwm]
参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
tee
同时将数据流分送到档案去与屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个指令继续处理
[root@linux ~]# tee [-a] file
参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!
eg:last | tee last.list | cut -d " " -f1
字符转换命令: tr, col, join, paste, expand
tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换
[root@linux ~]# tr [-ds] SET1 ...
参数:
-d :删除讯息当中的 SET1 这个字符串;
-s :取代掉重复的字符!
范例一:将 last 输出的讯息中,所有的小写变成大写字符:
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
col
[root@linux ~]# col [-x]
参数:
-x :将 tab 键转换成对等的空格键
join:两个档案当中,有 "相同数据" 的那一行,将他加在一起
[root@linux ~]# join [-ti12] file1 file2
参数:
-t :join 预设以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思;
-2 :代表『第二个档案要用那个字段来分析』的意思。
paste 将两行贴在一起,且中间以 [tab] 键隔开
[root@linux ~]# paste [-d] file1 file2
参数:
-d :后面可以接分隔字符。预设是以 [tab] 来分隔的!
- :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。
expand
[root@linux ~]# expand [-t] file
参数:
-t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。
我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
分割命令: split
[root@linux ~]# split [-bl] file PREFIX
参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割。
参数代换: xargs
[root@linux ~]# xargs [-0epn] command
参数:
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数
可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,
就会停止继续工作!
-p :在执行每个指令的 argument 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。看范例三。
当 xargs 后面没有接任何的指令时,预设是以 echo 来进行输出喔!
减号 - 的用途
管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin
某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代
eg:tar -cvf - /home | tar -xvf -
21、正则表达式
22、扩展的正则表达式
23、格式化打印: printf
[root@linux ~]# printf '打印格式' 实际内容
参数:
关于格式方面的几个特殊样式:
\a 警告声音输出
\b 退格键(backspace)
\f 清除屏幕 (form feed)
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [tab] 按键
\v 垂直的 [tabl] 按键
\xNN NN 为两位数的数字,可以转换数字成为字符。
关于 C 程序语言内,常见的变数格式
%ns 那个 n 是数字, s 代表 string ,亦即多少个字符;
%ni 那个 n 是数字, i 代表 integer ,亦即多少整数字数;
%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数,
假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
24、sed
可以分析 Standard Input (STDIN) 的数据, 然后将数据经过处理后,再将他输出到 standrad out (STDOUT) 的一个工具
[root@linux ~]# sed [-nefr] [动作]
参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN
的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过
sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的
sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配
正规表示法!例如 1,20s/old/new/g 就是啦!
范例一:将 /etc/passwd 的内容列出,并且我需要打印行号,同时,请将第 2~5 行删除!
[root@linux ~]# nl /etc/passwd | sed '2,5d'
25、awk :倾向于一行当中分成数个『字段』来处理
[root@linux ~]# awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename
[root@linux ~]# last | awk '{print $1 "\t" $3}'
dmtsai 192.168.1.12
root Mon
reboot boot
dmtsai 192.168.1.12
整个 awk 的处理流程是
1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
2. 依据 " 条件类型" 的限制,判断是否需要进行后面的 " 动作";
3. 做完所有的动作与条件类型;
4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
awk 内建变量
变量名称 代表意义
NF 每一行 ($0) 拥有的字段总数
NR 目前 awk 所处理的是『第几行』数据
FS 目前的分隔字符,预设是空格键
26、档案比对 diff cmp patch
diff:iff 主要是以『行』为单位比对
[root@linux ~]# diff [-bBi] from-file to-file
参数:
from-file :一个档名,作为原始比对档案的档名;
to-file :一个档名,作为目的比对档案的档名;
注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。
-b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about me" 视为相同
-B :忽略空白行的差异。
-i :忽略大小写的不同。
范例:
范例一:比对 /tmp/test/passwd 与 /etc/passwd 的差异:
[root@linux ~]# diff /etc/passwd /tmp/test/passwd
4d3 <==这里是说,左边档案(/etc/passwd)第四行被删除 (d)
cmp :以『位』为单位去比对
[root@linux ~]# cmp [-s] file1 file2
参数:
-s :将所有的不同点的位处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。
范例:
范例一:用 cmp 比较一下 /etc/passwd 与 /tmp/test/passwd
[root@linux ~]# cmp /etc/passwd /tmp/test/passwd
patch:将旧的档案升级成为新的档案
[root@linux ~]# patch -pN < patch_file
参数:
-p :后面可以接『取消几层目录』的意思。
27、档案打印准备: pr
8、学习 Shell Scripts
利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字文件,将一些 shell 的语法与指令写在里面,
搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的
第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称:
在每个 script 的文件头处记录好
• script 的功能;
• script 的版本信息;
• script 的作者与联络方式;
• script 的版权宣告方式;
• script 的 History (历史纪录);
• script 内较特殊的指令,使用绝对路径的方式来下达;
• script 运作时需要的环境变量预先宣告与设定。
read - p "sdkjajfs" var
var=$((运算内容)) 数值运算
test 参数 filename 判断filename类型、权限、比较、整数的判断、字符串、多重条件判断等
[] 判断符号 eg [ -z "$HOME" ] $HOME 是否为空
• 在中括号 [] 内的每个组件都需要有空格键来分隔;
• 在中括号内的变量,最好都以双引号来设定;
• 在中括号内的常数,最好都以单或双引号来设定。
shell script 帮我们设定好一些指定的变量了
/path/to/scriptname opt1 opt2 opt3 opt4 ...
$0 $1 $2 $3 $4 ...
条件判断
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
case $变量名称 in
"第一个变量内容")
程序段
;;
"第二个变量内容")
程序段
;;
*)
不包含第一个变量内容与第二个变量内容的其它程序执行段
exit 1
;;
esac
函数
function fname() {
程序段
}
function 也是拥有内建变量的~他的内建变量与 shell script 很类似, 函数名称代表示 $0 ,
而后续接的变量也是以 $1, $2... 来取代的
循环
while [ condition ]
do
程序段落
done
until [ condition ]
do
程序段落
done
for (( 初始值; 限制值; 执行步阶 ))
do
程序段
done
debug
[root@linux ~]# sh [-nvx] scripts.sh
参数:
-n :不要执行 script,仅查询语法的问题;
-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
-x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!
9、Linux 账号与身份管理
/etc/passwd
账号名称:密码:UID::GID:使用者信息说明栏:家目录:Shell
/etc/shadow
账号名称:密码(才是真正的密码,而且是 经过编码过的密码啦):最近更动密码的日期:
密码不可被更动的天数:密码需要重新变更的天数:密码需要变更期限前的警告期限:
密码过期的恕限时间:账号失效日期:保留字段
UID 与 GID
使用者ID User ID
群组ID Group ID
群组
/etc/group
群组名称:群组密码:GID:支持的账号名称
GID 就是所谓的『初始群组
/etc/gshadow
群组名称:密码栏:群组管理员的账号:该群组的所属账号
groups 支持群组,第一个就是有效群组
newgrp 群组 更改有效群组
10、Linux 磁盘配额 (Quota)
quota 实际在运作的时候,是针对『整个 partition』进行限制的
核心必须支持 quota
只对一般身份使用者有效
• soft:
这是最低限制容量的意思,使用者在宽限期间之内,他的容量可以超过 soft ,但必需要宽限时
间之内将磁盘容量降低到 soft 的容量限制之下!
• hard:
这是『绝对不能超过』的容量!跟 soft 相比的意思为何呢?通常 hard limit 会比 soft limit为高,例如网络磁盘空间为 30 MB ,
那么 hard limit 就设定为 30MB ,但是为了让使用者有一定的警戒心,所以当使用空间超过 25 MB 时,例如使用者使用了 27 MB 的空间时,那么系统就
会警告使用者, 让使用者可以在『宽限时间内』将他的档案量降低至 25 MB ( 亦即是 soft limit )之内!也就是说, soft 到 hard 之间的容量其实就是
宽限的容量啦!可以达到针对使用者的『警示』作用!
• 宽限时间:
那么宽限时间就可以很清楚的知道含意是什么了!也就是当您的使用者使用的空间超过了 soft limit ,却还没有到达 hard limit 时,那么在这个
『宽限时间』之内, 就必需要请使用者将使用的磁盘容量降低到 soft limit 之下!而当使用者将磁盘容量使用情况超过 soft limit 时,『宽限时间』
就会自动被启动,而在使用者将容量降低到 soft limit 之下,那么宽限时间就会自动的取消啰!
/etc/mtab
当我们要使用 quota 的功能时,我们的 filesystem 必须要已经支持 quota 的旗标,般来说,我们是以编辑 /etc/fstab 后,再重新挂载 filesystem
的方法来让系统的 filesystem 支持 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@linux ~]# quotacheck [-avug] [/mount_point]
参数:
-a :扫瞄所有在 /etc/mtab 内,含有 quota 支持的 filesystem,加上此参数后,
/mount_point 可不必写,因为扫瞄所有的 filesystem 了嘛!
-u :针对使用者扫瞄档案与目录的使用情况,会建立 aquota.user
-g :针对群组扫瞄档案与目录的使用情况,会建立 aquota.group
-v :显示扫瞄过程的信息;
-M :『强制』进行 quotacheck 的扫瞄。
=============================================================================================
Linux 也特别强调 quota 在使用的时候,需要特别注意在 reboot 时,得先将 quota 关闭才好
=============================================================================================
[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 』!
=============================================================================================
[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 喔!
=============================================================================================
[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
11、例行性命令的建立
一次性的使用at,atq,atrm,batch
循环性的使用crontab,cron
系统的例行性任务 编辑 /etc/crontab 持两种下达指令的方式,一种是直接下达指令, 一种则是以目录来规划
• 指令型态
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令。
• 目录规划
*/5 * * * * root run-parts /root/runcron
建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行档』都写到该目录下, 就可
以让系统每五分钟执行一次该目录下的所有可执行档。
12、程序与资源管理
工作管理 (job control): &, [ctrl]-z, jobs, fg, bg, kill
指令后面 加上 & 就是表示,指令在后台执行
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
如果我正在使用 vi ,却发现我有个档案不知道放在哪里,需要到 bash 环境下去搜寻,此时只要暂时将 vi 给他丢到背景当中等待即可
观察目前的背景工作状态: jobs
将背景工作拿到前景来处理:fg
让工作在背景下进行: bg
管理背景当中的工作: kill
程序的观察
ps
top
pstree
• 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:该程序的实际指令为何?
系统资源观察
free
uname
uptime
netstat
dmesg
sar
nice 调整程序优先级
renice 调整的是已经存在的某个 process
查询已开启档案或已执行程序开启之档案
fuser
lsof
pidof
13、开机关机流程与 Loader
开机流程
1. 加载 BIOS 的硬件信息,并取得第一个开机装置的代号;
2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的开机信息;
3. 加载 Kernel 操作系统核心信息, Kernel 开始解压缩,并且尝试驱动所有硬件装置;
4. Kernel 执行 init 程序并取得 run-level 信息;
5. init 执行 /etc/rc.d/rc.sysinit 档案;
6. 启动核心的外挂模块 (/etc/modprobe.conf);
7. init 执行 run-level 的各个批次档( Scripts );
8. init 执行 /etc/rc.d/rc.local 档案;
9. 执行 /bin/login 程序,并等待使用者登入;
10. 登入之后开始以 Shell 控管主机。
第一支程序 init 及设定文件 /etc/inittab 与 runlevel
Run level 之变换: init 3
init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)
/etc/sysconfig
启动系统服务与相关启动设定档 (/etc/rc.d/rc.n & /etc/sysconfig)
S 为开头的档案,为开机时,需要『启动, start』的服务
K 为开头的档案,为『关机时需要关闭的服务, stop』的档案连结
使用者自订开机启动程序 (/etc/rc.d/rc.local)
关于模块: /etc/modprobe.conf
/etc/sysconfig/*
核心与核心模块
• 核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
• 核心解压缩所需 RAM Disk: /boot/initrd (/boot/initrd-version);
• 核心模块: /lib/modules/version/kernel 或 /lib/modules/`uname -r`/kernel;
• 核心原始码: /usr/src/linux (要安装才会有!否则预设不安装的!)
如果我有个新的硬件,偏偏我的操作系统不支持,该怎么办?
• 重新编译核心,并加入最新的硬件驱动程序原始码;
• 将该硬件的驱动程序编译成为模块,在开机时加载该模块
核心模块与相依性
核心的放置处是在 /lib/modules/`uname -r`/kernel
depmod
核心模块的观察: lsmod, modinfo
modinfo 查阅每个模块的信息
核心模块的加载与移除: insmod, modprobe, rmmod
核心模块的额外参数设定: /etc/modprobe.conf
MBR / Super block / boot loader 之间的相关性,怎么切换都可能啊
/boot/grub/menu.lst 设定档
利用 chroot 切换到另一颗硬盘工作
14、原始码与 Tarball 套件管理员
原始码就是通常的源代码
原始码通过编译、连接则生成可执行文件,也就是linux的运行文件
tarball就是将原始码打包(未压缩)而得到的
一般程序升级有两种方式,
第一种就是下载原始码,通过编译连接得到可执行文件,然后替换掉低版本的可执行文件,比如 make
第二种就是下载程序厂商在和你本机环境一样的情况下生成的可执行文件,然后直接替换掉即可,比如通常使用的rpm、apt等
=============================================================================================
由于我们的原始码档案有时并非仅只有一个档案, 所以我们无法直接进行编译。这个时候就需要先产生目标文件,然后再以连结制作成为 binary 可执行档
=============================================================================================
库函数
gcc sin.c -lm -L/lib -L/usr/lib
# -l :是『加入某个函式库(library)』的意思,而
# m :则是 libm.so 这个函式库,其中, lib 与附档名(.a 或 .so)不需要写
# 所以 -lm 表示使用 libm.so (或 libm.a) 这个函式库的意思~
# 至于那个 -L 后面接的路径呢?这表示:
#『我要的函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻!』
#-I/path 后面接的路径( Path )就是设定要去搜寻相关的 include 档案的目录啦
=============================================================================================
为什么要用 make
假设我的执行档里面包含了四个原始码档案,分别是 main.c haha.c sin_value.c cos_value.c 这四个档案
那么我们需要gcc4次,生成*.o文件,最后进行连接,比较繁琐,下面使用make,创建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
# 注意:第二行的 gcc 之前是 <tab> 按键产生的空格喔!
然后直接调用make即可,而且如果某些.c文件修改了,make会只更新修改的文件
=============================================================================================
通常的安装步骤
./configure
make clean
make
make install
=============================================================================================
动态链接库和静态链接库
=============================================================================================
15、RPM 与 SRPM 套件管理员
rp-pppoe - 3.1 - 5 .i386 .rpm
套件名称 套件的版本信息 释出的次数 适合的硬件平台 附文件名
=============================================================================================
rpm命令
=============================================================================================
srpm就是带有源码的rpm,和rpm相比较,就是要多一步编译的过程,及编译之后变成rpm档案,然后安装
=============================================================================================
16、认识系统服务 daemons
daemons:在背景当中执行的程序
service:主机提供的功能
=============================================================================================
daemon 的主要分类
stand_alone:独立的启动。常驻在内存当中。放置在 /etc/init.d/ 这个目录里面
super daemon: 这一种服务的启动方式则是藉由统一的一个 daemon 来负责唤起该服务。在 /etc/init.d/xinetd 这个 scripts 里面
针对这种 super daemon 的处理模式有两种,
multi-threaded:
single-threaded:
=============================================================================================
与服务有关的端口口对应资料: /etc/services
=============================================================================================
chkconfig
ntsysv
=============================================================================================
17、认识与分析登录档
登录档
• /var/log/secure:
记录登入系统存取数据的档案,例如 pop3, ssh, telnet, ftp 等都会记录在此档案中;
• /var/log/wtmp:
记录登入者的讯息数据,由于本档案已经被编码过,所以必须使用 last 这个指令来取出档案的内容;
• /var/log/messages:
这个档案相当的重要,几乎系统发生的错误讯息(或者是重要的信息)都会记录在这个档案中;
• /var/log/boot.log:
记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息;
• /var/log/maillog 或 /var/log/mail/*:
纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录;
• /var/log/cron:
这个是用来记录 crontab 这个例行性服务的内容的!
• /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
分别是几个不同的网络服务的记录文件啦!
基本上,检查 /var/log/messages、/var/log/secure 这些个档案也就相当够了
=============================================================================================
log档案的服务
• syslogd:
进行系统或者是网络服务的登录文件记录工作;
• logrotate:
将旧的数据更名,并且建立新的登录档, 以保持登录档的『新鲜』,并视设定将最旧的登录档删除。
=============================================================================================
登录档的设定档:/etc/syslog.conf
=============================================================================================
lsattr 与 chattr 为日志档保驾护航
=============================================================================================
logrotate 登录档的轮询,其设定档为/etc/logrotate.conf /etc/logrotate.d/
=============================================================================================
18、X server
=============================================================================================
19、Linux 硬件侦测与维护
• hdparm:观察硬盘的种种信息;
• lspci:检查整个系统 PCI 接口的各项装置!很有用的指令;
• dmesg:观察核心运作过程当中所显示的各项讯息记录;
• iostat:检查整个 CPU 与接口设备的 Input/Output 状态。
使用 lm_sensors 取得温度、电压等信息
=============================================================================================
特殊的 filesystem: LVM
什么是 LVM: PV, PE, VG, LV
• Physical Volume, 简称 PV:
这个就是实体磁盘啦!我们必须要将原本的磁盘,例如 /dev/hda5, /dev/hda6 等等的
partition ,利用 fdisk 等软件,将他们的 ID 改为 LVM (8e) ,并且修改磁盘的相关信息, 让
他成为 LVM 可以使用的磁盘才行。什么是 ID 啊?还记得使用 fdisk -l 看到的数据吧? ID 83
是 Linux 的 partition , 82 则是 Swap 的代号!这样瞭了吧? 一块磁盘变成 PV 后, LVM 才
能够利用该 partition 喔!重要重要!
• Volume Group, 简称 VG:
其实我们 LVM 主要的目的就是要建立这个 VG 啦!他主要就是将刚刚的一个或多个 PV 组合成为
一个大磁盘~这个大磁盘可以作为后续的分割之用喔! 那么这个大磁盘的容量最大可到多大呢?
最大容量的值与底下的 PE 有关, 如果完全使用 LVM 的预设参数时,那么一个最大的 LVM 磁盘
可达到 256 GBytes。
• Physical Extend, 简称 PE:
在建立 VG 的时候,我们同时需要指定 PE 这个数值!如果不指定的话,他预设是 4MB 的大小。
当 PE 为 4MB 时, VG 最大的容量就是 256 GBytes 啦!那么这个 PE 是什么玩意儿?? 我们
在 磁盘档案系统 那个章节当中提到的 inode, block 与 filesystem 大小的相关性当中, 有提
到在 ext2/ext3 档案系统的格式化过程中,不同的 block 大小将会影响到整个 filesystem 大
小的支持度。那这个 PE 其实就有点像是 VG 的 block 啦! 所以他的大小将会影响到 VG 的最
大值喔!如果你想要让你的 VG 大于预设的 256 GB 时, 记得要修改这个数值!(其实,一个 VG
最大可以容许 65534 个 PE , 所以,修改 PE 值,当然就会影响到最大的 VG 容量啦! )
• Logical Volume, 简称 LV:
这个 LV 就是最后被挂载到档案系统的 partition 啰~这个 LV 是由 VG 分割来的啦~ 他会建
立一个装置代号,例如 /dev/vgname/lvname 在您的系统当中啊!
=============================================================================================
PV指令
• pvcreate :将实体 partition 建立成为 PV ;
• pvscan :搜寻目前系统里面任何具有 PV 的磁盘;
• pvdisplay :显示出目前系统上面的 PV 状态;
• pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
• partprobe :这个指令可以让核心立刻读入最新的 partition table 而不必 reboot。
=============================================================================================
VG指令
• vgcreate :就是主要建立 VG 的指令啦!他的参数比较多,等一下介绍。
• vgscan :搜寻系统上面是否有 VG 存在?
• vgdisplay :显示目前系统上面的 VG 状态;
• vgextend :在 VG 内增加额外的 PV ;
• vgreduce :在 VG 内移除 PV;
• vgchange :设定 VG 是否启动 (active);
• vgremove :删除一个 VG 啊!
=============================================================================================
LV指令
• lvcreate :建立 LV 啦!
• lvscan :查询系统上面的 LV ;
• lvdisplay :显示系统上面的 LV 状态啊!
• lvextend :在 LV 里面增加容量!
• lvreduce :在 LV 里面减少容量;
• lvremove :删除一个 LV !
• lvresize :对 LV 进行容量大小的调整!
=============================================================================================
让原有的 LVM 磁盘加大的方法: resize2fs
=============================================================================================
20、
核心的版本: uname -r
[主版本].[次版本].[释出版本(release)]-[修改版本]
[次版本]是奇数:测试性质功能的核心版本
[次版本]是偶数: 稳定核心版本
=============================================================================================
下载原始码
设定Makefile
• make menuconfig:
利用类似选单模式的方式来进行核心参数的挑选,好处是,他是纯文字模式的! 不需要启动 X
Window ,还可以远程登入进行核心参数的挑选!真方便!
• make xconfig:
利用 X Window 的功能来进行挑选,是图形接口的,很华丽~不过,当然就比较耗系统资源。 如
果你的服务器没有安装 X Window ,那就别提了!
• make gconfig:
利用 GDK 函式库的图形接口来选择,也是需要 X Window 的支持才行!
编译核心
[root@linux linux-2.6.14.2]# make clean
# 将以前曾经进行过的 *.o 档案删除掉,这样比较不会产生新旧版本的误差!
[root@linux linux-2.6.14.2]# make bzImage
# 制作出核心档案!这个重要!过程很长啊!而且那个是大写的 I 喔!
[root@linux linux-2.6.14.2]# make modules
# 制作出模块相关的档案!
同一版本的核心编译两次,请将 /lib/modules 里面的该版核心先移动掉
安装
[root@linux linux-2.6.14.2]# make modules_install
1. 移动新核心到 /boot 里面去:
[root@linux ~]# cp /usr/src/linux-2.6.14.2/arch/i386/boot/bzImage \
> /boot/vmlinuz-2.6.14-2
# 就一般的习惯而言,鸟哥建议您将核心档名设定成以 vmlinuz 为首的名称,
# 比较容易管理啦!
[root@linux ~]# cp /usr/src/linux-2.6.14.2/System.map \
> /boot/System.map-2.6.14-2
2. 修改 grub 设定档
[root@linux ~]# vi /boot/grub/menu.lst
default=0
=============================================================================================
核心模块管理
核心模块管理: lsmod, modinfo, modprobe, insmod, rmmod...
==================================================================