Linux系统学习笔记:日常使用和管理
回到有关Linux系统的环境。Linux系统是多用户的操作系统,对用户管理有非常完善的支持,有简单高效的文件系统,还有大量的实用工具满足日常工作的需要。本篇总结Linux系统的常用命令、用户特性和文件系统。
常用命令
Linux下的命令工具非常丰富,并且数量还在不断地增长。
Linux的最常用命令包括:
man 查看man手册页
info 查看Texinfo文档
ls 显示文件名或文件列表,以及文件的相关属性信息
rm 删除文件
cp 复制文件
mv 移动文件,重命名
lpq lpr lprm 打印文件
cat 显示文本文件内容,可以用来拼接文件
less more 分屏显示文件
head tail 显示文件头部和尾部
sort 排序文件内容
uniq 忽略文件中的重复行
diff 比较两个文件
file 不打开文件,查看文件的信息
grep 查找字符串
echo 显示文本
date 显示日期和时间
script 记录会话信息
unix2dos dos2unix Linux文本文件和Windows文本文件的相互转换
tar 文件归档和解档
gzip gunzip zcat .gz文件压缩、解压和查看
bzip2 bunzip2 bzcat .bz2文件的压缩、解压和查看
which whereis 查找命令等的完整路径
apropos whatis 在man中搜索关键字,给出简要描述
locate 查找文件的完整路径
who w {who am i} 显示登录用户的信息
hostname 显示主机名
帮助
大部分命令可以通过 -h 或 --help 选项来查看简要的帮助信息。
更详细的帮助文档以 man 手册页的组织。手册页一般分为9节:
用户级命令和应用程序。
系统调用和内核出错代码。
库调用。
设备驱动程序和网络协议。
标准文件格式。
游戏和演示。
各种文件和文档。
系统管理命令。
少见隐秘的内核规范和接口。
可以用 manpath 命令查看 man 的搜索路径。可以设置 MANPATH 环境变量来覆盖默认路径,也可以在/etc/manpath.config 中设置。手册页一般以 .gz 格式压缩。
$ manpath
/usr/local/man:/usr/local/share/man:/usr/share/man
man 通过 less 命令显示手册页,可以通过设置 PAGER 环境变量来修改。获取手册页使用 man [sec] name命令,也可以用 -k 选项来按关键字查找。
另一种帮助文档是Texinfo文档,使用 info 命令查看。
路径操作
用于路径操作的 ls 等命令可算是最为常用的命令了。它们用来管理文件、目录等的路径。后面总结文件系统时会再详细说明它们。
文件操作
文件操作的命令一般用于文本文件。
如创建文件 a.txt :
$ cat > a.txt # 将标准输入重定向到文件
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
^C
$ cat b.txt # 显示文件内容
Monday
Tuesday
Tuesday
Thursday
Friday
Saturday
Sunday
$ head -3 a.txt # 查看开头3行
Monday
Tuesday
Wednesday
$ tail -f a.txt # 查看内容不断增长的文件,多用于日志查看
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
^C
$ sort a.txt # 排序
Friday
Monday
Saturday
Sunday
Thursday
Tuesday
Wednesday
$ uniq b.txt # 去掉重复行
Monday
Tuesday
Thursday
Friday
Saturday
Sunday
$ diff -u a.txt b.txt # 比较文件,-u显示不同
--- a.txt 2012-03-08 15:34:00.340179508 +0800
+++ b.txt 2012-03-08 15:41:12.404569605 +0800
@@ -1,6 +1,6 @@
Monday
Tuesday
-Wednesday
+Tuesday
Thursday
Friday
Saturday
$ file a.txt # 查看文件信息
a.txt: ASCII text
$ grep -in --color sat *.txt # 查找字符串,-i不区分大小写,-n显示行号
a.txt:6:Saturday
b.txt:6:Saturday
grep 命令对单个文件可以使用 -H 始终显示文件名,对目录可以使用 -r 递归查找。
几个实用工具
有几个常用的如 echo 、 date 等命令,完成一些日常操作。
$ date --rfc-3339=s # =date会只显示日期
2012-03-08 15:59:57+08:00
压缩归档
Linux下的压缩工具有很多种,最常用的是 gzip 和 bzip2 。一般使用 tar 直接将文件或目录归档然后压缩,它们也可以分开独立使用。
$ tar czf w.tar.gz a.txt b.txt
$ tar xzf w.tar.gz
$ tar cjf w.tar.bz2 a.txt b.txt
$ tar xjf w.tar.bz2
一般把通过 tar 归档然后直接压缩的包命名为 .tar.XX 的形式,以区别于单独压缩的 .gz 和 .bz2 文件。
查找命令
为确定一个命令是否存在,可以使用 which 命令查找它是否在搜索路径中,但它在Debian上不显示用户没有执行权限的命令,这时可以用 whereis 在更大范围进行查找。
还可以使用 locate 在整个文件系统查找,它可以找到任何类型的文件。 locate 的数据库通常由 updatedb命令定时生成。
$ which ifconfig # 没找到,权限不够
$ whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
$ locate ifconfig
/sbin/ifconfig
/usr/share/man/de/man8/ifconfig.8.gz
/usr/share/man/fr/man8/ifconfig.8.gz
/usr/share/man/man8/ifconfig.8.gz
/usr/share/man/pt_BR/man8/ifconfig.8.gz
查看用户信息
w 和 who 可以分别以详细的和简略的方式查看用户信息, who am i 查看当前登录用户的身份。
$ w
16:13:50 up 3:34, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yeolar pts/0 yeolar-pc.local 13:27 2:05 1.04s 1.04s -bash
yeolar pts/1 yeolar-pc.local 16:11 0.00s 0.36s 0.00s w
yeolar pts/2 yeolar-pc.local 16:13 8.00s 0.38s 0.08s sshd: yeolar [priv]
$ who
yeolar pts/0 2012-03-08 13:27 (yeolar-pc.local)
yeolar pts/1 2012-03-08 16:11 (yeolar-pc.local)
yeolar pts/2 2012-03-08 16:13 (yeolar-pc.local)
$ who am i
yeolar pts/1 2012-03-08 16:11 (yeolar-pc.local)
用户
Linux系统上的每个文件和进程都属于特定的用户帐号。如果没有得到属主的许可,其他用户就不能访问这些对象。系统文件和进程属于 root 虚拟用户,也称为超级用户。Linux是多用户系统,用户和权限的划分保障了Linux系统的多用户安全。
每个文件都有一个属主和一个属组。文件的属主指定属组成员可以对文件做哪些操作,这样可以让一些成员共享文件。Linux用数字来确定属主和属组。用户ID(UID)映射到 /etc/passwd 文件中的用户名上,组ID(GID)映射到 /etc/group 文件中的组名上。UID和GID对应的文字名称是用来方便用户的使用。
进程的属主可以向该进程发送信号,或者降低该进程的优先级。进程有7个相关的ID,包括3个UID(真实、有效、保存)、3个GID(真实、有效、保存)和1个文件系统UID。
超级用户
root 帐号的UID为0,超级用户被允许在任何文件或进程上执行正当的操作,有些系统调用只能够由超级用户执行。
为保障安全性, root 帐号的密码的长度应该至少为8个字符。
为了执行一些系统级的操作,经常会需要成为 root 用户,直接用 root 帐号登录的方法并不好,不安全的因素增加,而且也无法区分究竟是谁做了哪些操作。有两种方法从普通用户切换到 root 用户,一是使用su 命令,另一个是使用 sudo 命令。
不加参数的 su 命令切换到 root 帐号,加用户名作为参数会切换到该用户帐号,使用 - 会同时将路径切换到该用户的主目录。
sudo 以要执行的命令为参数,以 root 身份(或其他用户)执行。配置文件 /etc/sudoers 设置授权使用sudo 的用户和允许执行的命令,使用 visudo 命令来修改 /etc/sudoers 。 sudo 有一个可设置的超时时间。 sudo 会保存一个日志,保存命令执行相关的命令、主机、用户、目录和时间。
伪用户
系统中还定义了几个伪用户,一般是用 * 代替它们在 /etc/passwd 中的密码字段,使它们不能用来登录。几个常见的如 bin (系统命令的属主)、 daemon (无特权的系统软件的属主)、 nobody (普通NFS用户)。
/etc/passwd文件
/etc/passwd 文件是系统能够识别的用户的清单,在登录时,系统查询该文件来确定用户的UID并验证密码。
每一行为一个用户,包含如下字段:
用户名。
经过加密的密码或占位符 x 。
数值用户ID。
数值组ID。
用户信息:全名、办公室、分机号、住宅电话。
初始工作目录。
登录shell。
现在通常将加密的密码放在 /etc/shadow 文件中,这称为隐蔽口令系统,使用这种机制时, /etc/passwd中的密码字段写作 x 。可以用 vipw 命令编辑该文件。可以用 pwconv 命令让 shadow 文件的内容和 passwd文件的内容保持一致。
/etc/group文件
/etc/group 文件包含了组的名称和每个组中的成员的列表。
每一行为一个组,包含如下字段:
组名。
加密的密码或 x ,后者表示有一个 /etc/gshadow 文件。
数值组ID。
成员列表,以逗号隔开。
组的密码很少使用,一般将其设为 * 。
帐号管理
可以手工创建和删除用户。一般为了方便,使用 useradd 命令创建用户, usermod 和 userdel 可以修改和删除用户。
可以用 usermod -L user 和 usermod -U user 对用户上锁和解锁,禁止用户的登录。
passwd 命令可以修改用户的密码。
登录账户记录
Linux在 /var/run/utmp 文件中记录当前登录系统的用户,在 /var/log/wtmp 文件中记录登录和注销事件。分别由 who 和 last 命令读取和打印记录。
文件系统
文件系统的类型常见的有EXT2、EXT3和EXT4,Linux现在还支持Windows下的FAT和NTFS类型。还有一些使用不是很广泛的如IBM的JFS类型。
在 /etc/fstab 文件中包含了和文件系统相对应的设备的清单。
df 命令查看文件系统的大小。
$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 78G 3.7G 71G 5% /
通过 mount 和 umount 命令安装和卸载文件系统,如:
# mount /dev/hda5 /users
将磁盘分区上 /dev/hda5 表示的文件系统安装到路径 /users 下。
可以把新建的文件系统添加到 /etc/fstab 文件中来自动安装。
在卸载时,如果内核说明设备忙,可以运行 fuser -mv mpoint 来查看正在使用文件系统上的资源的进程。fuser -v file 可以查看特定文件的使用,使用 -k 选项可以杀死所有带来麻烦的进程。一个更强大的替代程序是 lsof 。
fsck 命令可以检查和修复文件系统,通常文件和数据块的错误引用可以通过它来修复。
组织结构
在Linux下,不同的文件按照约定被放到一些路径下,通常安装程序会对文件的位置做一些假设,因此应该尽可能地保持这一默认的文件树结构。
/bin 最小系统所需的命令
/boot 内核和加载内核所需的文件
/dev 终端、磁盘等的设备项
/etc 关键的启动文件和配置文件
/home 用户的主目录
/lib C编译器的库和部分C编译器
/media 可移动介质上的文件系统的安装点
/opt 可选的应用软件包
/proc 所有正在运行的进程的映像
/root 超级用户的主目录
/sbin 引导、修复或恢复系统的命令
/tmp 临时空间(重启时删除)
/usr 次要文件和命令的层次结构
/usr/bin 大多数命令和可执行文件
/usr/include 编译C程序的头文件
/usr/lib 库
/usr/local 本地软件(用户编写或安装的)
/usr/local/bin 本地的可执行文件
/usr/local/etc 本地系统的配置文件和命令
/usr/local/lib 本地库
/usr/local/sbin 静态链接的本地系统维护命令
/usr/local/src /usr/local/* 的源代码
/usr/man 联机用户手册
/usr/sbin 次要的系统管理命令和修复命令
/usr/share 多种系统共同的东西
/usr/share/man 联机用户手册
/usr/src 非本地软件包的源代码
/var 系统专用数据和配置文件
/var/log 系统日志文件
/var/spool 假脱机目录(打印机、邮件等使用)
/var/tmp 临时空间(重启时保留)
文件类型
Linux中有7种文件类型:普通文件、目录、字符设备文件、块设备文件、套接字、命名管道、符号链接。
文件类型 ls 中的符号 创建方式 删除方式
普通文件 - 编辑器、 cp 等 rm
目录 d mkdir rmdir 、 rm -r
字符设备文件 c mknod rm
块设备文件 b mknod rm
套接字 s socket(2) rm
命名管道 p mknod rm
符号链接 l ln -s rm
普通文件就是一个数据包,Linux没有对它规定任何结构。
目录包含按名字对其他文件的引用。 . 和 .. 分别代表目录本身和它的父目录。文件的名称存储在它的父目录中,而不是存在文件本身处。可以有多个目录同时引用一个文件,并且可以有不同的名称,这种类型的引用称为硬链接,使用 ln 命令创建,Linux维护指向每个文件的链接的计数。硬链接不能跨文件系统。
设备文件使程序能够同系统的硬件和外围设备进行通信。字符设备文件让相关的驱动程序做它们自己的输入和输出缓冲。块设备文件由处理块数据I/O的驱动程序使用,内核为它们提供缓冲。设备文件用两个数字表示其特征,分别为主设备号和次设备号,主设备号对应哪个驱动程序,次设备号对应寻址的物理单元。
套接字是进程间通信的一种方式。本地域套接字只能从本地访问,通过文件系统对象使用,也称为UNIX域套接字。
命名管道也是同一主机上进程间通信的方式。
符号链接也称软链接,符号链接是通过文件名称的引用,而不是硬链接的直接引用。内核查找路径时遇到符号链接时,就重定向到链接存储的路径名上。
文件属性
Linux文件系统中,每个文件有一个16位的字存储的属性信息,其中包括12位模式位和4位文件类型信息,模式位又分为9个控制用户读写和执行权限的权限位和3个和可执行程序运行相关的权限位。
9个权限位分为三组,分别设置用户、组和其他人的读取、写入和执行权限。另外3个权限位为 setuid 位、setgid 位和粘住位。经常用八进制的数来表示权限位。
值 权限位 值 权限位 值 权限位 值 权限位
4000 setuid 400 用户读权限 40 组读权限 4 其他读权限
2000 setgid 200 用户写权限 20 组写权限 2 其他写权限
1000 粘住位 100 用户执行权限 10 组执行权限 1 其他执行权限
对可执行文件设置 setuid 位和 setgid 位使程序可以访问执行程序的用户无权访问的文件和进程。对目录设置 setgid 位使目录中新建的文件具有目录的组权限而不是创建文件的用户的组。对目录设置粘住位后,必须是目录的用户、文件的用户或超级用户,才可以删除或重命名目录中的文件。
在 ls -l 命令中,分别用 r 、 w 、 x 表示读、写、执行权限, setuid 、 setgid 、粘住位分别在用户、组和其他的执行权限位上用 S 、 S 、 T 表示,同时设置了对应的可执行权限时用小写表示。
ls -l 命令的输出的其他项为硬链接数、用户、组、大小、修改日期、路径。
使用 chmod 命令修改权限,使用 chown 命令改变用户和组。
$ chmod 755 dir
$ chmod -R u+w dir
$ chmod ug=srx,o= file
$ chown -R yeolar:yeolar dir
硬盘
关于硬盘的知识这里不进行详细说明,可以看一些相关的参考书。
目前常见的硬盘接口有PATA(IDE)、SATA和SCSI,SATA是IDE的后续技术。在Linux系统中,一般用sdxn 形式的名称表示SCSI硬盘, x 为 a b c ... 代表不同的硬盘, n 为数字代表不同的分区。用 hdxn 形式的名称表示IDE和SATA硬盘, x 和 n 的含义和SCSI硬盘的一样。
为硬盘分区使用 fdisk 命令。创建文件系统和交换分区使用如 mke2fs 和 mkswap 命令, swapon 命令启用交换分区。
Linux的硬盘管理有两个重要的工具:RAID和LVM。Linux内核提供了创建软RAID的支持,一般使用 mdadm命令。LVM是一种可选的子系统,使用它可以将多个硬盘组成卷组,分配为逻辑卷,还可以动态改变逻辑卷的大小。
USB设备
lsusb 命令列出内核已经发现的USB设备。内核用什么设备文件表示已发现的设备可以查看系统日志/var/log/kern.log 。