内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。
Linux内核版本又分为稳定版和开发版,两种版本是相互关联,相互循环:
内核源码网址:http://www.kernel.org 所有来自全世界的对Linux源码的修改最终都会汇总到这个网站,由Linus领导的开源社区对其进行甄别和修改最终决定是否进入到Linux主线内核源码中。
Linux发行版 (也被叫做 GNU/Linux 发行版) 通常包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。
排名 | 2016 | 2015 |
---|---|---|
1 | Linux Mint | Linux Mint |
2 | Debian | Debian |
3 | Ubuntu | Ubuntu |
4 | openSUSE | openSUSE |
5 | redhat | Fedora |
6 | Fedora | Mageia |
7 | Manjaro | Manjaro |
8 | Mageia | CentOS |
9 | CentOS | Arch |
10 | Arch | Elementary |
此领域是传统linux应用最薄弱的环节,传统linux由于界面简单、操作复杂、应用软件少的缺点,一直被windows所压制,但近些年来随着ubuntu、fedora等优秀桌面环境的兴起,同时各大硬件厂商对其支持的加大,linux在个人桌面领域的占有率在逐渐的提高
典型代表:ubuntu、fedora、suse linux
在Ubuntu中玩QQ
linux在服务器领域的应用是其重要分支
linux免费、稳定、高效等特点在这里得到了很好的体现,但早期因为维护、运行等原因同样受到了很大的限制,但近些年来linux服务器市场得到了飞速的提升,尤其在一些高端领域尤为广泛
典型代表:
近些年来linux在嵌入式领域的应用得到了飞速的提高
linux运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB等特点,使其近些年来在嵌入式领域的应用得到非常大的提高
主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、等都是其应用领域,得到了摩托罗拉、三星、NEC、Google等公司的大力推广
2 第1章 shell
bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格
的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的
POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。
1.3 命令和路径补齐
在bash下敲命令时,Tab键可以补全已经敲了一部分的文件名和目录名。如果是Ubuntu
系统,系统默认启用了bash completion,还可以补全命令的某些参数、Makefile目标等
等。如果是Debian系统,可以用以下命令启用bash completion:
$ source /etc/bash_completion
建议将这一行加入∼/.bashrc启动脚本中。比如使用sudo后面接命令,如果没有bash
completion则只有sudo可以补全,后面的命令不能补全。如果启用了bash completion,则
后面的命令,包括命令的某些参数(比如aptitude命令的install)都可以补全了。
比如在主目录下要列出桌面目录的内容,输入(不回车)
$ ls De
然后敲Tab键,如果以De开头的文件或文件夹只有Desktop一个,就自动补全为
$ ls Desktop
否则,再敲一次Tab键,将会把所有以De开头的文件或文件夹列在下面供你选择(在这里
我们手动创建另外一个以De开头的文件)
$ touch Death
$ ls De
Death Desktop/
你可以再补敲一个s再Tab,这次Desktop就会补全到命令后面了。
有的人是从DOS时代过来的,留下一个很不好的习惯就是在找一个文件时反复地
cd、ls、cd、ls。。。等找到了要找的文件时再想回到先前的目录,已经不记得先前是
从哪个目录转到这里来的了。
我们从上面可以看出,Tab补全本身就具备了ls的功能,上面的Tab补全相当于ls -Fd
De*命令。所以我们完全不必反复地cd到别的目录然后ls去找文件,多按几次Tab就可以一条
命令完成了,这样的好处是我们的当前目录不用变,不需要找完了文件再cd回来,同时省去
了大量的按键次数。更重要的是,自动补全同时兼具了检查拼写错误的功能,如果前面几个
字母拼写错了,就补全不出东西来,用户就知道拼写错了,如果前面几个字母没有拼写错,
那么由系统补全出来的文件名肯定也不会有拼写错误,避免了用户在敲很长的文件名时易犯
的拼写错误。
1.4节 历史记录 3
1.4 历史记录
history
历史记录是另外一个非常方便的功能。按上下移动光标键(或者Ctrl-p、Ctrl-n)可以
一条一条浏览以前输过的命令。如果有需要重复输入的命令就不用输第二次了。如果你能记
住以前输过的某条命令中的某个关键字,可以按Ctrl-r,然后输入关键字,随着你每输入一
个字母,bash会做增量式(increasingly)查找,也可以反复按Ctrl-r或Ctrl-s向前向后查
找。如果找到了,按左右移动光标键或Home键(Ctrl-a)或End键(Ctrl-e)将该命令带回提示
符下进一步修改,或者直接按Enter键原封不动地执行该命令。
1.5 主键盘快捷键
bash的快捷键和emacs保持一致,用惯其中之一再用另一个程序会很顺手的。请记住一
条原则:尽量使用主键盘快捷键而不使用移动光标键和编辑键。因为手不必离开主键盘是效
率最高的,这样在你一生之中所节省的来回移动手的时间绝对可以用星期来计算,是绝对值
得你花十分钟的时间记住这些快捷键的。
| 功能 | 快捷键 | 助记 |
|-----------+-----------+------------------|
| 上 | Ctrl-p | previous |
| 下 | Ctrl-n | next |
| 左 | Ctrl-b | backward |
| 右 | Ctrl-f | forward |
| Del | Ctrl-d | delete光标后面的 |
| Home | Ctrl-a | the first letter |
| End | Ctrl-e | end |
| Backspace | Backspace | delete光标前面的 |
第 2 章
目录和文件
2.1 类Unix系统目录结构
ubuntu没有盘符这个概念,只有一个根目录/,所有文件都在它下面
/ 根目录
bin //系统可执行程序,如命令
boot //内核和启动程序,所有和启动相关的文件都保存在这里
grub //引导器相关文件
dev //设备文件
etc //系统软件的启动和配置文件,系统在启动过程中需要读取的文件都在这个目录。如LILO参数、用
户账户和密码。
home //用户的主目录。下面是自己定义的用户名的文件夹
lib //系统程序库文件,这个目录里存放着系统最基本的动态链接共享库,类似于Windows下的system32
目录,几乎所有的应用程序都需要用到这些共享库。
media //挂载媒体设备,如光驱、U盘等
mnt //目录是让用户临时挂载别的文件系统,如挂载Windows下的某个分区,ubuntu默认还是挂载在/media
目录。
opt //可选的应用软件包(很少使用)
proc //这个目录是系统内存的映射,我们可以直接访问这个目录来获取系统信息。也就是说,这个目录
的内容不在硬盘上而是在内存里。
sbin //管理员系统程序
selinux
srv
sys //udev用到的设备目录树,/sys反映你机器当前所接的设备
tmp //临时文件夹
usr //这是个最庞大的目录,我们要用到的很多应用程序和文件几乎都存放在这个目录下。]
bin // 应用程序
game //游戏程序
include
lib //应用程序的库文件
lib64
local //包含用户程序等
sbin //管理员应用程序
2.2 用户目录
位于/home/user,称之为用户工作目录或家目录,表示方式:
6 第2章 目录和文件
/home/user
~
2.2.1 相对路径和绝对路径
绝对路径
从/目录开始描述的路径为绝对路径,如:
cd /home
ls /usr
相对路径
从当前位置开始描述的路径为相对路径,如:
cd ../../
ls abc/def
.和..
每个目录下都有.和..
. 表示当前目录
.. 表示上一级目录,即父目录
根目录下的.和..都表示当前目录
2.3 ls
ls [OPTION]… [FILE]…
ls是英文单词list的简写,其功能为列出目录的内容。这是用户最常用的一个命令,因
为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。 对于每个目录,
该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出其文件名以及所要求的其
他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当
前目录的信息。
主要的OPTION有:
-a 列出隐藏文件,文件中以“.”开头的均为隐藏文件,如:~/.bashrc
-l 列出文件的详细信息
-R 连同子目录中的内容一起列出
用ls -l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文
件类型,它可以是下述类型之一:
2.4节 cd 7
- 普通文件
d 目录
l 符号链接
b 块设备文件
c 字符设备文件
s socket文件,网络套接字
p 管道
后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权
限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示
对文件的读、写和执行权限。各权限如下所示:
r 读
w 写
x 可执行。对于目录,表示进入权限。
s 当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组 ID)。
t 设置标志位(sticky bit)。如果是有sticky bit的目录,在该目录下任何用户只要有适当的权限即可创建文
件,但文件只能被超级用户、目录拥有者或文件属主删除。如果是有sticky bit的可执行文件,在该文件执行后,
指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。
- 没有相应位置的权限。
访问权限后面的数字表示与该文件共享inode的文件总数,即硬链接数(参见下面ln命
令)。
2.4 cd
change dir 改变当前所在路径
cd ~
cd dir1/dir2
cd ..
2.5 which
查看指定命令所在路径
which ls
2.6 pwd
查看当前所在路径
8 第2章 目录和文件
pwd
2.7 mkdir
mkdir [OPTION] DIRECTORY…
创建目录DIRECTORY,可以一次创建多个。OPTION如果是-p,表示可以连同父目录一起
创建。
2.8 rmdir
rmdir [OPTION]… DIRECTORY…
删除空目录,可以一次删除多个。OPTION如果是-p,表示可以连同空的父目录一起删
除。mkdir和rmdir的用法举例:
空目录,只包含.和..的目录为空目录
$ mkdir a
$ mkdir a/b
$ ls a
b
$ rmdir a/b
$ ls a
$ rmdir a
$ mkdir a/b
mkdir: cannot create directory `a/b': No such file or directory
$ mkdir -p a/b
$ rmdir -p a/b
2.9 touch
touch [OPTION]… FILE…
* 将每个文件的访问及修改时间都更新为目前的时间。
* 如果文件不存在,则创建一个字节数为0的文件。
2.10 rm
删除文件:
rm file
删除目录:
2.11节 mv 9
rm dir -rf
2.11 mv
重命名:
mv file1 file2
移动文件:
mv file1 ~/
2.12 cp
拷贝文件:
cp file1 file2
cp file1 dir/
cp file1 ../
拷贝目录:
cp dir1 dir2 -r
cp dir1 ~/ -r
2.13 cat
查看文件里内容,输出到终端,如果cat时没跟文件名,则读标准输入,遇到\n后,输
出到标准输出,终端下输入Ctrl-d表示结束
2.14 more
more [OPTION] FILE…
查看文本文件的内容,屏幕显示完一屏就等待用户按下任意键再滚动到下一屏,如果中
途不想继续看下去了,可以按Ctrl+C或q终止显示。
10 第2章 目录和文件
2.15 less
less [OPTION] FILE…
查看文本文件的内容,屏幕显示完一屏就等待用户按键,用户可以向上或向下查看,如
果中途不想继续看下去了,可以按Ctrl+C或q终止显示。
2.16 head
head [OPTION]… FILE…
显示指定文件的前面几行。如果没有指定文件,将从标准输入(键盘)上读取。如果没
有指定要显示的行数,则默认显示前10行。如果要显示文件的前5行:
$ head -5 file1
2.17 tail
tail [OPTION]… FILE…
显示文件的最后几行。若没有指定显示的行或字符数,则默认显示末尾10行。如果要显
示文件末5行:
$ tail -5 file1
2.18 ln
链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic
Link)。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立
指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。如果
给ln命令加上-s选项,则建立符号链接。举例如下,注意ls -l列出文件的硬链接数和字节
数:
硬链接:
touch hello
ln hello word_h
软链接:
ln -s hello word_s
2.19节 tree 11
2.19 tree
这个命令需要下载安装,ubuntu下
sudo apt-get install tree
按结构树的形状显示目录和文件
2.20 wc
利用 wc 指令我们可以计算文件的 Byte 数、字数、或是列数,若不指定文件名称、或
是所给予的文件名为“-”,则 wc 指令会从标准输入设备读取数据。
wc -l ./*
-c 或–bytes 或–chars 只显示 Bytes 数。
-l 或–lines 只显示列数。
-w 或–words 只显示字数。
2.21 od
od -tcx file1
-t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d[SIZE] 有符号十进制数,每个整数SIZE字节。
f[SIZE] 浮点数,每个整数SIZE字节。
o[SIZE] 八进制(系统默认值为02),每个整数SIZE字节。
u[SIZE] 无符号十进制数,每个整数SIZE字节。
x[SIZE] 十六进制数,每个整数SIZE字节。
2.22 du
查看某个目录的大小:
以M为单位
12 第2章 目录和文件
du -hm /home/itcast/test
以B为单位
du -hb ./*
以K为单位,4k的整数倍
du -hk ./*
总计大小,以M为单位
du -hc ./*
2.23 df
df查看磁盘使用情况
df --block-size=GB
df --block-size=MB
第 3 章
文件属性和用户用户组
3.1 whoami
查看当前登陆用户
3.2 chmod
* 文字设定法
chmod [who] [+|-|=] [mode] 文件名
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
* 数字设定法
14 第3章 文件属性和用户用户组
chmod [mode] 文件名
我们必须首先了解用数字表示的属性的含义:
0表示没有权限,
1表示可执行权限,
2表示可写权限,
4表示可读权限,
然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)
(o)。
例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=
6(读/写)。
比如设置一个文件允许所有用户可写
$ chmod a+w file1
设置一个文件允许所有用户可读、可写、不可执行
$ chmod 666 file1
user group other
r w x r w x r w x
4 2 1 4 2 1 4 2 1
5 6 3
3.3 chown
chown [OPTION]… [OWNER:GROUP] FILE…
chown [OPTION]… –reference=RFILE FILE…
更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文
件拷贝给用户A, 为了让用户A能够存取这个文件,root用户应该把这个文件的属主设为A,
否则,用户A无法存取这个文件。
OPTION的主要参数:
* -R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
* -v 显示chown命令所做的工作。
比如把一个文件改为itcast用户和nogroup用户组所有
$ sudo chown itcast:nogroup file1
注意:
3.4节 chgrp 15
* chown需要特权用户才能执行
* 一个文件的owner和owning group是没有关联的。一个文件属于用户A,也属于用户组
B,并不表示用户A属于用户组B。
3.4 chgrp
chgrp [OPTION]… GROUP FILE…
chgrp [OPTION]… –reference=RFILE FILE…
该命令改变(指定)指定文件所属的用户组。其中group可以是用户组ID,也可以是/
etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配
符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。
OPTION的主要参数:
-R 递归式地改变指定目录及其下的所有子目录和文件的属组。
第 4 章
查找与检索
4.1 find
根据文件名查找
find pathname -options [-print -exec -ok -name -type...]
在目录中搜索文件,path指定目录路径,系统从这里开始沿着目录树向下查找文件。它
是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。Expression 是
find命令接受的表达式,find命令的所有操作都是针对表达式的。
一条最常用的find命令--在当前目录及子目录下查找所有以file开头的文件名。
$ find . -name 'file*'
$ find / -name 'vimrc'
$ find ~ -name '*.c'
$ find /usr/ -name "*tmp*" -exec ls -l { } \;
find ./ -name "*tmp" -ok rm { } \;
4.2 grep
根据内容检索
grep [options] PATTERN [FILE...]
在指定文件中搜索特定的内容,并将含有这些内容的行输出到标准输出。若不指定文件
名,则从标准输入读取。
[options]部分包含的主要参数:
18 第4章 查找与检索
-I:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
-R: 连同子目录中所有文件一起查找。
比如到系统头文件目录下查找所有包含printf的文件
$ grep 'printf' /usr/include -R
4.3 xargs
从标准输入建立和执行命令行
xargs [OPTION] [command]
它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起
传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几
分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是
xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是
全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并
如此继续下去。
查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件:
find . -type f | xargs file
查找usr目录下名字以“tmp”开头的文件,将其详细信息列出。
find /usr -name "tmp*" | ls -l
find /usr -name "tmp*" | xargs ls -l
4.3节 xargs 19
find /usr -name "tmp*" -print0 | xargs -0 ls -l
-print0表示输出以null分隔(-print使用换行);-0表示输入以null分隔。
查找当前目录下,文件名包含“bin”字串的文件,并在文件中搜索“printf”这个词
find ./ -name "*bin*" | grep "printf"
find ./ -name "*bin*" | xargs grep "printf"
find ./ -name "*bin*" -print0 | xargs -0 grep "printf"
第 5 章
安装卸载软件
5.1 apt-get
更新源服务器列表
sudo vi /etc/apt/sources.list
更新完服务器列表后需要更新下源
sudo apt-get update 更新源
sudo apt-get install package 安装包
sudo apt-get remove package 删除包
sudo apt-cache search package 搜索软件包
sudo apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package --reinstall 重新安装包
sudo apt-get -f install 修复安装
sudo apt-get remove package --purge 删除包,包括配置文件等
sudo apt-get build-dep package 安装相关的编译环境
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
sudo apt-cache depends package 了解使用该包依赖那些包
sudo apt-cache rdepends package 查看该包被哪些包依赖
sudo apt-get source package 下载该包的源代码
22 第5章 安装卸载软件
sudo apt-get clean && sudo apt-get autoclean 清理无用的包
sudo apt-get check 检查是否有损坏的依赖
5.2 deb包安装
安装deb软件包命令: sudo dpkg -i xxx.deb
删除软件包命令: sudo dpkg -r xxx.deb
连同配置文件一起删除命令: sudo dpkg -r --purge xxx.deb
查看软件包信息命令: sudo dpkg -info xxx.deb
查看文件拷贝详情命令: sudo dpkg -L xxx.deb
查看系统中已安装软件包信息命令: sudo dpkg -l
重新配置软件包命令: sudo dpkg-reconfigure xxx
5.3 原码安装
1. 解压缩源代码包
2. cd dir
3. ./configure
检测文件是否缺失,创建Makefile,检测编译环境
4. make
编译源码,生成库和可执行程序
5. sudo make install
把库和可执行程序,安装到系统路径下
6. sudo make distclean
删除和卸载软件
第 6 章
磁盘管理
6.1 mount
命令格式:
mount [-t vfstype] -o options device dir
其中:
* -t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常
用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
* -o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
* device 要挂接(mount)的设备。
* dir设备在系统上的挂接点(mount point)。
6.1.1 挂接光盘镜像文件
由于近年来磁盘技术的巨大进步,新的电脑系统都配备了大容量的磁盘系统,在
Windows下许多人都习惯把软件和资料做成光盘镜像文件通过虚拟 光驱来使用。这样做有
许多好处:一、减轻了光驱的磨损;二、现在硬盘容量巨大存放几十个光盘镜像文件不成问
题,随用随调十分方便;三、硬盘的读取速度要远 远高于光盘的读取速度,CPU占用率大大
降低。其实linux系统下制作和使用光盘镜像比Windows系统更方便,不必借用任何第三方软
件包。
1.从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。
24 第6章 磁盘管理
#cp /dev/cdrom /home/sunky/mydisk.iso 或
#dd if=/dev/cdrom of=/home/sunky/mydisk.iso
注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/
sunky/mydisk.iso
2.文件和目录制作成光盘镜像文件,执行下面的命令。
#mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir
注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/
home/sunky/mydisk.iso,光盘卷标为:mydisk
-r 这个选项能够将文件的uid,gid设为0,因为uid与gid只在制作镜像者本身系统上有效,在其它电脑上没有对应
的用户,所以留着也只是无效用户;将所有文件设置为可读。如果文件有可执行的权限的话,将继续保持其可执行
的权限。去掉所有文件及文件夹可写权限,因为挂载的光盘镜像本身也就为只读系统,可写权限无意义。其它特殊
权限都将被清空。
-o 指定被创建的镜像文件名称(包含目录位置)
-V 指定光盘标签,就像windows下面挂载系统盘时会显示系统盘的名字一样。
-J 或-joliet选项表示使用Joliet格式(可使用unicode储存中文档名)由于在ISO 9660中有一些限制,如字符
设置限制,文件名长度限制和目录树深度制。这些规定阻碍了用户复制数据,Joliet是ISO 9660的一个扩展,由
Microsoft提出和实现。
3.光盘镜像文件的挂接(mount)
mkisofs -r -J -V mydisk -o /home/itcast/mydisk.iso /home/itcast/object/
将/home/itcast/object/目录下的内容生成一个叫mydisk.iso的镜像文件保存在目录/
home/itcast/下。
#mkdir /mnt/vcdrom
注:建立一个目录用来作挂接点(mount point)
#mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom
注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。
6.2节 umount 25
6.1.2 挂载U盘
磁盘设备命名一般规则:
在Linux中,设备名称通常都保存在/dev里,/dev下的文件是特殊的设备文件,和特定
的驱动程序相关联。而这些设备的命名有一定的规则,可以使用“推理”方式把设备名称找
出来。
例如:/dev/sda1,“sd”是SCSI Device (hd是Hard Disk硬盘,fd是Floppy Disk
软盘)。其中“a”代表第一块硬盘,如果主机上装有4块硬盘,那么他们应该依次编号
sda、sdb、sdc、sdd。而sda1中的“1”代表sda的第一个主分区,sda2代表第二个主分区。
由于一块硬盘的主分区最多允许有4个,因此扩展分区的第一个逻辑分区从sda5开始向后依
次编号。
1.检测存储设备名称
sudo fdisk -l
2.挂载存储设备sdb1到挂载点/mnt目录
sudo mount /dev/sdb1 /mnt -o utf8
可以使U盘内的中文正常显示出来。
3.访问/mnt
4.卸载/mnt
sudo umount /mnt
6.2 umount
卸载命令
sudo umount 挂在点
6.3 dd
dd:拷贝
例1:拷贝光碟(注意,你的光碟是标准的 iso9660格式才可以这么做唷!)
dd if=/dev/cdrom of=cdrom.iso
例2:将文件sfile拷贝到文件 dfile中。
26 第6章 磁盘管理
$ dd if=sfile of=dfile
例3:创建一个100M的空文件
dd if=/dev/zero of=hello.txt bs=100M count=1
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件,从里面读出来的数据都是0。
使用mke2fs命令将常规文件格式化成分区当成文件系统来使用,使用mount借助loop设
备把映像文件当成磁盘分区挂载。
1.以/dev/zero为输入文件,imagefile为输出创建一个2M大小的文件
$dd if=/dev/zero of=imagefile bs=2048 count=1024
2.使用mke2fs命令将该文件制作成文件系统。制作期间需输入“y”确认。
$mke2fs imagefile
3.制作成功后可以将该文件使用mount命令借助loop挂载到/mnt下
$sudo mount -o loop imagefile /mnt
4.可以查看到lost+found缺省目录
$ls /mnt
5.可以像使用普通磁盘一样,直接在里面创建文件并写入内容。
$sudo vi hello.c
6.lost+found hello.c
$ls /mnt
6.3节 dd 27
7.在/mnt内执行mount命令可以查看该“文件系统”的详细信息。
$mount
如:/home/itcast/mydisk on /mnt type ext2 (rw)
8.可使用umount命令将该“磁盘”卸载。
$sudo umount /mnt
第 7 章
压缩包管理
7.1 tar
tar [主选项+辅选项] 文件或者目录
tar可以为文件和目录创建档案。利用tar命令用户可以为某一特定文件创建档案(备份
文件),也可以在档案中改变文件,或者向档案中加入新的文件。使用该命令时,主选项是
必须要有的,辅选项是辅助使用的,可以选用。
主选项包括:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最
后。
x 从档案文件中释放文件。(常用)
辅选项包括:
f 使用档案文件或设备,这个选项通常是必选的。(常用)
k 保存已经存在的文件。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。(常用)
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压
缩。(常用)
30 第7章 压缩包管理
j 用bzip2来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压
缩。(常用)
要将文件备份到一个特定的设备,只需把设备名作为备份文件名。
打包:
tar cvf dir.tar dir
tar xvf dir.tar dir
打gz压缩包:
tar zcvf dir.tar.gz dir
tar zxvf dir.tar.gz
打bz2压缩包:
tar jcvf dir.tar.bz2 dir
tar jxvf dir.tar.bz2
指定目录解压缩:
tar zxvf dir.tar.gz -C ~/test
7.2 rar
打包:把dir压缩成newdir.rar
rar a -r newdir dir
解包:把newdir.rar解压缩到当前目录
unrar x newdir.rar
7.3节 zip 31
7.3 zip
打包:
zip -r dir.zip dir
解包:
unzip dir.zip
第 8 章
进程管理
8.1 who
查看当前在线上的用户情况。所有的选项都是可选的,不使用任何选项时,who命令将
显示以下三项内容:
login name:登录用户名;
terminal line:使用终端设备;
login time:登录到系统的时间。
itcast@ubuntu:~/demo$ who -uH
名称 线路 时间 空闲 进程号 备注
itcast tty2 2014-08-14 13:31 . 6798
itcast tty7 2014-08-14 01:31 旧 2423
itcast pts/1 2014-08-14 01:31 12:00 2843 (:0)
itcast pts/3 2014-08-14 10:39 . 2843 (:0)
8.2 ps
ps [选项]
ps命令用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输
出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。选项部分如下:
-e 显示所有进程。
-f 全格式。
-h 不显示标题。
-l 长格式。
-w 宽输出。
-r 只显示正在运行的进程。
-a:即all,查看当前系统所有用户的所有进程
-u:查看进程所有者及其他一些详细信息
-x:显示没有控制终端的进程
34 第8章 进程管理
这个命令参数有很多,但一般的用户只需掌握一些最常用的命令参数就可以了。 最常
用的三个参数是u、a、x, 我们首先以root身份登录系统,查看当前进程状况
itcast@ubuntu:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 3672 2008 ? Ss 08:46 0:01 /sbin/init
itcast@ubuntu:~$ ps ajx
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
4592 6948 6948 4592 pts/3 6948 R+ 1000 0:00 ps ajx
itcast@ubuntu:~$ ps -Lf 2423
UID PID PPID LWP C NLWP STIME TTY STAT TIME CMD
1000 2423 2282 2423 0 4 08:46 ? Ssl 0:00 gnome-session --session=ubuntu
1000 2423 2282 2465 0 4 08:46 ? Ssl 0:00 gnome-session --session=ubuntu
1000 2423 2282 2466 0 4 08:46 ? Ssl 0:00 gnome-session --session=ubuntu
1000 2423 2282 2468 0 4 08:46 ? Ssl 0:00 gnome-session --session=ubuntu
Head标头:
USER 用户名
UID 用户ID(User ID)
PID 进程ID(Process ID)
PPID 父进程的进程ID(Parent Process id)
SID 会话ID(Session id)
%CPU 进程的cpu占用率
%MEM 进程的内存占用率
VSZ 进程所使用的虚存的大小(Virtual Size)
RSS 进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。
TTY 与进程关联的终端(tty)
STAT 进程的状态:进程状态使用字符表示的(STAT的状态码)
R 运行 Runnable (on run queue) 正在运行或在运行队列中等待。
S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号。
I 空闲 Idle
Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调
用后释放。
D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中
断发生。
T 停止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
P 等待交换页
W 无驻留页 has no resident pages 没有足够的记忆体分页可分配。
X 死掉的进程
< 高优先级进程 高优先序的进程
N 低优先 级进程 低优先序的进程
L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+ 位于后台的进程组
START 进程启动时间和日期
TIME 进程使用的总cpu时间
8.3节 jobs 35
COMMAND 正在执行的命令行命令
NI 优先级(Nice)
PRI 进程优先级编号(Priority)
WCHAN 进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS 与进程相关的数字标识
8.3 jobs
用来显示当前shell 下正在运行哪些作业(即后台作业)。
$ cat
(按下Ctrl-z挂起当前进程)
[1]+ Stopped cat
$ cat
(按下Ctrl-z挂起当前进程)
[1]+ Stopped cat
$ jobs
[1]- Stopped cat
[2]+ Stopped cat
第一列方括号中的数字表示作业序号,它是由当前运行的shell 分配的,而不是由操作
系统统一分配的。在当前shell 环境下,第一后台作业的作业号为1,第二作业的作业号为
2,等等。第二列中的“+”号表示相应作业的优先级比“-”号对应作业的优先级高。第三
列表明作业状态,是否为运行、中断、等待输入或停止等。最后列出的是创建当前这个作业
所对应的命令行。
8.4 fg
fg [job…]
把指定的后台作业或挂起作业移到前台运行。 参数job是一个或多个进程的PID,或者
是命令名称,或者是作业号(作业号前面要带一个%号)。
36 第8章 进程管理
通常在shell中输入命令启动进程后,如果该进程需要与用户交互,那么此后用户的键
盘输入都被该进程读取,直到该进程退出后才出现shell提示符$,这种进程为前台进程。
如果在命令行的末尾加上&字符,则shell为这个命令创建一个后台进程,它虽然也可以
输出到屏幕,但是不能读取键盘输入,不管执行命令的进程有没有退出都立刻回到shell提
示符接受下一条命令的输入。如果该进程也需要读取键盘输入,则被挂起等待直到用户用fg
命令把它变成前台进程。如果一个命令需要较长的处理时间并且不需要与用户交互,就适合
把它放在后台执行。
8.5 bg
bg [job…]
把被挂起的进程提到后台执行。 其中,job是一个或多个进程的PID、命令名称或者作
业号,在参数前要带%号。
$ cat
(按下Ctrl-z挂起当前进程)
[1]+ Stopped cat
$ bg %1
[1]+ cat &
$(再回车一次)
[1]+ Stopped cat
$ fg %1
cat
(按Ctrl-d输入文件结束符)
$
8.6 kill
向指定进程发送信号
kill [ -signal | -s signal ] pid ...
8.7节 env 37
查看信号编号
kill -l [ signal ]
给一个进程发信号,或终止一个进程的运行。
$ cat
(按Ctrl-z挂起当前进程)
[1]+ Stopped cat
$ ps
PID TTY TIME CMD
5819 pts/1 00:00:00 bash
5893 pts/1 00:00:00 cat
5894 pts/1 00:00:00 ps
$ kill -SIGKILL 5893
$(再次按回车键)
[1]+ Killed cat
$
kill命令如果不带参数而直接跟pid,就是发给该进程SIGTERM信号,大部分进程收到该
信号就会终止。但是被挂起的进程不能处理信号,所以必须发SIGKILL信号,由系统强制终
止进程。
8.7 env
查看当前进程环境变量
$env
* vim ∼/.bashrc
配置当前用户环境变量
* vim /etc/profile
配置系统环境变量,配置时需要有root权限
export PATH=$PATH:新路径
8.8 top
第 9 章
用户管理
9.1 创建用户
sudo useradd -s /bin/bash -g itcast -d /home/itcast -m itcast
sudo useradd -s /bin/sh -g group -G adm,root xwp
此命令新建了一个用户xwp,该用户的登录Shell是/bin/sh,他属于group用户组,同时
又属于adm和root用户组,其中group用户组是其主组。
-s 指定新用户登陆时shell类型
-g 指定所属组,该组必须已经存在
-G 指定附属组,该组必须已经存在
-d 用户家目录
-m 用户家目录不存在时,自动创建该目录
9.2 设置用户组
sudo groupadd itcast
9.3 设置密码
sudo passwd itcast
40 第9章 用户管理
9.4 切换用户
su 用户名
su itcast
9.5 root用户
变成root用户
sudo su
设置root密码
passwd
9.6 删除用户
userdel 选项 用户名
常用的选项是-r,他的作用是把用户的主目录一起删除。 例如:
sudo userdel -r itcast
此命令删除用户itcast在系统文件(主要是/etc/passwd,/etc/shadow,/etc/group
等)中的记录,同时删除用户的主目录。
第 10 章
网络管理
10.1 ifconfig
1.查看网卡信息
ifconfig
2.关闭网卡
sudo ifconfig eth0 down
3.开启网卡eth0
sudo ifconfig eth0 up
4.给eth0配置临时IP
sudo ifconfig eth0 IP
10.2 ping
ping [选项] 主机名/IP地址
查看网络上的主机是否在工作。它向该主机发送ICMP ECHO_REQUEST包。有时我们想从
网络上的某台主机上下载文件,可是又不知道那台主机是否开着,就需要使用ping命令查
看。
命令中各选项的含义如下:
-c 数目 在发送指定数目的包后停止。
-d 设定SO_DEBUG的选项。
-f 大量且快速地送网络封包给一台机器,看它的回应。
-I 秒数 设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
-l 次数 在指定次数内,以最快的方式送封包数据到指定机器(只有超级用户可以使用此选项)。
-q 不显示任何传送封包的信息,只显示最后的结果。
-r 不经由网关而直接送封包到一台机器,通常是查看本机的网络接口是否有问题。
-s 字节数 指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
42 第10章 网络管理
10.3 netstat
netstat [选项]
显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运
作。命令中各选项的含义如下:
-a 显示所有socket,包括正在监听的。
-c 每隔1秒就重新显示一遍,直到用户中断它。
-i 显示所有网络接口的信息,格式同“ifconfig -e”。
-n 以网络IP地址代替名称,显示出网络连接情形。
-r 显示核心路由表,格式同“route -e”。
-t 显示TCP协议的连接情况。
-u 显示UDP协议的连接情况。
-v 显示正在进行的工作。
10.4 nslookup
nslookup name
查询一台机器的IP地址和其对应的域名。它通常需要一台域名服务器来提供域名服务。
如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。
不带参数使用nslookup命令时,出现提示符“>”,在后面输入要查询的IP地址或域名
并回车即可。如果要退出该命令,输入exit并回车即可。
itcast@ubuntu:~$ nslookup
> www.itcast.cn
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: www.itcast.cn
Address: 115.29.149.42
>
10.5 finger
finger [-lmsp] user [user@host …] 查询用户的信息,通常会显示系统中某个用
户的用户名、主目录、停滞时间、登录时间、登录shell等信息。如果要查询远程机上的用
户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网
络主机需要运行finger守护进程。 命令中各选项的含义如下:
10.5节 finger 43
-s 显示用户的注册名、实际姓名、终端名称、写状态、停滞时间、登录时间等信息。
-l 除了用-s选项显示的信息外,还显示用户主目录、登录shell、邮件状态等信息,以
及用户主目录下的.plan、.project和.forward文件的内容。
-p 除了不显示.plan文件和.project文件以外,与-l选项相同。
itcast@ubuntu:~$ finger itcast
Login: itcast Name: itcast
Directory: /home/itcast Shell: /bin/bash
On since Mon Sep 8 08:55 (CST) on tty7 14 hours 48 minutes idle
On since Mon Sep 8 21:57 (CST) on pts/1 from :0
11 minutes 18 seconds idle
On since Mon Sep 8 23:12 (CST) on pts/2 from :0
6 seconds idle
No mail.
No Plan.
第 11 章
常用服务器构建
11.1 ftp
11.1.1 ftp服务器
1.安装vsftpd服务器
sudo apt-get install vsftpd
2.配置vsftpd.conf文件
sudo vi /etc/vsftpd.conf
添加下面设置
anonymous_enable=YES
anon_root=/home/itcast/ftp
no_anon_password=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_umask=0022
3.重启服务器,重新加载/etc/vsftpd.conf配置文件
注意:在重启服务器前要在/home/itcast目录下创建好ftp目录。
ubuntu12.04下
sudo /etc/init.d/vsftpd restart
ubuntu14.04下
sudo /lib/init/upstart-job vsftpd restart
46 第11章 常用服务器构建
4.进入你的/home/itcast/ftp目录下创建一个空目录,供用户上传
cd ~/ftp
mkdir anonymous
chmod 777 anonymous
5.测试上传功能,登陆ftp服务器,进入到anonymous目录
ftp IP
cd anonymous
6.上传命令,可以把你当前目录下的文件上传到ftp服务器的anonymous目录
put somefile
get somefile
11.1.2 ftp客户端
Ubuntu 默认已经安装ftp客户端
11.1.3 lftp客户端
lftp也是一种ftp客户程序。它是以文本方式操作的,但是比起图形界面更为方
便。lftp几乎具有bash的所有方便功能,Tab 补全,bookmark, queue, 后台下载等可以
得到支持。用法与ftp类似,主要的指令如下:
put 上传文件
mput 上传多个文件
get 下载文件
mget 下载多个文件
mirror 下载整个目录及其子目录
mirror –R 上传整个目录及其子目录
!command 调用本地shell执行命令command
注意,有的发行版可能缺省没有安装lftp工具,需要用户自己安装。如果是Debian或
Ubuntu系统,则安装lftp软件包。
11.2节 nfs 47
sudo apt-get install lftp
11.2 nfs
1.安装nfs服务器
sudo apt-get install nfs-kernel-server
2.设置/etc/exports配置文件
sudo vi /etc/exports
添加这行配置
/home/用户名/nfs *(rw,sync,no_root_squash)
3.在用户目录下创建nfs目录
mkdir /home/用户名/nfs
4.重启服务器,重新加载配置文件
sudo /etc/init.d/nfs-kernel-server restart
充当nfs服务器的主机,启动服务以后,可以使用showmount -e 查看共享出来的目录
5.在/home/用户名/nfs目录下创建测试文件hello
cd /home/用户名/nfs
touch hello
6.测试服务器,把服务器共享目录nfs挂在到/mnt节点
sudo mount -t nfs -o nolock -o tcp IP:/home/用户名/nfs /mnt
48 第11章 常用服务器构建
7.进入/mnt目录可以看到hello文件,表示构建成功
8.卸载网络共享目录
sudo umount /mnt
* 补充常见错误
(1).虚拟机下,mount 之前使用install nfs-common可以结决虚拟机不能mount实体系统的情况。
(2).如在mount期间出现类似“超级坏块”错误导致无法挂载,很有可能是因为nfs-kernel-server未安装
11.3 ssh
1.安装ssh服务器
sudo apt-get install openssh-server
2.远程登陆
ssh 用户名@IP
使用ssh访问,如访问出现错误。可查看是否有该文件 ~/.ssh/known_ssh 尝试删除该
文件解决。
11.4 scp
远程拷贝文件,scp -r 的常用方法:
1.使用该命令的前提条件要求目标主机已经成功安装openssh-server
如没有安装使用 sudo apt-get install openssh-server 来安装
2.使用格式:
scp -r 目标用户名@目标主机IP地址:/目标文件的绝对路径 /保存到本机的绝对/相对路径
举例:
scp -r [email protected]:/home/itcast/QQ_dir/ ./mytest/lisi
在后续会提示输入“yes”此时,只能输“yes”而不能简单输入“Y”
拷贝单个文件可以不加 -r参数,拷贝目录必须要加。
11.5节 telnet 49
11.5 telnet
明文传输数据,请大家自行测试
第 12 章
其它命令
12.1 终端翻页
Shift-pageup
Shift-pagedown
12.2 man
看手册(叫做manual或man page)。每一个命令和系统函数都有自己的man page。
man man
man read 查看read命令的man page
man 2 read 查看read系统函数的man page(在第二个section中,表示为read(2))
man -k read 以read为关键字查找相关的man page
12.3 clear
清屏。使光标和提示符回到屏幕第一行。
命令:clear
快捷键:Ctrl-l
12.4 alias
alias [-p] name=value …
52 第12章 其它命令
将value字符串起个别名叫name,以后在命令行输入name,shell自动将其解释为
value,如果不带参数执行本命令,或以参数-p执行,则显示当前定义的别名列表。
$ alias
alias ls='ls --color=auto'
alias rm='rm -i'
防止rm误删除,把下面这段代码写到∼/.bashrc里最后面。
mkdir -p ~/.trash
alias rm=trash
trash()
{
mv $@ ~/.trash/
}
12.5 echo
echo [-n] 字符串
在显示器上显示一段文字,一般起到一个提示的作用。其中选项n表示输出文字后不换
行;字符串可以加引号,也可以不加引号。用echo命令输出加引号的字符串时,将字符串原
样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各
字符串之间用一个空格分割。
查看上一个程序退出数值,正常情况程序退出值是0
echo $?
12.6 date
查看当前时间
12.7 umask
umask [-p] -S [mode]
umask指定用户创建文件时的掩码,其中的mode和chmod的命令中的格式一样。如果不用
mode参数,则显示当前的umask设置。如果用-S参数,则以符号形式显示设置。
12.8节 创建终端 53
$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx
比如该用户touch或gedit创建一个文件,则其默认权限为-rw-r-r–,如果该用户创
建一个可执行文件(比如编译生成的程序),则其默认权限为-rwxr-xr-x。也就是说,由于
umask的设定,创建的文件默认是不具有g的w权限和o的w权限的,除非用chmod更改权限。
12.8 创建终端
创建终端标签 Ctrl + Shift + t
切换标签 Alt+n(n=1)
新开终端 Ctrl + Shift + n
第 13 章
关机重启
关机重启这些操作都需要有root权限
13.1 poweroff
13.2 shutdown
shutdown -t 秒数 [-rkhncfF] 时间 [警告讯息]
-t 秒数 : 设定在切换至不同的runlevel之前, 警告和删除二讯号之间的延迟时间(秒).
-k : 仅送出警告讯息文字, 但不是真的要 shutdown.
-r : shutdown 之後重新开机.
-h : shutdown 之後关机.
-n : 不经过 init , 由 shutdown 指令本身来做关机动作.(不建议你用)
-f : 重新开机时, 跳过 fsck 指令, 不检查档案系统.
-F : 重新开机时, 强迫做 fsck 检查.
-c : 将已经正在 shutdown 的动作取消.
例子:
shutdown -r now 立刻重新开机
shutdown -h now 立刻关机
shutdown -k now 'Hey! Go away! now....' 发出警告讯息, 但没有真的关机
shutdown -t3 -r now 立刻重新开机, 但在警告和删除processes 之间, 延迟3秒钟.
shutdown -h 10:42 'Hey! Go away!' 10:42 分关机
shutdown -r 10 'Hey! Go away!' 10 分钟後关机
shutdown -c 将刚才下的 shutdown 指令取消,必须切换至其它tty, 登入之後, 才能下此一指令.
shutdown now 切换至单人操作模式(不加任何选项时)
56 第13章 关机重启
注意事项:
时间参数务必要加: 不是用 now, 便是用 hh:mm 或 mm
now 其实就是 0 的意思.
13.3 reboot
13.4 查看内核版本信息
uname -a
13.5 查看发行版信息
lsb_release -a
13.6 查看空闲内存
free -m
第 14 章
练习
1.创建test目录,在里面创建aa bb cc三个目录,在aa里创建hello文件,在bb里创建
world目录,在cc里创建itcast.c,然后执行tree/ls -R,最后删除test
第 15 章
需要安装的组件
sudo apt-get install openssh-server
sudo apt-get install nfs-kernel-server
sudo apt-get install vsftpd
第 16 章
vim
16.1 vi简介
vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样。
它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需
要对其进行定制。Vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等
其他属性进行编排,它只是一个文本编辑程序。 vi没有菜单,只有命令,且命令繁多。
Vi有三种基本工作模式:
+ 命令模式
+ 文本输入模式
+ 末行模式。
图 16.1: vim模式
16.1.1 命令行模式
任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式;我们
在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也是处于该模式下。在该模式
下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符
都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相
应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合
法命令,Vi会响铃报警。
62 第16章 vim
16.1.2 文本输入模式
在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换
命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保
存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键ESC即可。
16.1.3 末行模式
末行模式也称ex转义模式。在命令模式下,用户按“:”键即可进入末行模式下,此时
Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示
符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容
写到文件中等)。末行命令执行完后,Vi自动回到命令模式。例如:
:sp newfile
则分出一个窗口编辑newfile文件。如果要从命令模式转换到编辑模式,可以键入命令a
或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末
行模式,然后输入命令。
16.2 vim基础操作
进入插入模式:
i: 插入光标前一个字符
I: 插入行首
a: 插入光标后一个字符
A: 插入行未
o: 向下新开一行,插入行首
O: 向上新开一行,插入行首
进入命令模式:
ESC:从插入模式或末行模式进入命令模式
移动光标:
h: 左移
j: 下移
k: 上移
l: 右移
16.2节 vim基础操作 63
M: 光标移动到中间行
L: 光标移动到屏幕最后一行行首
G: 移动到指定行,行号 -G
w: 向后一次移动一个字
b: 向前一次移动一个字
{: 按段移动,上移
}: 按段移动,下移
Ctr-d: 向下翻半屏
Ctr-u: 向上翻半屏
Ctr-f: 向下翻一屏
Ctr-b: 向上翻一屏
gg: 光标移动文件开头
G: 光标移动到文件末尾
删除命令:
x: 删除光标后一个字符,相当于 Del
X: 删除光标前一个字符,相当于 Backspace
dd: 删除光标所在行,n dd 删除指定的行数 D: 删除光标后本行所有内容,包含光标所在字符
d0: 删除光标前本行所有内容,不包含光标所在字符
dw: 删除光标开始位置的字,包含光标所在字符
撤销命令:
u: 一步一步撤销
Ctr-r: 反撤销
重复命令:
.: 重复上一次操作的命令
64 第16章 vim
文本行移动:
>>: 文本行右移
<<: 文本行左移
复制粘贴:
yy: 复制当前行,n yy 复制 n 行
p: 在光标所在位置向下新开辟一行,粘贴
可视模式:
v: 按字符移动,选中文本
V: 按行移动,选中文本可视模式可以配合 d, y, >>, << 实现对文本块的删除,复制,左右移动
替换操作:
r: 替换当前字符
R: 替换当前行光标后的字符
查找命令:
/: str查找
n: 下一个
N:上一个
替换命令:
把abc全部替换成123
末行模式下,将光标所在行的abc替换成123
:%s/abc/123/g
末行模式下,将第一行至第10行之间的abc替换成123
:1, 10s/abc/123/g
同上,但要用户一个个确认是否替换
16.3节 vim分屏操作 65
:%s/abc/123/gc
查看 Man Page:
光标移动到函数上,Shift-k 光标移动到函数上,3Shift-k,查看第三章的 ManPage
查看宏定义:
[-d: 可以查看宏定义,必须先包含此宏所在的头文件
代码排版:
gg=G: 代码自动缩进排版
vim里执行 shell 下命令:
末行模式里输入!,后面跟命令
16.3 vim分屏操作
分屏操作:
sp: 上下分屏,后可跟文件名
vsp: 左右分屏,后可跟文件名
Ctr+w+w: 在多个窗口切换
启动分屏:
1.使用大写O参数进行垂直分屏
$ vim -On file1 file2 ...
2.使用小写o参数进行水平分屏
66 第16章 vim
$ vim -on file1 file2 ...
注: n是数字,表示分屏的数量,n要大于等于文件个数
关闭分屏
1.关闭当前窗口
ctrl+w c
2.关闭当前窗口,如果只剩最后一个,则退出vim
ctrl+w q
编辑中分屏
1.上下分割当前打开的文件
ctrl+w s
2.上下分割,并打开一个新的文件
:sp filename
3.左右分割当前打开的文件
ctrl+w v
4.左右分割,并打开一个新的文件
:vsp filename
分屏编辑中光标的移动
vi中的光标键是h,j,k,l,要在各个屏之间切换,只需要先按一下ctrl+w
1.把光标移动到上边的屏
ctrl+w k
16.3节 vim分屏操作 67
2.把光标移动到下边的屏
ctrl+w j
3.把光标移动到右边的屏
ctrl+w l
4.把光标移动到左边的屏
ctrl+w h
5.把光标移动到下一个的屏
ctrl+w w
移动分屏
1.向上移动
ctrl+w K
2.向下移动
ctrl+w J
3.向右移动
ctrl+w L
4.向左移动
ctrl+w H
屏幕尺寸
1.增加高度
68 第16章 vim
ctrl+w +
2.减少高度
ctrl+w -
3.让所有屏的高度一致
ctrl+w =
4.左加宽度
ctrl+w >
5.右加宽度
ctrl+w <
6.右增加n宽 (如:n=30)
ctrl+w n <
16.4 vim打造IDE
16.4.1 简洁版IDE
C+p: 生成tags
C+]: 跳转到函数定义
C+t:从函数定义返回
C+o:在左侧打开文件列表
F4: 在右侧打开函数列表
C+n:补齐函数,向下翻
vimrc是vim的配置文件,可以修改两个位置
16.4节 vim打造IDE 69
1. /etc/vim/vimrc
2.~/.vimrc
~/.vimrc优先级高
第 17 章
gcc
-v / –v / –version 查看gcc版本号
-I目录 指定头文件目录,注意-I和目录之间没有空格
-c 只编译,生成.o文件,不进行链接
-g 包含调试信息
-On n=0∼3 编译优化,n越大优化得越多
-Wall 提示更多警告信息
-D
-E 生成预处理文件
-M 生成.c文件与头文件依赖关系以用于Makefile,包括系统库的头文件
-MM 生成.c文件与头文件依赖关系以用于Makefile,不包括系统库的头文件
第 18 章
toolchain
binutils 一组用于编译、链接、汇编和其它调试目的的程序,包括ar、as、ld、nm、objcopy、objdump、ranl
等
* gcc 编译器
* glibc 该库实现Linux系统函数,例如open、read等,也实现标准C语言库,如printf
等。几乎所有应用程序都需要与glibc链接
本节主要介绍binutils中的几种主要工具的作用。
* ar 打包生成静态库
* as 汇编器
* ld 链接器。本节前面介绍用gcc完成链接步骤,其实是gcc调用链接器ld,将用户编译
生成的目标文件连同系统的libc启动代码链接在一起形成最终的可执行文件
* nm 查看目标文件中的符号(全局变量、全局函数等)
* objcopy 将原目标文件中的内容复制到新的目标文件中,可以通过不同的命令选项调
整目标文件的格式,比如去除某些ELF文件头
* objdump 用于生成反汇编文件,主要依赖objcopy实现,a.out编译时需要-g,
objdump -dSsx a.out > file
* ranlib 为静态库文件创建索引,相当于ar命令的s选项
* readelf 解读ELF文件头
第 19 章
静态库和共享库
*本节就如何创建和使用程序库进行论述。所谓“程序库”,简单说,就是包含了数据
和执行码的文件。其不能单独执行,可以作为其它执行程序的一部分来完成某些功能。库的
存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便
于升级。程序库可分静态库(static library)和共享库(shared object)。
19.1 静态库
是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分;共享库,是在
执行程序启动时加载到执行程序中,可以被多个执行程序共享使用。
建议库开发人员创建共享库,比较明显的优势在于库是独立的,便于维护和更新;而静
态库的更新比较麻烦,一般不做推荐。然而,它们又各有优点,后面会讲到。
本节所讲述的执行程序和库都采用ELF(Executable and Linking Format)格式,尽管GNU
GCC工具可以处理其它格式,但不在本节的讨论范围。
静态库可以认为是一些目标代码的集合。按照习惯,一般以“.a”做为文件后缀名。使
用ar(archiver)命令可以创建静态库。因为共享库有着更大的优势,静态库已经不经常使
用。但静态库使用简单,仍有使用的余地,并会一直存在。有些Unix系统,如Solaris 10,
已经基本废弃了静态库。
静态库在应用程序生成时,可以不必再编译,节省再编译时间。但在编译器越来越快的
今天,这一点似乎已不重要。如果其他开发人员要使用你的程序,而你又不想给其源码,提
供静态库是一种选择。从理论上讲,应用程序使用了静态库,要比使用动态加载库速度快
1-5%,但实际上可能并非如此。由此看来,除了使用方便外,静态库可能并非一种好的选
择。
要创建一个静态库,或要将目标代码加入到已经存在的静态库中,可以使用以下命令:
ar rcs libmylib.a file1.o
file2.o以上表示要把目标码file1.o和file2.o加入到静态库libmylib.a中(ar的参数
r)。若libmylib.a不存在,会自动创建(ar的参数c)。然后更新.a文件的索引,使之包含新
加入的.o文件的内容(ar的参数s)。
静态库创建成功后,需要链接到应用程序中使用。使用gcc的-l选项来指定静态库,使
用-L参数来指定库文件的搜索路径。比如上述例子应指定-lmylib,所有库文件名都以lib开
头,开头的lib在指定参数时应省略。-l和-L之后都直接带参数而不跟空格。
76 第19章 静态库和共享库
在使用gcc时,要注意其参数的顺序。-l是链接器选项,一定要放在被编译的文件名称
之后;若放在文件名称之前则会连接失败,并会出现莫名其妙的错误。这一点切记。
19.2 共享库
共享库的创建比较简单,基本有两步。首先使用-fPIC或-fpic创建目标文件,PIC或
pic表示位置无关代码,然后就可以使用以下格式创建共享库了: gcc -share -Wl,-
soname,your_soname -o library_name file_list library_list 下面是使用a.c和b.c创建
库的示例:
图 19.1: 共享库命名
19.2.1 基础班使用
gcc -fPIC -c a.c
gcc -fPIC -c b.c
gcc -shared -Wl -o libmyab.so a.o b.o
加载共享库方法:
1.拷贝自己制作的共享库到/lib或者/usr/lib
2.临时设置LD_LIBRARY_PATH, export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
3.永久设置,把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径 设置到∼/.bashrc
或者/etc/profile
4.设置/etc/ld.so.conf, 把库所在路径追加到此配置文件里
19.2.2 就业班使用
gcc -shared -Wl,-soname libmyab.so.1 -o libmyab.so.1.0.1 a.o b.o
按照共享库的命名惯例,每个共享库有三个文件名:real name、soname和linker
name。真正的库文件(而不是符号链接)的名字是real name,包含完整的共享库版本号。
soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函
数的接口一致,因此应用程序的.dynamic段只记录共享库的soname,只要soname一致,这个
共享库就可以用。如libmyab.so.1和libmyab.so.2是两个主版本号不同的libmyab,有些应
用程序依赖于libmyab.so.1,有些应用程序依赖于libmyab.so.2,但对于依赖libmyab.so.1
的应用程序来说,真正的库文件不管是libmyab.so.1.10还是libmyab.so.1.11都可以用,所
以使用共享库可以很方便地升级库文件而不需要重新编译应用程序,这是静态库所没有的优
点。注意libc的版本编号有一点特殊,libc-2.8.90.so的主版本号是6而不是2或2.8。
linker name仅在编译链接时使用,gcc的-L选项应该指定linker name所在的目录。有
的linker name是库文件的一个符号链接,有的linker name是一段链接脚本。例如上面的
libc.so就是一个linker name,它是一段链接脚本:
19.3节 共享库加载 77
19.3 共享库加载
在所有基于GNUglibc的系统中,在启动一个ELF二进制执行程序时,一个特殊的
程序“程序装载器”会被自动装载并运行。在linux中,这个程序装载器就是/lib/ld-
linux.so.X(X是版本号)。它会查找并装载应用程序所依赖的所有共享库。被搜索的目录保
存在/etc/ld.so.conf文件中。当然,如果程序的每次启动,都要去搜索一番,势必效率不
堪忍受。Linux系统已经考虑这一点,对共享库采用了缓存管理。ldconfig就是实现这一功
能的工具,其缺省读取/etc/ld.so.conf文件,对所有共享库按照一定规范建立符号连接,
然后将信息写入/etc/ld.so.cache。 /etc/ld.so.cache的存在大大加快了程序的启动速
度。
1. 修改/etc/ld.so.conf
sudo vi /etc/ld.so.conf
添加你的共享库路径
2. 更新查找共享库的路径
sudo ldconfig -v
3.测试你的程序可否找到共享库
ldd a.out
图 19.2: 共享库静态库优缺点
19.4 项目实战
1.创建一个目录,mycal
mkdir mycal
2.创建4个c文件和1个.h,分别实现加减乘除
add.c
78 第19章 静态库和共享库
int add(int a, int b)
{
return a+b;
}
sub.c
int sub(int a, int b)
{
return a-b;
}
mul.c
int mul(int a, int b)
{
return a*b;
}
dive.c
int dive(int a, int b)
{
return a/b;
}
common.h
#ifndef COMMON_H_
#define COMMON_H_
int add(int a, int b);
int sub(int a, int b);
int dive(int a, int b);
int mul(int a, int b);
#endif
3.制作静态库
gcc -c add.c sub.c mul.c dive.c
ar rcs libmycal.a add.o sub.o mul.o dive.o
4.制作共享库
19.4节 项目实战 79
gcc -c -fPIC add.c sub.c mul.c dive.c
gcc -shared -Wl,-soname,libmycal.so.1 -o libmycal.so.1.10 add.o sub.o mul.o dive.o
5.设置共享库加载路径
打开共享库路径配置文件
sudo vi /etc/ld.so.conf
最后一行添加mycal路径
/home/itcast/mycal
更新共享库加载路径
sudo ldconfig -v
此时可以看到自动创建出来了,so name libmycal.so.1
手动添加link name
ln -s libmycal.so.1.10 libmycal.so
6.编写测试文件main.c,分别去链接静态库和共享库,进行测试
main.c
#include
#include "common.h"
int main(void)
{
printf("%d\n", add(5, 3));
return 0;
}
第 20 章
gdb调试工具
程序中除了一目了然的Bug之外都需要一定的调试手段来分析到底错在哪。到目前为止
我们的调试手段只有一种:根据程序执行时的出错现象假设错误原因,然后在代码中适当的
位置插入printf,执行程序并分析打印结果,如果结果和预期的一样,就基本上证明了自己
假设的错误原因,就可以动手修正Bug了,如果结果和预期的不一样,就根据结果做进一步
的假设和分析。本章我们介绍一种非常强大的调试工具gdb,可以完全操控程序的运行,使
得程序就像你手里的玩具一样,叫它走就走,叫它停就停,并且随时可以查看程序中所有的
内部状态,比如各变量的值、传给函数的参数、当前执行的语句位置等。掌握了gdb的用法
以后,调试的手段就更加丰富了。但要注意,即使调试的手段非常丰富了,其基本思想仍然
是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环,根据现象如何假
设错误原因,以及如何设计新的现象去验证假设,这都需要非常严密的分析和思考,如果因
为手里有了强大的工具就滥用,而忽视了严谨的思维,往往会治标不治本地修正Bug,导致
一个错误现象消失了但Bug仍然存在,甚至是把程序越改越错。本章通过几个初学者易犯的
错误实例来讲解如何使用gdb调试程序,在每个实例后面总结一部分常用的gdb命令。
gcc -g main.c -o main
常用命令
| 命令 | 简写 | 作用 |
|---------------------+------+------------------------------------------------------|
| help | h | 按模块列出命令类 |
| help class | | 查看某一类型的具体命令 |
| list | l | 查看代码,可跟行号和函数名 |
| quit | q | 退出gdb |
| run | r | 全速运行程序 |
| start | | 单步执行,运行程序,停在第一行执行语句 |
| next | n | 逐过程执行 |
| step | s | 逐语句执行,遇到函数,跳到函数内执行 |
| backtrace | bt | 查看函数的调用的栈帧和层级关系 |
| info | i | 查看GDB内部局部变量的数值,info breakpoints |
| frame | f | 切换函数的栈帧 |
| finish | | 结束当前函数,返回到函数调用点 |
| set | | 设置变量的值 set var n=100 |
| run argv[1] argv[2] | | 调试时命令行传参 |
82 第20章 gdb调试工具
| print | p | 打印变量和地址 |
| break | b | 设置断点,可根据行号和函数名 |
| delete | d | 删除断点 d breakpoints NUM |
| display | | 设置观察变量 |
| undisplay | | 取消观察变量 |
| continue | c | 继续全速运行剩下的代码 |
| enable breakpoints | | 启用断点 |
| disable breakpoints | | 禁用断点 |
| x | | 查看内存 x /20xw 显示20个单元,16进制,4字节每单元 |
| watch | | 被设置观察点的变量发生修改时,打印显示 |
| i watch | | 显示观察点 |
| core文件 | | ulimit -c 1024 开启core文件,调试时 gdb a.out core |
20.1 gdb调试模式
* run 全速运行
* start 单步调试
* set follow-fork-mode child
第 21 章
Makefile项目管理
21.1 用途
+ 项目代码编译管理
+ 节省编译项目时间
+ 一次编写终身受益
+ 操作示例文件:add.c sub.c mul.c dive.c main.c
21.2 基本规则
Makefile由一组规则组成,规则如下:
目标:依赖
(tab)命令
如:add.o:add.c
(一个tab缩进)gcc –Wall –g –c add.c –o add.o
目标:要生成的目标文件
依赖:目标文件由哪些文件生成
命令:通过执行该命令由依赖文件生成目标
21.2.1 三要素
* 目标
* 条件
* 命令
21.3 Makefile 工作原理
基本原则:
1.若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来
生成该依赖文件
84 第21章 Makefile项目管理
2.检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任一个被更
新,则目标必须更新
* 分析各个目标和依赖之间的关系
* 根据依赖关系自底向上执行命令
* 根据修改时间比目标新,确定更新
* 如果目标不依赖任何条件,则执行对应命令,以示更新
21.4 Makefile 变量
在Makefile中使用变量有点类似于C语言中的宏定义,使用该变量相当于内容替换,
使用变量可以使Makefile易于维护,修改内容变得简单
变量定义及使用:
foo = abc
bar = $(foo)
定义了两个变量:foo、bar,其中bar的值是foo变量值的引用。
1、变量定义直接用'='
2、使用变量值用$(变量名)
通常我们在Makefile中会定义一些变量,方便Makefile的修改维护
src = main.c func1.c func2.c
CC = gcc #arm-linux-gcc
CPPFLAGS : C预处理的选项 如:-I
CFLAGS:C编译器的选项 –Wall –g -c
LDFLAGS :链接器选项 –L -l
自动变量:
$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项。
模式规则:
至少在规则的目标定义中要包含’%‘,’%‘表示一个或多个,在依赖条件中同样可以
使用’%‘,依赖条件中的’%’的取值,取决于其目标:
模式规则示例:
21.5节 Makefile 函数 85
%.o:%.c
$(CC) –c $(CFLAGS) $(CPPFLAGS) $< -o $@
其中,“$@”表示依次取出目标值,$<表示依次取出依赖条件。
注意:只有写成模式规则的时候,$<才表示了所有依赖条件的依次取值,否则只是取依
赖条件中的第一个。
21.5 Makefile 函数
src = $(wildcard *.c)
找到当前目录下所有后缀为.c的文件,赋值给src
obj = $(patsubst %.c,%.o, $(src))
把src变量里所有后缀为.c的文件替换成.o
21.6 clean
* 用途:清除编译生成的中间.o文件和最终目标文件
* make clean 如果当前目录下有同名clean文件,则不执行clean对应的命令
* 伪目标声明:.PHONY:clean
* clean命令中的特殊符号
– “-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
– “@”不显示命令本身,只显示结果。如:“@echo”clean done“”
* 其它
– make 默认执行第一个出现的目标,可通过make dest指定要执行的目标
– distclean目标
– install目标
– make -C 指定目录 进入指定目录,调用里面的Makefile
– make -n:只打印要执行的命令,不会真正执行命令
– make -p:显示隐含规则数据库中的信息
– make -C:切换到另一个目录中执行该目录下的Makefile
– make -f:-f执行一个makefile文件名称,使用make执行指定的makefile
86 第21章 Makefile项目管理
图 21.1: Makefile