本节内容:
Linux文件权与目录
1 三种身份
拥有者
信息存储位置
root: /etc/passwd
usr : /etc/shadow
group
群组
信息存储位置
/etc/group
others
其它人
2 三种权限
write
execute
3 ls示例
drwxrwxr-x 4 minix007 minix007 4096 10月 24 16:08 texmf/
drwxr-xr-x 4 root root 4096 10月 24 15:52 .texmf-var/
-rw-r–r– 1 minix007 minix007 570 11月 27 21:39 .vimrc
3.1 权限解释
3.1.1 档案类型
d:目录
-:文件
l:链接
3.1.2 owner权限
w:写
x:执行
3.1.3 group权限
3.1.4 others权限
4 改变文件属性及权限
4.1 改变拥有者
4.2 改变组
4.3 改变权限
4.3.1 数字
r:4,w:2,x:1,-:0
rwx:4+2+1=7
rw-:4+2+0=6
---:0+0+0=0
rwxrw----:760
改变权限
chmod 760 filename
4.3.2 符号
chmod a+x filename # 去除执行权限
chmod a-x filename # 增加执行权限
5 文件与目录权限
对目录而言,x权限代表可否cd到这个目录,r权限代表可否ls这个目录
6 Linux目录配置依据–FHS(FileSystem Hierarchy Standard)
在特定的目录放置特定的文件,重点在于规范每个特定的目录下应该要放置什么样的数据。
本节内容:
Linux程序管理
SELinux基础
1 什么是程序
程序文件:通常以二进制文件的形式存放在储存介质中
程序与权限:程序被执行时,执行者的权限与属性,程序的代码,(二进制文件内容)等数据会被操作系统加载到内存中, 操作系统给予这个内存中的单元一个标识符(PID)。
子程序与父程序:登录系统后会取得一个shell,例如bash程序。在这个bash中启动另一个bash,新启动的bash即是原来bash 的子程序,原来的bash是新bash的父程序。可以通过Parent PID(PPID)得知一个程序的父程序。
例子:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 7538 7530 5 80 0 - 2315 wait pts/1 00:00:00 bash
0 R 1000 7598 7538 0 80 0 - 1177 - pts/1 00:00:00 ps
minix007:~$ bash
minix007:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 7538 7530 0 80 0 - 2315 wait pts/1 00:00:00 bash
0 S 1000 7599 7538 9 80 0 - 2316 wait pts/1 00:00:00 bash
0 R 1000 7655 7599 0 80 0 - 1177 - pts/1 00:00:00 ps
第一次输入ps -l,发现两个程序,第一个bash是我们正在使用的shell,PID为7538,第二个为ps,是我们刚刚在这个 shell中启动的程序,可以看到ps的PPID是7538,即其父程序PID为7538。 第二个命令启动了另一个bash,可以看到此bash的PID为7599。其PPID为7538,即正在使用的shell的PID 第三个命令启动了ps程序,可以看到这个ps程序的PPID为7599,即其父程序为刚刚启动的bash。
fork and exec 程序的启动过程:
先由父程序fork一个一模一样的子程序,此子程序再以exec的方式执行真正要执行的程序。
常驻内存的程序: 平时执行的命令,如ls,执行一次就完了,但是有些程序需要一直执行,比如检测程序,这些程序就 常驻在内存。
Linux的多人多任务环境 Linux可以供多人同时登录系统,并且互不干扰,每个人像是在独立地使用计算机。
Linux中默认提供了六个命令行终端和 一个图形终端:tty1~tty7。
其中tty7是图形终端。
Ubuntu中可以通过Ctrl+Alt+F1~F7切换这7个终端。
当一个终端中程序 死掉时,可以切换到其它终端,用ps -aux查看哪个程序出错,然后kill掉.
2 工作管理(job control)
将程序放入后台执行
为什么:
如果一个程序执行时间很长,在shell中执行它,就要等待它执行完以后才能输入下一个命令,Linux是多 任务的操作系统,这样一来,就变成了一个命令一个命令地执行,为了执行一个程序的同时可以继续使用终端,可以将 程序放入后台执行,这样一来就不影响终端在前台的使用。
怎么做:
可以在要执行的程序命令后加上 & 符号,例如:
注意:
后台执行的程序不能和用户交互,不能用ctrl+c中断。
在vim中输入Ctrl+Z可以将vim暂时调入后台,从而可在 前台执行命令,又不退出vim。
观察后台程序状态: jobs
[1]+ Stopped vim t.c
$ jobs -l
[1]+ 8705 Stopped vim t.c
将后台程序调入前台执行:fg %num # num是job的id号
vim t.c
将后台程序暂停与恢复执行
bg %num:恢复后台中暂停的程序
将程序停止或重启:kill
脱机时仍然执行:nohup
$ nohup ./foo.sh &
此时,即使你注销,系统仍然会执行foo.sh程序
3 程序管理
程序观察
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 8594 8583 0 80 0 - 2318 wait pts/1 00:00:00 bash
0 T 1000 8828 8594 0 80 0 - 12020 signal pts/1 00:00:00 vim
0 R 1000 8877 8594 0 80 0 - 1177 - pts/1 00:00:00 ps
F:程序权限
S:程序状态
R:运行态,S:睡眠态,可唤醒,D:不可唤醒的睡眠态,如等待I/O
T:停止态,Z:僵尸态,程序已经终止但无法被移出内存
UID:启动程序的用户的ID
PID:程序标识
PPID:父程序标识
C:cpu使用率
PRI/NI:与优先级有关
ADDR/SZ/WCHAN:与内存有关,ADDR:内存哪个部分,SZ:占用内存大小,WCHAN:运行状态,-表示正在运行
TTY:登录的终端位置
TIME:使用掉的CPU时间
CMD:使用的命令
ps aux:观察系统中所有运行的程序
minix007 8828 0.0 0.2 48080 8568 pts/1 Tl 21:29 0:00 vim t.c
root 8988 0.6 0.0 0 0 ? S 21:40 0:03 [kworker/1:2]
root 9045 0.2 0.0 0 0 ? S 21:45 0:00 [kworker/1:1]
minix007 9100 0.0 0.0 4948 1176 pts/1 R+ 21:49 0:00 ps aux
VSZ:该程序占用的虚拟内存量
RSS:该程序占用的固定内存量
top:动态观察程序变化
Tasks: 193 total, 2 running, 189 sleeping, 1 stopped, 1 zombie
Cpu(s): 0.5%us, 1.8%sy, 0.0%ni, 97.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3962820k total, 3283620k used, 679200k free, 400800k buffers
Swap: 3905532k total, 0k used, 3905532k free, 1915036k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9156 root 20 0 0 0 0 R 4 0.0 0:00.21 kworker/0:1
1900 minix007 20 0 247m 71m 32m S 3 1.8 15:53.01 compiz
1089 root 20 0 126m 65m 8904 S 1 1.7 7:30.94 Xorg
18 root 20 0 0 0 0 S 1 0.0 0:44.87 kworker/3:0
1969 minix007 20 0 113m 20m 10m S 0 0.5 1:06.10 unity-panel-ser
6651 minix007 20 0 268m 26m 8880 S 0 0.7 0:53.59 chrome
操作:按P按CPU使用率排序,按M按内存使用率排序,按r修改NI值,按h帮助,按q退出。
pstree:显示程序树,可以看到程序之间的关系。
程序管理
基本原理:可以通过发送给程序一个信号,告诉程序你想让它做什么。这些信号包括SIGNUP(重新启动), SIGINT(相当于ctrl+c)等等,可用man 7 signal查询详细信息。
基本方式
killall processName
killall emacs
程序执行的优先级
priority(PRI):PRI越低表示越优先,由内核动态调整,用户无法改变
nice
PRI(new) = PRI(old) + nice,所以可以通过nice值调整PRI,但并不是修改后就能生效,系统还要去分析判断。
nice值设定方式
方式一:启动程序时,用 nice -n command 设定,n为nice值,范围-20~19
方式二:程序已经启动,用 renice [number] PID 设定
系统资源观察
free: 观察内存
total used free shared buffers cached
Mem: 3962820 2067520 1895300 0 379912 925868
-/+ buffers/cache: 761740 3201080
Swap: 3905532 0 3905532
uname: 查看系统和内核信息(eg: uname -a)
Linux minix007-ubuntu-desktop 3.2.0-37-generic-pae #58-Ubuntu SMP Thu Jan 24 15:51:02 UTC 2013 i686 i686 i386 GNU/Linux
uptime: 观察系统启动时间和工作负载
15:14:15 up 4:31, 2 users, load average: 0.23, 0.24, 0.23
netstat: 查看网络状态
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 1 0 minix007-ubuntu-des:44769 mistletoe.canonica:http CLOSE_WAIT
tcp 0 0 minix007-ubuntu-des:37063 112.90.137.192:http ESTABLISHED
dmesg:
查看内核产生的信息 开机时,内核会检测硬件信息,运行中,内核也会产生一些信息,这些信息被放在内存中一个受保护的区域,使用 dmesg可以得到这些信息。
vmstat:
侦测系统资源变化
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 1889048 380780 929772 0 0 17 14 160 286 2 2 96 1
2 0 0 1889172 380780 929772 0 0 0 0 435 788 1 1 99 0
2 0 0 1889164 380780 929772 0 0 0 0 428 767 1 1 99 0
4 特殊文件与程序
SUID/SGID/SBIT与程序权限的关系
passwd:为什么普通用户执行passwd时拥有了root权限?这是因为执行passwd时,会取得一个新的程序与PID,该PID 产生时通过SUID赋予这个程序相应权限。
/proc:内存中运行的程序都以文件或目录的形式存在于/proc目录下。
fuser:找出使用指定文件,文件系统,或目录的程序。例如使用umount时发现[device is busy],就可以使用fuser找出哪个程序在使用 文件系统。
lsof:找出程序使用的文件
pidof:找出正在执行的程序的PID
7021
5 SELinux初探
SELinux是什么:
Security Enhanced Linux,安全强化的Linux。
SELinux是在进行程序,档案等细部权限设定 依据的一个核心模块。
本节内容:
Linux开机流程
Linux模块管理
Linux Loader加载
1 Linux开机流程
1.1 总体流程
加载BIOS的硬件信息并进行自我检测,取得设定的第一个开机设备
读取并执行第一个开机设备内的MBR的Boot Loader
根据Boot Loader的设定加载内核(Kernel),内核会开始检测硬件,加载驱动程序
硬件驱动成功后,内核会调用init程序,init程序取得run level信息
init 执行 /etc/rc.d/rc.sysinit 文件来准备软件的作业环境(如网络,时区等)
init 执行 run level 的各个服务的启动(通过shell script的方式)
init 执行终端仿真程序启动login程序,等待用户登录
1.2 详细过程
BIOS,Boot Loader与内核载入 开机后系统首先加载BIOS(Basic Input Output System),并通过BIOS程序加载CMOS信息,由CMOS取得 主机的各项硬件配置,如CPU与各个设备沟通频率,开机装置搜索顺序,硬盘大小与类型等。BIOS会指定 开机装置,好从中读取操作系统内核,由于各个操作系统文件系统格式不同,因此需要一个开机管理程序 处理内核加载,这个开机管理程序就是Boot Loader。这个Boot Loader位于开机装置的第一个扇区内, 即MBR(Master Boot Record,主引导记录)。
Boot Loader作用 每个文件系统都会保留一块启动扇区(Boot sector)给操作系统,用于安装Boot Loader,通常操作系统 都会安装一份Boot Loader到其根目录所在文件系统的Boot sector下。Linux安装时可以选择是否将Boot Loader安装到MBR上,如果安装了,那么MBR和Boot sector上都会保留一份Boot Loader。Windows安装时 没有选择,会在MBR和Boot sector上都会安装Boot Loader。系统只有一个MBR,所以安装多系统时,可能会 被覆盖。
Boot Loader的作用在于:
提供菜单选择要载入的操作系统
载入内核,直接启动操作系统
转交其它Boot Loader
Windows的Boot Loader没有转交其它Boot Loader的能力,不能启动Linux所以安装Windows/Linux双系统 时要先安装Windows, 再安装Linux,这样可以用Linux的Boot Loader覆盖Windows的Boot Loader。
注:鸟哥在写此文章时Windows无此能力,现在的Windows 7已经可以了,我安装的双系统就是MBR上装有Windows 的Boot Loader,提供两个菜单,一个是启动Windows,另一个是转交Linux的Boot Loader,选入Linux后,就会进入 Linux的Boot Loader,这时会进入Grub,再次提供选择菜单。
加载内核 由Boot Loader开始读取内核后,Linux会将内核解压到内存中,此后内核会检测硬件信息,从BIOS手中接过系统 管理的功能。内核文件在/boot/linuz-xxx/下。
另外,Linux内核是可以动态加载内核模块的,这些模块位于 /lib/modules/下。 SATA磁盘的驱动程序就是放在/lib/modules/下,这就有个两难问题,Linux要加载SATA的驱动才能识别磁盘,而要 加载SATA的驱动必须到/lib/modules下才行,可是此时还没有识别磁盘,如何进入/lib/modules呢?Linux使用虚拟 文件系统解决这个问题。虚拟文件系统使用文件/boot/initrd,它可以被Boot Loader加载到内存中,并且仿真一个 根目录,这个仿真的文件系统提供一个程序加载必要的驱动,如USB,SATA,RAID,LVM等。此后内核就会释放虚拟文件 系统,挂载真正的根目录。
第一个程序init 内核加载完成后,就会执行第一个程序/sbin/init。由命令ps aux | grep init,可以知道其PID为1。 init的配置文件位于/etc/inittab。 注:Ubuntu中启动由upstart控制,自9.10后不再使用/etc/event.d目录的配置文件,改为/etc/init。 关于Ubuntu的启动,参见:http://wiki.ubuntu.org.cn/%E5%90%AF%E5%8A%A8。 Linux启动过程,有一个非常重要的概念:runlevel。Linux由runlevel决定启动过程使用的不同服务。 下面即是Ubuntu中各个runlevel的含义。
1 单用户或系统维护状态
2~5 多用户状态
6 重新启动
用户自定义开机启动程序 可以将要执行的命令写入/etc/init.d/rc.local文件。
2 内核与内核模块
目前的内核都有“可读取模块化驱动程序”的功能,如果一个新的硬件,操盘系统不支持,可以:
加入此硬件驱动源代码,重新编译内核。
将此硬件驱动源代码编译成模块,在开机时加载此模块。
核心模块位于/lib/modules/$(uname -r)/kernel/目录中。
模块之间信赖关系记录在/lib/modules/$(uname -r)/modules.dep。使用depmod命令可以建立此文件。
使用lsmod命令可以列出已经加载的模块。
Module Size Used by
ip6table_filter 12711 0
ip6_tables 18432 1 ip6table_filter
ebtable_nat 12695 0
ebtables 21508 1 ebtable_nat
ipt_MASQUERADE 12663 3
iptable_nat 13016 1
nf_nat 24959 2 ipt_MASQUERADE,iptable_nat
nf_conntrack_ipv4 19084 4 iptable_nat,nf_nat
nf_defrag_ipv4 12649 1 nf_conntrack_ipv4
使用modinfo可以获取模块的描述信息
filename: /lib/modules/3.2.0-37-generic-pae/kernel/net/ipv6/netfilter/ip6_tables.ko
description: IPv6 packet filter
author: Netfilter Core Team <coreteam@netfilter.org>
license: GPL
srcversion: 6F5DC4CD82D294A10583CD9
depends: x_tables
intree: Y
vermagic: 3.2.0-37-generic-pae SMP mod_unload modversions 686
模块加载可以使用modprobe 或者 insmod,前者会分析模块之间信赖关系,推荐用前者 模块移除可以使用modprobe -r 或者 rmmod
3、Boot Loader: Grub
Boot Loader 两阶段 由于MBR很小,Boot Loader分两个阶段
Boot Loader 主程序,放在MBR中,不含配置文件
加载配置文件,这些文件位于/boot/下,如grub的相关配置在/boot/grub中,直接与grub有关的是 /boot/grub/grub.cfg