Linux 鸟哥的私房菜 读书心得 : 实践与观察才是王道
0. 计算机概论
计算机:接受用户输入的指令与数据,经过处理器的数据与逻辑单元运算处理后,以产生或存储成有用的信息。
**计算机硬件的五大单元 **
- 输入单元 (鼠标,键盘等)
- 控制器
- 运算器 (算术逻辑,控制,记忆)
- 存储器
- 输出单元 (屏幕,打印机等)
CPU 为一个具有特定功能的芯片,里头含有微指令集。
CPU 读取的数据都是从内存中读取来的,内存的数据是由输入单元传输进来的。
CPU 处理完毕的数据要写入内存,内存再到输出单元。
接口设备
- 主板 (设备连接一起,让其协调,通信)
- 存储设备(硬盘,软盘,光盘,磁带)
- 显示设备
- 网络设备
硬盘最小物理量512bytes,最小的组成单位为扇区sector
个人计算机的架构与设计
x86开发商 (intel,AMD) 的cpu架构并不兼容,主板芯片组设计不相同。
主板上最重要的就是芯片组,芯片组通常又分为两个桥接器来控制各组件的通信。
北桥 : 负责连接较快的 cpu,内存和显卡 等组件。 (AMD : 内存直接与cpu通信,不经过北桥)
南桥 : 负责连接硬盘,USB,网卡等。
北桥的总线称为系统总线,是内存传输的主要信道。 与总线宽度类似,cpu每次能够处理的数据量称为字组大小(word size),字组大小依据cpu的设计而有32位与64位。
显卡厂商直接在显卡上面嵌入一个3D加速的芯片,这就是GPU称谓的由来。
CMOS是电脑主板上的一块可读写的RAM芯片。因为可读写的特性.所以在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据,这个芯片仅仅是用来存放数据的。
BIOS为写入到主板上某一块闪存或EEPROM的程序,在开机的时候运行,以加载CMOS当中的参数。
软件是计算机的灵魂。
机器程序与编译程序。 C/C++ – 编译器 --> 机器码
操作系统 OS
如果我们能够将硬件都驱动,并且提供一个开发软件的参考接口来给工程师开发软件的话,那就是OS
OS 内核:
OS其实是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。
OS内核 – 开机后常驻内存。
系统调用:
System Call – 开发软件,参考内核的相关功能。
应用程序 – 系统调用 – OS内核 – 硬件
内核功能:
- 系统调用接口
- 程序管理
- 内存管理
- 文件系统管理
- 设备驱动
1. Linux 介绍
GNU (Richard Mathew Stallman - 史托曼) 伟大的人物。 GNU 通用公共许可证 GPL - General Public License
- Emacs
- GCC (GNU C Compiler )
- GLIBC (GNU C Library)
- Bash shell
Linus Torvalds - Linux 参考 Minix(from 谭宁邦教授)
Linux 参考了 POSIX规范(可携式操作系统接口),重点在于规范内核与应用程序之间的接口。
Linux 如何学习:
实践再实践 – 要增加自己的体力,就只有运动;要增加自己的知识,就只有读书。
鸟哥的建议 『 (1)建议兴趣 (2)成就感 (被认可,被认同) 』
2. Linux 文件命令与权限
Linux : 多用户,多任务环境。 owner, group, others 且 各有 read, write, execute 等权限。
/etc/passwd /etc/shadow /etc/group
文件命令
- 文件处理命令 [ ls, cp, mv, rm, cat, ln, file]
- 文件内容查阅 [ cat, more, less, head, tail]
- 权限管理命令 [ chmod u+r g-w o=x 777, chown [-R] robby filename, chgrp 组名 filename, umask -S]
- 文件搜索命令 [ which, find, locate, updatedb, grep ] which -a在哪, whereis -b(数据库) locate 显示所有
- 压缩解压命令 [ gzip, gunzip, tar, zip, bzip2]
- 网络通信命令 [ write, wall, ping, ifconfig]
- 帮助命令 [ man, info, whatis apropos, help]
whereis 与 which [不同是可以看到命令所在帮助文档位置]
文件类型
1, (普通文件,纯文本文件(ASCII), - 二进制文件,数据格式文件)
2, 目录 d directory
3, 连接文件 ( l 软链接文件link )
4, 设备与设备文件(b,c)
5, 套接字
6, 管道
文件权限
1
2
3
4 drwxr-xr-x 2 hp hp 4096 2012-12-25 16:18 dlinux
[文件类型与权限] [硬链接数] [所有者] [所属组] [文件容量] [修改日期] [文件名]
4096 - 文件大小 [不是很准确,标记目录本身的大小,不是目录总大小] 数据块(512字节1单位)
特殊情况:
1
2
3 hp@ubuntu:~/2014$ ls -ld /usr/bin/passwd
-rwsr-xr-x 1 root root 42824 2月 11 2012 /usr/bin/passwd
s 与 t 这两个权限与系统的帐号以及系统的进程较为相关。以后再研究。
组织数据方式
每种OS都有自己的,比如 NTFS, ext3 …
存储数据的最小单位就叫做数据块,这一这样理解!!
文件存储时,至少要占用一个数据块。 (你 60斤,也得做一个椅子,200斤做一个,600斤可能做两个!)
分你做什么,数据块越小存取速度越小,数据块越大存取的时候浪费空间越大。
分你做什么,调数据块多大合适。。。有个别时候!!
3. Linux 文件搜索命令
(1) 命令所在路径 : /usr/bin/find 语法:find [搜索路径] [搜寻关键字]
1 | $ find /etc -name init* 在目录/etc中查找init开头的文件 |
(2) 按照时间查找 find /etc -mmin -120 (-之内, +超过 )
天 ctime, atime, mtime , 分钟 cmin , amin, mmin
c-change 改变, 表示文件属性被修改过,所有者,所属组,权限
a-access 访问
m-modify 修改, 表示文件内容被修改过
我们刚讲了 4 个find的选项,其实不下 40 个!要学会看文档!
(3) 连接符 -a and 逻辑与 -o or 逻辑或
1 | $ find /etc -ctime -1 在/etc下查找24小时内被修改过属性的文件和目录 |
(4) locate 功能描述:寻找文件或目录
范例: $ locate file 列出所有跟file相关的文件
(5) updatedb 执行权限:root 语法: updatedb 功能描述: 建立整个系统目录文件的数据库
范例: # updateb
(6) grep 功能描述 : 在文件中搜寻字串匹配的行并输出
4. Linux 文件系统管理
1 | hp@ubuntu:/$ df -m |
特殊权限: 粘着位 t
- 粘着位的定义: 当权限为777的目录被授予粘着位,用户只能在此目录下删除自己是所有者的文件。
- 查看分区使用情况:df
- 查看文件、目录大小:du
- 查看文件详细时间参数:stat
- 校验文件md5值:md5sum
- 检测修复文件系统:fsck、e2fsck
(单用户模式卸载文件系统后执行)
1 | hp@ubuntu:/$ df -h |
添加硬盘分区
- 划分分区(fdisk)
- 创建文件系统 (mkfs)
- 尝试挂载 (mount) [mount 物理设备名 挂载点(空目录)]
- 写入配置文件 (/etc/fstab)
5. Linux 文件系统目录结构
1 | /bin : 基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir等命令; |
6. VIM 编辑器
序号 | 命令类型 | 命令详情 |
---|---|---|
1. | [插入命令] | a, A, i, I, o, O |
2. | [定位命令] | h, j, k, l, $ , 0, H, M, L :set nu 设置行号,gg 到第一行 G 到最后一行 |
3. | [删除命令] | x, nx, dd, ndd, dG[光标处删除到文件尾], D, :n1, n2d[删除指定范围的行] |
4. | [复制和剪切命令] | yy, Y, nyy, nY, dd[剪切], ndd[剪切n行], p, P [粘贴在当前光标所在行下或行上] |
5. | [替换和取消命令] | r, R, u, r 取代光标所在处字符 R 从光标所在处开始替换字符,按Esc结束 u 取消上一步操作 |
6. |
[搜索和替换命令] |
/string 按 n 是下一个 从前向后, N 从后向前 :%s/old/new/g 全文替换指定字符串 :n1,n2s/old/new/c 询问替换 :set ic 搜索的时候就不区分大小写了! :set noic |
7. | [保存和退出命令] | [ZZ 最常用 ] :wq 保存退出 |
8. | [vi 中另外比较有趣的命令] | :r !命令 导入命令执行结果到当前vi中, 在vi中执行命令 :!命令 |
9. | 分屏 | sp, vsp (水平) ctrl+w *2 |
10. | 定义快捷键 | :map 快捷键 触发命令 范例: : map ^P I# |
11. | vi 的配置文件 | ~/.vimrc |
7. 引导流程
- Linux引导流程
- Linux运行级别
- Linux启动服务管理
- GRUB配置与应用
系统引导流程:
1
2
3
4
5
6
7
8
9 固件 firmware(CMOS/BIOS) → POST 加电自检
↓ [CMOS是固化在主板上的那段程序, BIOS 操作CMOS的那个界面]
自举程序 BootLoader(GRUB) → 载入内核 linux-grub /etc/grub.conf / win-ntldr [nt内核代号,loader] bootini [里面记载了启动信息]
↓ 载入内核,OS的核心-内核[存储CPU文件进程...管理]-心脏大脑 指定linux内核存放的位置。ls /boot
载入内核 Kernel → 驱动硬件
↓ [内核只做两件事情,1驱动硬件2启动init. 内核保存最多的是驱动程序]
启动进程 init
↓ [init是第一个可以存在和启动的进程]
读取执行配置文件/etc/inittab
引导流程说明:
firmware自检之后,发现硬件们都没有什么问题之后,然后 firmware 读取 MBR[主引导记录],位于 0柱面0磁头1扇区, 跳到 Master boot record 去读取数据。载入MBR 中一个很重要的数据叫做 Bootloader, 也称做自举程序或自启动程序。 下面是 Partition table 磁盘分区表,下面是 Magic Number 结束标志字
init 启动后读取 inittab文件, 执行缺省运行级别, 从而继续引导过程。在UNIX系统中, init时第一个可以存在的进程, 它的PID恒为1, 但它也必须向一个更高级的功能负责: PID为0的内核调度器(Kernelscheduler),从而获得CPU时间。
扩展 :
在Linux里面不允许存在 孤儿进程,在linux系统中init是所有进程的父进程。
僵尸进程[Z] 儿子死了,父亲不知道,这个子进程就会变成 Z。
Linux运行级别 0 ~ 6 说明 :
0 关机 1 字符单用户 2,3 字符界面的多用户模式[广泛使用的服务器的模式]
4 自定义 5 图形化的多用户 6 reboot
8. 学习bash
Linux bash东西非常多,包括变量的设置与使用,bash操作环境,数据流重定向功能,还有好用的管道命令。
1, 硬件 2,内核程序 3,应用程序
man, chmod, chown, vi, fdisk, mkfs等命令,这些命令都是独立的应用程序。
bash的主要优点 :
(1) 命令记忆功能 (history) .bash_history (注销系统后,命令记忆会记录到.bash_history)
(2) 命令与文件补全功能 (tab)
(3) 命令别名设置功能 (alias) alias lm=‘ls -al’
(4) 作业控制,前台,后台控制 (job control, foreground, background)
(5) 程序脚本 (shell script)
(6) 通配符 (Wildcard)
shell 变量:
echo 变量显示 如 : echo (uname -r)" 来替代 “version=
uname -r
” 比较好。
环境变量的功能:
env 与 export 查看环境变量
HOME, SHELL, HISTSIZE, PATH, LANG(语系数据), RANDOM(随机数发生器)
export 自定义变量转成环境变量 export name
子进程会定义父进程的环境变量,不会继承父进程的自定义变量
bash 可以限制用户的某些系统资源,可打开的文件数量,可使用的CPU时间,可使用的内存总量等
文件系统及程序的限制关系 : ulimit
ulimit -H -S -a -c -f -d -l -t -u -s 等。
数据流重定向
1, stdin 代码为 0 ,使用 < 或 <<
2, stdout 代码为 1 ,使用 > 或 >>
3, stderr 代码为 2 ,使用 2> 或 2>>
/dev/null 垃圾桶黑洞设备
&& 与 ||
cut 命令 例子 : echo $PATH | cut -d ‘:’ -f 3,5
export | cut -c 12-
cut 的主要用途在于将同一行里面的数据进行分解,用于分析一些日志。
grep -a -c -i -n -v ‘targe’ filename
排序命令: sort, wc, uniq
last | cut -d ’ ’ -f 1 | sort | uniq -c
hp@ubuntu:~$ last | tee last.list | cut -d " " -f1
tee 命令可以让 standard output 转存到一个文件内,并将同样的数据继续送到屏幕中去处理
字符转换命令: tr, col, join, paste, expand
(1) tr : last | tr ‘[a-z]’ ‘[A-Z]’
: cat /etc/passwd | tr -d ‘:’
(2) col -x 将tab键转换成对等的空格 -b 在文字内有 / 时,仅保留 / 后面接的那个字符
: cat /etc/man.config | col -x | cat -A | more
(3) join [-ti12] file1 file2(4) paste [-d] file1 file2
: -d : 后面可以接分隔字符,默认是以 [tab] 来分隔的。
: - : 如果file部分写成 -, 代表来自 standard input 的数据的意思。
(5) expand 就是将 [tab] 按键转成空格键,可以这样做 : expand [-t] file
: expand -t 6 - | cat -A
: unexpand
切割命令: split 参数 -b : 后面可接欲切割成的文件大小,可加单位 b, k, m 等;
1 | $ split -b 300k /etc/termcap termcap |
参数代换: xargs 可以读入stdin的数据,并且以空格符或断行字符进行分辨,将stdin的数据分隔成args
1 | hp@ubuntu:~$ cut -d ':' -f1 /etc/passwd | head -n 3 | xargs -p |
关于减号 - 的用途
1 | $ tar -cvf - /home | tar -xvf - |
9. 进程管理
进程的概念 进程管理命令 计划任务
9.1 进程和程序的区别
- 程序是静态概念, 它作为一种软件资源长期保存;
- 进程是程序的执行过程, 它是动态概念, 有一定的生命期, 是动态产生和消亡的;
- 子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程;
- 在Linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境;
- 父进程终止子进程自然终止.
9.2 前台进程和后台进程
前台进程:
在Shell提示处打入命令后, 创建一个子进程, 运行命令, Shell等待命令退出, 然后返回到对用户给出提示符。 这条命令与Shell异步运行, 即在前台运行, 用户在它完成之前不能执行另一个命令。
后台进程:
在Shell提示处打入命令, 若后随一个&, Shell创建的子进程运行此命令, 但不等待命令退出, 而直接返回到对用户给出提示。 这条命令与Shell同步运行, 即在后台运行。 后台进程必须是非交互式的。
9.3 进程状态
进程状态 | 描述 |
---|---|
就绪 | 进程已经分配到资源,但因为其它进程正占用CPU。 |
等待 | 因等待某种事件而暂时不能运行的状态。 |
运行 | 进程分配到CPU,正在处理器上运行。 |
进程状态细化
用户态运行 : 在CPU上执行用户代码
核心态运行 : 在CPU上执行核心代码
在内存就绪 : 具备运行条件,只等调度程序为它分配CPU
在内存睡眠 : 因等待某一事件的发生,而在内存中排队等待
在外存就绪 : 就绪进程被交换到外存上继续处于就绪状态
在外存睡眠 : 睡眠进程被交换到外存上继续等待
在内存暂停 : 因调用stop程序而进入跟踪暂停状态,等待其父进程发送命令。
在外存暂停 : 处于跟踪暂停态的进程被交换到外存上
创建态
新进程正在被创建、但尚未完毕的中间状态
终止态
进程终止自己
查看用户信息 w (命令)
1 | hp@ubuntu:~$ w |
选项 | 描述 |
---|---|
JCPU | 以终端代号来区分,该终端所有相关的进程执行时,所消耗的CPU时间会显示在这里 |
PCPU | CPU执行程序耗费的时间 |
WHAT | 用户正在执行的操作查看个别用户信息:w 用户名 |
load average | 分别显示系统在过去1、5、15分钟内的平均负载程度。 |
FROM | 显示用户从何处登录系统,“:0”的显示代表该用户时从X Window下,打开文本模式窗口登录的 |
IDLE | 用户闲置的时间。这是一个计时器,一旦用户执行任何操作,该计时器便会被重置 |
查看系统中的进程 ps 常用选项
a : 显示所有用户的进程
u : 显示用户名和启动时间
x : 显示没有控制终端的进程
e : 显示所有进程,包括没有控制终端的进程
l : 长格式显示
w : 宽行显示,可以使用多个w进行加宽显示
ps 常用输出信息的含义
TIME: 进程自从启动以来启用CPU的总时间
COMMAND/CMD: 进程的命令名
USER:用户名
%CPU:占用CPU时间和总时间的百分比
%MEM:占用内存与系统内存总量的百分比
ps 应用实例
ps 查看隶属于自己的进程
ps -u or -l 查看隶属于自己进程详细信息
ps -le or -aux 查看所有用户执行的进程的详细信息
ps -aux --sort pid 可按进程执行的时间、
PID、UID等对进程进行排序
1 | # ps -aux | grep sam |
9.4 kill – 杀死进程
- 为什么要杀死进程
- 该进程占用了过多的CPU时间
- 该进程缩住了一个终端,使其他前台进程无法运行
- 运行时间过长,但没有预期效果
- 产生了过多到屏幕或磁盘文件的输出
- 无法正常退出, 关闭进程:kill 进程号
1). kill -9 进程号(强行关闭) kill -s 9 进程号 [前简化]
2). kill -1 进程号(重启进程)
3). 关闭图形程序: xkill
4). 结束所有进程: killall
5). 查找服务进程号: pgrep 服务名称
6). 关闭进程: pkill 进程名称
启动的程序 stop 也可以关闭 , 重启 /etc/rc.d/init.d/httpd restart
1 | # cat/proc/cpuinfo |
9.5 进程优先级,挂起与恢复
nice
指定程序的运行优先级
格式:nice -n command
例如:nice -5 myprogram
renice
改变一个正在运行的进程的优先级
格式:renice n pid
例如:renice -5 777
优先级取值范围为(-20,19)
nohup
使进程在用户退出登陆后仍旧继续执行,nohup命令将执行后的数据信息和
错误信息默认储存到文件 nohup.out 中
格式: nohup program &
进程的挂起和恢复
进程的中止(挂起)和终止
挂起(Ctrl+Z)[类似差不多暂停]
终止(Ctrl+C)
进程的恢复
恢复到前台继续运行(fg) 复到后台继续运行(bg) 查看被挂起 /后台的进程(jobs)
9.6 top 作用
进程状态显示和进程控制,每5秒钟自动刷新一次(动态显示)
常用选项:
d : 指定刷新的时间间隔
c : 显示整个命令行而不仅仅显示命令名
top常用命令:
u : 查看指定用户的进程
k : 终止执行中的进程
h or ?:获得帮助
r : 重新设置进程优先级
s : 改变刷新的时间间隔
W : 将当前设置写入~/.toprc文件中
9.7 计划任务
- at 安排作业在某一时刻执行一次
- batch 安排作业在系统负载不重时执行一次
- cron 安排周期性运行的作业
at命令的功能和格式
功能: 安排一个或多个命令在指定的时间运行一次
at 的命令格式及参数
at [-f 文件名] 时间 / at -d or atrm 删除队列中的任务 / at -l or atq 查看队列中的任务
进程处理方式
standalone 独立运行 xinetd 进程托管 atd、crond 计划任务
Linux 书架
- 入门类 :《鸟哥的Linux私房菜》
- 编程类 :《Advanced Linux Programming》-> 《Advanced Programming in the UNIX Environment》
- 内核类 :《Linux Kernel Development》
- 工具类 :《Handbook of Open Source Tools》
Checking if Disqus is accessible...