1
. 安装 Linux 所需要知道的基本知识
现在 Linux 发行版本的 CDROM 基本上都具备光盘启动的功能, 这意味这只需要购
买光盘(或者从网上下载后自己刻录), 然后把光盘插入光驱, 重新启动系统, 就可
以依照安装程序的提示一步步进行安装了. 但在安装之前, 最好还是先学习一下有
关 Linux 安装的基本知识.
在 Linux 环境下, PC 系统的 IDE 设备被标示为
/
dev
/
hda,
/
dev
/
hdb,
/
dev
/
hdc,
/
dev
/
hdd 这四个设备文件;详细说,就是 IDE
0
通道上的主设备是
/
dev
/
hda, 从
设备是
/
dev
/
hdb, IDE
1
通道的主设备是
/
dev
/
hdc, 从设备是
/
dev
/
hdd.
以硬盘
/
dev
/
hda 为例, IDE 硬盘最多可以创建
4
个物理分区, 物理分区所对应的
设备文件分别为
/
dev
/
hda1,
/
dev
/
hda2,
/
dev
/
hda3,
/
dev
/
hda4. IDE 硬盘还可以
把一个物理分区(且只能有一个)设置成扩展分区, 然后在扩展分区上创建逻辑分区,
逻辑分区所对应的设备文件为
/
dev
/
hda5,
/
dev
/
hda6, …
可以被操作系统使用的分区只能是非扩展分区的物理分区, 或者是逻辑分区. Linux
安装至少需要两个硬盘分区, 可以使用磁盘管理软件事先划分出来, 也可以在安装
过程中由安装程序创建新的分区.
分区必须被格式化成文件系统后才能被操作系统使用, 通常 Linux 所使用的文件系
统类型为 EXT2; 除了 Linux 所要安装的分区, Linux 还需要一个交换分区(swap)
才能更好的运行(类似于 MS 的交换文件的概念), 推荐交换分区的大小是物理内存
的1
~
2倍, 如果系统的内存容量超大, 交换分区也可以设置得比物理内存小. Linux
在安装过程中, 会提供给用户格式化文件系统的操作界面.
不同于 MS 操作系统中的 C:, D: 盘符, UNIX 使用的是挂接点(mount point)组织
文件系统. 系统至少需要一个根文件系统(
/
), 其他文件系统被挂接在根文件系统下
的任意一级目录节点上. 举个例子, 在系统中新添加一块硬盘 hdb, 硬盘上已经格
式化好了两个分区 hdb1 hdb2 可供 Linux 使用, 用户可以在
/
目录下创建
/
a 目
录, 把
/
dev
/
hdb1 设备挂接到
/
a 目录下, 然后可以在
/
a 目录下创建
/
a
/
b 目录,
再把
/
dev
/
hdb2 设备挂接到
/
a
/
b 目录下, 用户就可以在各自分区所对应的目录下
作文件操作了.
安装 Linux, 必须指定一个分区被挂接为根文件系统(
/
).
Linux 缺省创建管理员账号 root, 使用 root 账号可以取得对操作系统的完全控制,
安装 Linux 的过程中会要求设定 root 的口令, 有的 Linux 发行版本的安装过程
中还会建议创建一个使用者账号供管理员日常使用.
显然系统管理员应该具备修改使用者口令的权限, 但是他又不应该能察看使用者口
令, 因此 Linux 系统的用户口令文件是以密文形式存储的, 密文的加密方式是一种
简单的 DES 加密, 最新的 Linux 发行版本都支持把口令文件以 MD5 方式加密, 以
获得更高强度的口令保护.
Linux 发行版本已经附带了很多软件包, 用户可以在安装过程中选择安装哪些包,
由于一般一个发行版本至少包括数百个软件包, 安装程序会把软件包分为若干个类
别以供选择, 一般来说网络开发人员需要选择和网络(Networking or Internet),
开发(Development)这两个类别, 如果希望使用图形化的操作界面, 可以选择 X
Windows(或者 GNOME, KDE)类别.
Linux 使用操作系统引导程序最终启动操作系统, 引导程序通常安装在硬盘的主引
导纪录(MBR)上, 系统启动后, BIOS 把控制权交给 MBR 上的引导程序, 引导程序可
以加载 MS 操作系统启动程序, 也可以加载 Linux 操作系统内核, 然后把控制权交
给所选择的操作系统运行. 常见的 Linux 引导程序为 LILO 和 GRUB, gnuchina
的苏哲开发的 SmartBootManager 也是一个相当不错的引导程序.
Linux 安装程序一般还会要求用户创建一张引导软盘以备需要时使用, 安装 Windows
时 MS 也会提出这个要求. 这个步骤好像实在是没有什么意义.
—————————————————————————
-
2
. Linux 编辑器 vi
/
vim
vi 是 UNIX 环境下的通用编辑器, 习惯使用 Notepad 的 Windows 用户最初使用
vi 可能会觉得很不顺手, 或者说很难用, 但是只要稍加练习, 就会发现对于普通的
文本编辑工作, vi 的确是一个使用起来非常舒服的编辑器.
由于 vi 是设计为终端用户使用的, 不要说鼠标和图形界面, 有的终端可能连移动
光标的方向键也没有, 为了照顾终端用户, vi 可以让用户手指始终不离开控制区,
就能完成编辑工作.
可以直接运行 vi , 或者附带文件名为参数运行 vi
vi 的编辑文件一共有三种状态: 命令模式, 编辑模式, 执行模式. 命令模式是 vi
的初始模式, 在此模式下, 任何终端输入(键盘输入), vi 都把之作为 vi 命令来解
释; 命令
/
编辑模式, 以及命令
/
执行模式之间可以切换, 但不能从编辑模式切换到
执行模式, 或者从执行模式切换到编辑模式
对于初学者来说, 最容易犯的错误就是在编辑模式下试图输入命令, 当对着 vi 不
知所措的时候, 多按几下 ESC 回到命令模式, 然后再思考下一步操作
输入”:”(冒号)进入执行模式
:e test.txt 编辑”test.txt”这个文件
:w 将当前编辑文件保存
:w test.txt 将当前编辑文件以文件名”test.txt”保存
:q 退出当前编辑文件
:q
!
不存盘强制退出
:wq 保存当前文件并退出
:
%
s
/
string1
/
string2
/
g 将全篇文章的string1替换为string2
:n1,n2s
/
string1
/
string2
/
g 将第n1行到第n2行的string1替换为string2
在命令模式下输入i, I, a, A, o, O, r, R 进入编辑模式, 在编辑模式下, 任意文
本字符的输入都将被添加到文件中
i 在当前位置插入
I 在当前行首插入
a 在当前位置后插入
A 在当前行尾插入
o 在当前行后另起新行插入
O 在当前行前另起新行插入
r 修改当前字符, 修改一个后返回到命令模式
R 修改当前字符, 直到输入 ESC 后才返回命令模式
在编辑模式下
ctrl
+
h 删除(或反修改)刚刚输入的字符
ctrl
+
w 删除(或反修改)刚刚输入的单词
ctrl
+
u 删除(或反修改)当前行首到当前光标处的内容
在命令模式下所使用的一些最常用的命令如下:
(光标移动命令)
h 向左移动光标
j 向下移动光标
k 向上移动光标
l 向右移动光标
w 向右移动一个单词
b 向左移动一个单词
0
到行首
^
到行首的第一个非空白字符
$ 到行尾
%
到匹配的括号, 包括 () [] {}
nG 到第n行
G 到最后一行
ctrl
+
f 向下翻页
ctrl
+
b 向上翻页
ctrl
+
d 向下翻半页
ctrl
+
u 向上翻半页
(删除命令, 注意删除命令都会把所删除内容存入 vi 维护的一个剪贴板里去)
x 删除当前字符
X 删除前面一字符
d 删除指令, 通过附加光标命令比如h w $ 指定删除范围
dd 删除行
(拷贝命令, 将所选择内容拷贝入 vi 维护的剪贴板)
y 拷贝命令, 类似于 d 删除命令
yy 拷贝当前行
(粘贴命令)
p 在当前光标处粘贴
P 在当前光标前粘贴
(查找命令)
/
querystring 从当前光标处向后查找 querystring
?
querystring 从当前光标处向前查找 querystring
n 继续查找
N 反向继续查找
(其他命令)
J 连接两行
~
大小写替换
. 重复编辑指令
u 撤销上一次指令(标准 vi 只能撤销一步指令操作)
在命令模式下可以通过在命令前输入数字 n 表示重复执行 n 次指令, 例如:
10dd 删除
10
行
20l
向右移动
20
个字符
d40w 删除
40
个单词
当用户开始使用数字重复执行指令的时候, 就应该能体会到 vi 的优秀特性了. 本
文档只是为了给初次接触 vi 的用户提供一个入门的参考, 关于 vi 的更详细的使
用命令介绍, 请查阅其他资料.
在 Linux 系统上可以使用 vi 的一个增强版本 vim. vim 比起 vi 来多了诸如语法
高亮, 多窗口, 程序自动缩进等特性, 对于软件开发来说使用 vim 更为方便了
vim 执行模式
:syntax on 使用语法高亮
:
set
smartindent 程序自动缩进
vim 的多窗口特性通过输入ctrl
+
w后, 再输入一个窗口操作指令完成
ctrl
+
w s 水平分隔窗口
ctrl
+
w v 垂直分隔窗口(vim版本6以后才支持此特性)
ctrl
+
w 附加光标命令 在多个窗口之间切换光标
ctrl
+
w
+
扩大当前水平窗口
ctrl
+
w
-
缩小当前水平窗口
ctrl
+
w
>
扩大当前垂直窗口
ctrl
+
w
以上4条命令也可以通过增加数字重复指令, 比如 ctrl
+
w
20
+
ctrl
+
w
=
平分窗口
ctrl
+
w _ 最大化当前水平窗口
ctrl
+
w
|
最大化当前垂直窗口
执行 :q 或其他退出命令关闭当前窗口
—————————————————————————
-
3
. Linux 基本命令
UNIX 系统所使用的目录分隔符为”
/
”, 和 MS 所使用的”\”不同, 比如系统的用户口
令文件的绝对路径是
/
etc
/
passwd; . 和 .. 如同 MS 环境一样, 表示当前目录和
上级目录(准确的说, 这个特性是 MS 从 UNIX 这样的早期操作系统继承下来的)
Linux 提供了各种命令详细的手册(manual), 通过 man 命令来察看. man 手册分为
9
章, 每章提供了一类帮助:
第
1
章: 可执行程序和 SHELL 命令
第
2
章: 系统调用
第
3
章: 库函数
第
4
章: 特殊的文件(比如
/
dev 目录下文件的说明)
第
5
章: 文件的格式(比如
/
etc
/
passwd)
第
6
章: 游戏
第
7
章: 宏
第
8
章: 系统管理命令
第
9
章: 内核相关
通常来说查阅手册不必关心所查内容属于多少章, 比如查阅 rm 命令的用法, 直接
运行
man rm
但是有的时候各章的索引有重复的, 比如 open 就分别在第
1
章, 第
2
章出现,
printf 在第
1
章, 第
3
章出现, 如果只用 man open 命令, 那么只能得到第
1
章关于 open 的说明, 要想查第
2
章的内容, 必须指定章
man
2
open
也可以查看所有关于 open 的内容:
man
-
a open
对于命令的帮助和函数使用, 不可能有比 manual 更好的资料了, 一定要会利用 man,
同时也确认系统上已经安装了 manpage 软件包.
本文档所提到的所有命令都只是一个简单的介绍, 可以查找 manual 了解各命令更
多的用法. 除了 man, 有的程序还带有一些简单的命令格式说明, 通常使用 –help
或者
-
h 参数就可以看到说明, 比如
ls –help
UNIX 下的文件操作基本命令如下:
mkdir (创建目录)
rmdir (删除一个空目录, 相当于 rm
-
r)
cp (文件拷贝)
rm (删除文件)
mv (文件移动
/
改名)
UNIX 是一个多用户操作系统, 每个文件都有拥有者, 组(user, group)两个权限设
置; 针对拥有者, 组, 其他用户, 又分别有对应的读, 写, 可执行(r, w, x)三个属
性设置; 文件又分为常规文件, 链接文件, 字符设备文件等多种类型.
UNIX 系统执行程序, 并不需要程序文件有 .exe, .com 这样的扩展名, 只需要操作
用户拥有该文件可执行权限即可.
使用 ls 命令浏览目录下文件. 可以输入
ls
-
l
来察看文件的类型, 权限各位, 所属用户, 属组, 最后一次被修改时间. 比如
drwxr
-
xr
-
x
2
nobody root
0
Oct
15
20
:
31
bin
表示 bin 所属用户为 nobody, 所属组为 root; 前面的
10
个字符表示文件的类型
和权限属性, 第
1
个字符说明它是一个目录文件, 后
9
个字符说明它可被所属用
户可读
/
写
/
执行, 可被所属组可读
/
执行, 可被其它用户可读
/
可执行.
使用 chown, chgrp 修改文件的所属用户和属组, 格式为
chown 用户名 文件名
chgrp 组名 文件名
也可以使用 chown 程序同时修改所属用户和属组
用户名.组名 文件名
使用 chmod 修改文件的权限位, 格式为
chmod u
+
x 文件名 (u
+
x 表示增加所属用户的可执行程序)
第一个参数的第一个字符修改所属用户, 属组, 还是其他用户对应的权限(u, g, o)
第二个参数使用
+
,
-
表示增加或减少相应权限
第三个参数表示权限(r, w, x)
chmod 还支持数字格式的参数, 比如
chmod
644
文件名 (
644
表示设置成 rw
-
r–r–,
6
=
110
,
4
=
100
,
4
=
100
)
查看一个文件的信息(也就是把文件内容打印到标准输出来)有如下命令
cat (打印文件到标准输出)
more
/
less (根据终端能力分页显示文件)
head (显示文件的头部)
tail (显示文件的尾部)
wc 可以用来对文本文件计数, 返回文件的行数, 单词数, 字符数
find 命令用于查找文件, 比如列出所有文件
find .
find 的功能十分强大, 这里给出一些常见的用法, 其他还需要实际使用中体会
find .
-
name abc (查找所有文件名为 abc 的文件)
find .
-
size
+
10000k (查找所有大于
10
MB 的文件)
find .
-
name
*
.sh
-
exec chown root {} \;
(把后缀为 .sh 的文件设为 root 所有)
—————————————————————————
-
4
. SHELL
用户并不能直接和操作系统交互, 都是通过一个程序完成使用操作系统的, 这种程
序称之为 SHELL; UNIX 系统中的 SHELL 都是指一种特定的命令行界面, 用户通过
字符终端登录后进入这种界面, 而且 SHELL 都提供了诸如管道操作, 任务调度, 以
及一些简单的脚本编程能力. Linux 提供给用户缺省使用的 SHELL 为 bash, 它支
持命令补齐等更多的特性.
在 bash 中输入 export 或者 env 可以查看 SHELL 的环境变量, 比较重要的环境
变量有: PATH, PWD 等.
查看单独的环境变量可以运行
echo $变量名
比如运行
echo $PATH
可以通过运行
export 变量名
=
变量值
来修改或者新增环境变量. 比如运行
export PATH
=/
usr
/
local
/
bin:
/
bin:
/
usr
/
bin
或者运行
export PATH
=/
usr
/
local
/
bin:$PATH
$PWD 表示当前工作目录, 可以使用 cd 来改变当前工作目录. 用 pwd 查看当前工
作目录.
$PATH 表示程序执行的搜索路径. 注意 UNIX 只在 PATH 环境变量中搜索程序, 而
不搜索当前工作目录; 如果要运行当前目录下的程序 program, 如果当前工作目录
不在 PATH 环境变量中, 那么在 SHELL 中直接输入 program 是无效的, 必须使用
路径名, 比如 .
/
program 这样的相对路径.
SHELL 也都提供管道符 ‘
|
’ 和重定向符 ‘
>
‘, ‘
>>
’, ‘
管道的作用是把前一个程序的标准输出作为后一个程序的标准输入, 比如
find .
|
more
重定向可以把标准文件输出重定向到另外一个文件中, 比如
find .
>
/
tmp
/
find.list
使用重定向后原来程序的标准输出就无法再在屏幕上显示了.
使用 ‘
>
’ 将会覆盖目标文件(如果它已经存在), 使用 ‘
>>
’ 可以追加
cat
/
etc
/
passwd
>
/
tmp
/
file.content
cat
/
etc
/
group
>>
/
tmp
/
file.content
有的程序输出的信息写到了标准错误(文件描述符是
2
), 比如执行
gcc
-
v
>
/
tmp
/
gcc.version
可以看到 gcc
-
v 的输出信息依旧出现在屏幕上, 而
/
tmp
/
gcc.version 内容为空,
使用
2
>&
1
可以把标准错误重定向到标准输出中, 例如
gcc
-
v
>
/
tmp
/
gcc.version
2
>&
1
注意
2
>&
1
一定要放在
>
/
tmp
/
gcc.version 之后
SHELL 支持在一行命令中执行多个程序, 比如
cat
/
etc
/
passwd; cat
/
etc
/
group
这相当于执行完 cat
/
etc
/
passwd 后再跟着执行 cat
/
etc
/
group
如果一个命令跨多行, 使用 \ 表示有续行信息, 比如
cat
/
etc\
/
passwd
SHELL 提供了任务管理的功能, 比如一个 rm 命令可能要很长时间才能执行完, 这
样当前终端 SHELL 就一直被这个命令占用, 可以使用
^
c 将这个进程终止; 或者使
用
^
z 将进程挂起, 然后用 bg 命令把进程放到后台执行, 这个步骤也相当于直接
执行
rm 参数 …
&
使用
&
表示把执行进程放到后台. 使用 jobs 可以查看当前后台进程情况, 使用
fg 可以把后台任务放到前台终端执行
SHELL 提供了一定的编程能力, 通过编写 SHELL 脚本, 用户不用使用高级编程语言
就可以完成很多复杂的工作,以 bash 为例:
expr 可以完成普通的计算工作
expr
12
-
13
expr
12
\
*
13
这里使用 \ 转义, 否则 SHELL 把
*
作为通配符解释
如果把程序的标准输出给变量赋值, 使用 “ 对(注意`是1左边键盘的字符). 比如:
abc
=
`expr
12
+
13
`; echo $abc
SHELL 支持分支判断,
if
表达式
then
…
else
…
fi
表达式可以做字符串的比较,
[ string1 比较符 string2 ]
这里比较符是
==
,
!=
,
>
,
表达式也能做数字的比较,
test arg1 OP arg2
OP 是
-
eq,
-
ne,
-
lt,
-
le,
-
gt,
-
ge 之一, (equal to, no equal to, less than,
less than or equal to, greater than, greater than or equal to)
SHELL 也支持循环, 比如使用
for
循环把
/
tmp 目录下所有文件制作备份:
for
i
in
`ls
/
tmp`
do
echo “Copy backup file
for
$i”
cp
/
tmp
/
$i
/
tmp
/
$i.bak
done
for
循环也可以是类 C 语法的循环, 或者类 C 的
while
循环, 比如循环
100
次:
i
=
0
while
test $i
-
lt
100
do
echo $i
i
=
`expr $i
+
1
`
done
推荐查看 bash 的 manual 以得到最完善的帮助, bash 的 manual 很长, 可以用
man bash
|
col
-
b
>
bash.man
把 manual 重定向到文本文件中仔细阅读
在 bash 中, 类似 vi 中编辑状态, 可以用 ctrl
-
h, ctrl
-
w, ctrl
-
u 来编辑命令
行; bash 还支持 emacs 风格的 ctrl
-
a, ctrl
-
e 跳到行头和行尾.
SHELL 脚本可以在 bash 中直接敲入运行, 也可以编辑成一个文件, 然后由 bash
解释执行, 通常脚本文件的后缀名为 .sh, 执行脚本文件通过运行:
bash 脚本文件名
也可以直接把脚本象一个程序那样运行. 首先把脚本设置成可执行属性, 然后在脚
本文件的开头加入新行:
#
!/
bin
/
bash
这一行指示 SHELL 使用
/
bin
/
bash 来解释此脚本文件.
除了第一行外, SHELL 把脚本文件中以 ‘#’ 字符开头的行忽略, 因此一般用 ‘#’
作为脚本注释
—————————————————————————
-
5
. Linux 系统使用
/
管理
UNIX 系统的配置文件通常都位于
/
etc 目录下
系统启动的时候读取
/
etc
/
fstab 文件,以此配置文件调用 mount 安装存储设备。
mount 运行的主要参数如下
mount 设备名 挂接点
-
t 类型
-
o 选项
比如希望使用 Windows 9x 的 C 盘(
/
dev
/
hda1),首先创建一个挂接点目录,比如
mkdir
/
diskc
然后执行 mount 命令
mount
/
dev
/
hda1
/
diskc
-
t vfat
-
o codepage
=
936
,iocharset
=
cp936
注意后面的选项是为了可以在 Linux 下识别 VFAT 文件系统上的中文文件名,也可
以直接修改
/
etc
/
fstab,让机器启动后直接挂接这个分区
“
/
dev
/
hda1
/
diskc vfat codepage
=
936
,iocharset
=
cp936
0
0
″
使用 umount 命令卸载分区,比如:
umount
/
dev
/
hda1
如果在
/
etc
/
fstab 文件中已经存在配置,也可以简化 mount 的参数
mount
/
dev
/
hda1
如果是安装 NTFS 格式的分区,使用如下命令
mount
/
dev
/
hda1
/
diskc
-
t ntfs
-
o iocharset
=
cp936
如果要在 ls 命令中显示中文文件名,还需要使用特殊的参数
ls –show
-
control
-
char
安装光驱的制定 type 为 iso9660 即可,比如光驱的设备为
/
dev
/
hdc
mount
/
dev
/
hdc
/
mnt
/
cdrom
-
t iso9660
Linux 甚至也可以把光盘的 ISO 格式文件直接作为一个光盘虚拟的安装:
mount
/
diskc
/
redhat.iso
/
mnt
/
cdrom
-
t iso9660
-
o loop
这条命令就可以把在 C 盘上的 redhat.iso 安装到
/
mnt
/
cdrom 文件,同样 Linux
下也可以这样安装软驱或者软盘的镜像文件,注意软驱的设备通常是
/
dev
/
fd0,软
盘的文件系统类型通常是 msdos
查看分区空间占用情况使用 df 命令,也可以加上
-
k 参数以 KBytes 参数返回信息
df
-
k
查看目录空间占用情况使用 du 命令,比如
du
-
k
UNIX 有创建文件的多个实例的功能(链接),分为硬链接和软链接(符号链接). 硬链
接的实质就是创建一个新的文件,但新文件在文件系统上的指针指向到源文件的存
储区域
ln 源文件名 新文件名
硬链接是不能跨分区创建的;跨分区创建链接的方法是符号链接
ln
-
s 源文件名 新文件名
如果希望保持两个文件的内容总是一致的,就应该使用链接而不是用 cp 拷贝文件
Linux 系统的网络配置可能会由于不同的发布版本导致配置文件不一致,但是 DNS
配置文件一定
/
etc
/
resolv.conf,格式通常是
domain 域名
nameserver DNS服务器名
Linux 下可以使用 netstat 命令查看网络连接情况, 比如运行
netstat
-
a
可以看到所有的网络连接,”State” 栏表示网络连接状态。比如 “LISTEN” 代表本
地正有服务器监听此端口,”ESTABLISHED” 代表已经有创建好的 TCP 连接。运行
netstat
-
nr
可以看到当前网络路由表
注意在 Windows 下也提供 netstat.exe 程序
UNIX 下进程操作基本命令是 ps 和 kill
查看所有进程信息
ps ax
这个命令返回所有进程的 PID, 终端号, 状态, 命令全称
使用 kill 向进程发送信号, 格式为
kill [
-
signal] PID…
signal 这里取值为
1
到
15
, 也可以是 HUP, STOP 这样标准的 POSIX 信号名称,
如果没有给定
-
signal 参数, 缺省向进程发送信号
15
(SIGTERM). 信号
9
(SIGKILL)
强制杀死进程
—————————————————————————
-
6
. grep
/
sed
/
awk,正则表达式
grep 程序用于在文本中搜索, 比如要在 Linux 启动日志
/
var
/
log
/
dmesg 中搜索
所有包含 CPU 的行, 使用命令
grep CPU
/
var
/
log
/
dmesg
grep 的用法大致上是
grep [options]… PATTEN [FILE]…
options 不是必须的, PATTEN 是一个正则表达式, FILE 是要搜索的文件名, 如果
FILE 参数没有给出, grep 从标准输入中搜索, 比如
grep CPU
/
var
/
log
/
dmesg
|
grep cache
在 UNIX 文本处理中, 正则表达式(regular expressions)是一个很重要的概念, 这
里只介绍两个最常见的用法:
“
^
string
” 和 “
string
$” 表示一行的开头和结尾, 试比较
grep “CPU”
/
var
/
log
/
dmesg 和 grep “
^
CPU”
/
var
/
log
/
dmesg
grep “drive”
/
var
/
log
/
dmesg 和 grep “drive$”
/
var
/
log
/
dmesg
使用 [] 括起来的内容表示括入的字符任选其一, 试比较
grep “memory”
/
var
/
log
/
dmesg
grep “Memory”
/
var
/
log
/
dmesg
grep “[Mm]emory”
/
var
/
log
/
dmesg
为了能够搜索到向 ‘
^
’, ‘$’, ‘[’, ‘]’, ‘ ‘ 这样的特殊字符使用转义符 ‘\’
grep “\[”
/
var
/
log
/
dmesg
sed 用于文本的查找和替换, sed, awk 等程序同 grep 一样, 或者从文件参数中读
入, 否则从标准输入中读入.
sed 的替换很类似与 vi 中查找替换的命令, 比如把
/
var
/
log
/
dmesg 中所有 Intel
单词全部替换成 AMD 然后输出到屏幕上, 使用:
sed
-
e “s
/
Intel
/
AMD
/
g”
/
var
/
log
/
dmesg
因为输出信息很多, 可以把输出定向到一个文件里面看得到的结果, 或者用:
grep “Intel”
/
var
/
log
/
dmesg
|
sed
-
e “s
/
Intel
/
AMD
/
g”
sed 替换的格式大致是:
sed
-
e “s
/
PATTEN
/
replacement
/
g” [FILE]…
如果使用
sed
-
e “s
/
PATTEN
/
replacement
/
” [FILE]…
那么如果一行内有多个 PATTEN, 仅有第一个 PATTEN 被替换成 replacement
awk 提供了比 SHELL 更强的编程能力, 这里只介绍 awk 对行的处理, 例如
awk ‘{print $
1
,$
3
}’
/
etc
/
fstab
可以看到 awk 按照空格(’ ‘)或者制表符(’\t’)把文本分成多个变量, 表示为 $
1
…
awk 这种特性经常用在日志文件的分析上, 由于日志文件的格式多是固定的, 使用
awk 可以方便的找出所需要的信息并再次加以分析.
下面的取得系统内存容量的脚本程序是本节内容的一个综合:
memory
=
`grep “
^
Memory”
/
var
/
log
/
dmesg
|
sed
-
e “s
/
[\
/
k]
/
/
g”
|
awk ‘{print $
3
}’`
memory
=
`expr $memory
/
1024
`
echo “SYSTEM MEMORY: $memory MB”
—————————————————————————
-
7
. gcc
/
make
gcc 编译器 编译 C 程序分为这么几个步骤:
1
. 预处理(根据C源程序中的#预处理标志生成准备编译的C文件)
2
. 编译(产生汇编文件)
3
. 汇编(产生目标文件)
4
. 链接(生成可执行文件)
以下是 gcc 最基本的使用方法
1
. gcc
-
c test.c
这个命令将把 test.c 编译成目标文件 test.o
2
. gcc
-
o test test.c
-
o 参数的意思是 output, 这条命令编译 test.c, 并产生可执行文件 test
3
. gcc
-
o test test1.c test2.o
这条命令编译源程序 test1.c 后, 将所得到的目标代码和 test2.o 一起链接产
生可执行文件 test
当一个项目含有多个源程序时, 可以使用 make 管理编译项目. make 程序在当前路
径下寻找文件名为”Makefile”的文件作为项目配置文件进行编译管理. Makefile 的
编写必须严格遵照格式. 基本格式如下:
AAAA: BBBB CCCC DDDD …
COMMAND LINE
1
COMMAND LINE
2
…
意思是如果 AAAA 文件不存在, 或者 AAAA 的最后修改时间比 BBBB CCCC DDDD …
等其中文件之一旧的话, 则执行 COMMAND LINEs; 注意 COMMAND LINEs 行首必须是
一个制表符(Tab), 否则 make 无法正确解释. 以下是一个可能的例子
test: test1.o test2.o
gcc
-
o test test1.o test2.o
test1.o: test1.c test1.h test.h
gcc
-
c test1.c
test2.o: test2.c test2.h test.h
gcc
-
c test2.c
make 只执行 Makefile 文件中第一条依赖关系, 但是这种依赖关系可以嵌套. 比如
上面的例子中, 执行 make 将产生 test, test1.o, test2.o 三个文件; 如果用户
修改了 test1.c, 重新执行 make, 那么将只重新编译出 test1.o, 然后链接成新的
test 程序; 如果用户修改了 test.h, 那么将重新编译 test1.o, test2.o, 然后链
接出新的 test.
以下是 gcc 的一些常见参数说明
gcc
-
Iheaderdir ……
-
Iheaderdir 参数指定了除了缺省值外, gcc 还将在 headerdir 目录下搜索头文件
头文件缺省搜索路径一般是
/
usr
/
include 目录
gcc
-
Llibdir
-
Llibdir 参数指定除了缺省值外, gcc 还将在 libdir 目录下搜索库文件
库文件缺省搜索路明一般是
/
usr
/
lib 目录
gcc
-
lname
-
lname 参数指定除了标准 C 库, 还需要 libname.so 或 libname.a 库文件链接.
一般来说, .so 后缀名是动态链接库, .a 后缀名是静态链接库; linux 缺省使用动
态链接.
—————————————————————————
-
8
. OpenSource Software
Linux 上的软件多是开源软件(OpenSource), 它们的源代码都可以从网上下载并自
由的使用(只需要遵守很少的许可条款就不必担心版权纠纷). 虽然 Linux 发行版都
已经附带编译好的大量软件, 但是了解开源软件是如何编译
/
安装
/
运行也是很有必
要, 原因有二: 现在发行版所附带的软件可能不是最新的版本, 缺乏必要的特性或
安全保障, 因此必须升级到最新版本; 或者发行版附带的软件的编译配置并不令人
满意, 比如软件会被安装到多个不同的目录下, 造成管理上的困难. 对于开发人员
来说, 类似 apache, mysql, php 这样的软件最好自己手工编译安装
OpenSource 源代码的发布一般是以压缩包(.tar.gz)的方式供使用者下载的. 这里
澄清一个概念, 因为 UNIX 环境下文件有权限, 用户, 属组, 类型的差别, 所以压
缩目录必须把这些属性信息保留起来, 在 UNIX 环境下压缩目录首先把目录打包成
一个 tar 格式的文件, 然后使用压缩程序对 .tar 文件压缩.
下载的源代码文件名中通常还包括软件的版本号, 比如 mysql
-
3.23
.
42
.tar.gz 说
明它是 mysql
3.23
.
42
版的源代码. 源代码的目录下通常会有 README, INSTALL
这两个文件, 在编译软件之前, 应该仔细阅读这两个文件, 以取得关于编译
/
使用的
详细信息; 有的源代码还会包含 Doc, 或 Document 这样专门存放文档的目录. 下
面以 apache, mysql 为例子说明开源软件一般的安装方法.
****************************************************************************
*
关于软件源代码的压缩包
****************************************************************************
POSIX 标准的 UNIX 压缩
/
解压缩程序是 compress
/
uncompress, 它们得到压缩文件
的后缀是 .Z, Linux 环境下通用的压缩
/
解压缩程序是 gzip
/
gunzip, 它们得到压
缩文件的后缀是 .gz, 还有些文件是用 bzip2 来压缩的, 压缩文件后缀是 .bz2.
对于下载的源代码, 首先选择正确的解压缩程序解成 .tar 文件, 然后再用 tar 解
开为目录. 以下载的 PHP 源码 php
-
4.2
.
3
.tar.bz2 为例:
bzip2
-
d php
-
4.2
.
3
.tar.bz2 (执行完后得到 php
-
4.2
.
3
.tar)
tar xf php
-
4.2
.
3
.tar (执行完后得到目录 php
-
4.2
.
3
)
如果使用 linux 系统, 也可以用一个命令执行全部过程
tar jxf php
-
4.2
.
3
.tar.bz2 (j 参数指示调用 bzip2 解压缩)
同样, 解压缩 mysql
-
3.23
.
53
.tar.gz 可以使用:
gunzip mysql
-
3.23
.
53
.tar.gz
tar xf mysql
-
3.23
.
53
.tar
或者使用
tar zxf mysql
-
3.23
.
53
.tar.gz (z 参数指示调用 gzip 解压缩)
使用 tar 打包目录的命令为
tar cf 目标文件名 目录名
关于 tar, gzip 等程序更详细的信息请参考 man 手册页
****************************************************************************
*
Apache 的编译(从 httpd.apache.org 下载)
****************************************************************************
OpenSource 软件一般都提供 configure 脚本供编译前的配置使用.
.
/
configure –help 这个命令可以得到 configure 脚本参数的详细列表. 最常用
的 configure 参数就是 –prefix
=
DIR 了, 这个参数指示了将把软件安装在什么地
方, 比如我们希望把 apache 安装在
/
root
/
apache 目录下, 执行
tar zxf apache_1.
3.27
.tar.gz
cd apache_1.
3.27
.
/
configure –prefix
=/
root
/
apache
make (这一步是编译)
make install (这一步是安装)
假设 apache 安装在
/
root
/
apache 目录下, apache 的配置文件是
/
root
/
apache
/
conf
/
httpd.conf, 如果需要对 apache 作一些设定, 修改这个文件
即可, 比如 apache 缺省安装完后使用的服务端口可能是
8080
, 那么修改这个文件,
把 Port 对应的
8080
改成
80
后启动 apache 就可以正常提供 WEB 服务了.
启动 apache 的命令是:
/
root
/
apache
/
bin
/
apachectl start
终止 apache 的命令是:
/
root
/
apache
/
bin
/
apachectl stop
cgi 程序放在
/
root
/
apache
/
cgi
-
bin 目录下
****************************************************************************
*
Mysql 的编译(从 www.mysql.com 下载)
****************************************************************************
tar zxf mysql
-
3.23
.
53
.tar.gz
cd mysql
-
3.23
.
53
.
/
configure –prefix
=/
root
/
mysql
make
make install
/
root
/
mysql
/
bin
/
mysql_install_db
启动 mysql 的命令是:
/
root
/
mysql
/
bin
/
safe_mysqld –user
=
root
&
终止 mysql 的命令是:
/
root
/
mysql
/
bin
/
mysqladmin shutdown
如果要开发连接 mysql 的 C 程序, 所需要的头文件在
/
root
/
mysql
/
include
/
mysql
目录下, 所需要的库在
/
root
/
mysql
/
lib
/
mysql 目录下, 编译的时候必须在 gcc
参数里面指定
gcc
-
I
/
root
/
mysql
/
include
/
mysql
-
L
/
root
/
mysql
/
lib
/
mysql
-
lmysqlclient ……
用户可以把 mysql 库所在的目录加入
/
etc
/
ld.so.conf 文件, 运行
/
sbin
/
ldconfig,
这样软件才能正确找到并加载 libmysqlclient.so 动态链接库
—————————————————————————
-
9
. Linux 包管理
没有 setup.exe, Linux 是使用包管理的方式处理软件的安装,配置,卸载以及软件
之间的依赖关系的. 软件被包装为一个文件, 由包管理程序分析此文件, 把软件安
装到正确的目录下. 最常用的包格式为 RPM, DEB 两种. 国内用的最多的还是 RPM.