1.操作系统也会提供一整组系统呼叫接口来给软件设计师开发用喔!
2.过去每种操作系统都是在他专门 的硬件机器上面运行的喔!
3.Linux 由于是 Open Source 的操作系统,所以他的程序代码可 以被修改成适合在各种机器上面运行的。
4. Unix 是以较高阶的 C 语言写的。 高阶的 C 语言与硬件的相关性就没有这么大了!
5.现在的硬件基本上都是一种架构。
6.因此他便开始撰写 C 语言的编译程序,那就是现在相当有名的GNU C Compiler(gcc)!
7.可以被使用来操作操作系统的基本接口 BASH shell!
8.图形用户接口为 X,Window 的 W 接的就是 X 啦!
9.GNU 计划对于整个自由软件与开放原始码软件来说是占有非常重要的角色!
10.写程序最大的快乐就是让自己发展的良 好的软件让大家来使用了! 另外,如果使用方撰写程序的能力比自己强,那么当对方修改完自己的 程序并且回传修改后的程序代码给自己,那自己的程序撰写功力无形中就更往上爬了! 这就是最早 之前 AI 实验室的黑客风格!
11.什么要称为 GNU 呢?其实 GNU 是 GNU's Not Unix 的缩写,意思是说,GNU 并不 是 Unix 啊!那么 GNU 又是什么呢? 就是 GNU's Not Unix 嘛!.....如果你写过程序就会知道,这个 GNU = GNU's Not Unix 可是无穷循环啊!忙碌~
12. GPL(GNU General Public License, GPL)是什么玩意儿?使用者可以自由的执行、复制、再发行、学习、修改与强化 自由软件。你不能将一个 GPL 授权的自由软件,在你修改后而将他取消 GPL 授权~ 不能单纯的贩卖自由软件。
13.目前自由软件工作者,他们所赖以维生的,几乎都是在『服务』这个领域呢!
14.GPL也有很多细分。
15.社群版UBUNTU,商业版redhat
16.现在手机市场的主流 操作系统是 Linux 分支出来的 Android 喔!
17.嵌入式linux系统。
18.单一主机的能力太过强大,导致硬件资源经常闲置, 这个现象让虚拟化技术得以快速发展!
19.云程序的底层就是 Linux ,而云程序搭建出来的虚拟机,内容也是 Linux 操作系统哩!
20.『在 Linux 系统中,每个装置都被当成一个文件来对待』
21、几乎所有的硬件装置文件都在/dev 这个目录内, 所以你会看到
/dev/sda, /dev/sr0 等等的檔名喔。
22.SCSI/SATA/USB 硬盘机 /dev/sd[a-p]
23.由于是使用侦测到的顺序来决定装置文件名,并非与实际插槽代号有关,因此装置的文件名如下:
1. SATA1 插槽上的檔名:/dev/sda
2. SATA5 插槽上的檔名:/dev/sdb
3. USB 磁盘(开机完成后才被系统捉到):/dev/sdc
24. Linux 内的所有数据都是以文件的形态来呈现的。
25./usr 是 Linux 的可执行程序及相关的文件摆放的目录,
26.初次接触 Linux:只要分区『 / 』及『swap』即可。#swap能不用就不用,速度很慢,如果用的多了说明要用内存了。
27.请特别注意您的服务项目!然后才来进行 硬盘的规划。
28.文本模式登入后所取得的程序被称为壳(Shell),#我们项目上用的是bash shell,还有shell scripts
29.man,http://-help.info 三个类似。#不仅仅是Man
30.linux中有许多的编辑器。#vim只是其中一个。
31.LINUX关机别乱关。#有很多乱起八糟的东西需要弄的。
32.用户(文件拥有者),群组(团队),其他。例如一个家庭有三个人,每个人一个房间(用户),公用一个客厅(群组),客人就是其他。
33.但是在 Linux 底下,我们的文件是否能被执行,则是藉由是否具有『x』这个权限来决定的!跟 档名是没有绝对的关系的!#跟后缀没有关系。
34.目录的 x 代表的是用户能否进入该目录成为工作目录的用途!能不能CD过去。R就是读里面的文件名,W就是对里面的文件进行各种操作。对目录来说里面的东西就是数据。#目录的rwx与文件的rwx是不一样的。
35.oracle的家目录下有个ROOT:ROOT -rwx------- 怎么办?只能删。#不能执行其他操作。
36.而在 Linux 底下,只要你 的权限当中具有 x 的话,例如[ -rwxr-xr-x ] 即代表这个文件具有可以被执行的能力喔!但是 能不能执行成功,当然就得要看该文件的内容啰~
37.我们仍然希望可以藉由扩展名来了解该文件是什么东西-------------扩展名的作用。
38.linux特殊字符* ? > < ; & ! [ ] | \ ' " ` ( ) { }。 #没有等号。
39./etc (配置文件)
/opt (第三方协力软件)
/usr (软件放置处)
40.可分享的:能够分享给网络上其他主机挂载用的目录; #除了rwx外还有可分享,不变等权限。
不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。
41. / (root, 根目录):与开机系统有关;
/usr (unix software resource):与软件安装/执行有关;
/var (variable):与系统运作过程有关。
/bin:放置命令。
42.根目录(/)所在分区槽应该越小越好,
43.root 系统管理员(root)的家目录。#/root,不是/
44. . :代表当前的目录,也可以使用 ./ 来表示; #.等于./ ..等于../
.. :代表上一层目录,也可以 ../ 来代表。
45.cd 回到自己的家 cd - 回到上一次在的目录。
46.为什么我在任何目 录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!#找不到因该是path的问题。
47.隐藏属性:不能被移动。可分享,不变之云。
48.find 的特殊功能就是能够进行额外的动作(action)。
{} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
-exec 一直到 \; 是关键词,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是『 ls -l {} 』啰! #exec只能一个一个,xargs能全部一起。
因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来跳脱。
49.dmtsai 执行 passwd 的过程中,会『暂时』获得 root 的权限;----suid
50. which 命令用于查找并显示给定命令的绝对路径.which与whereis一般都查命令的所在路径。
51, find 是很强大的搜寻指令,但时间花用的很大!#locate要少很多。
52. locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb), 但是功能也轻量级很多。
53.touch 的目的在修改文件的时间参数,但亦可用来建立空文件;
54. 为 什么需要进行『格式化』呢?成为操作系统能够利用的『文件系统格式 (filesystem)』
55. 将文件系统与目录树结合的动作我们称为『挂载』。
56.基本上,磁盘阵列 (RAID) 就是透过将文件先细分为数个小型的分区区块 (stripe) 之后,然后将众多 的 stripes 分别放到磁盘阵列里面的所有磁盘,当你的系统大多是大型文件时,一般建议 stripe 可以设 定大一些,这样磁盘阵列读/写的频率会降低,效能会提升。 #Block类似。
57.我们在本章一开始时的挂载点的意义当中提过挂载点是目录, 而这个目录是进入磁盘分区槽(其实是文件系统啦!)的入口就是了。
58.一般来说,如果硬件的配备资源足够的话,那么 swap 应该不会被我们的系统所使用到, swap 会 被利用到的时刻通常就是物理内存不足的情况了。当内存不足的时候,为了让后续的程序可以顺利的运作,因此在内存中 暂不使用的程序与数据就会被挪到 swap 中了。#内存中暂不使用的会被挪到swap中去。
59.多种压缩技术。将多个文件打包!#打包再压缩。
60.指令大多仅能针对单一文件来进行压缩。为什么打包?多个打包成单个,再压缩。#指令一般只能针对单个文件,所以才要打包啊!
61.『 -f filename 』是紧接在一起的。
62.。此外,vim 是进阶版的 vi , vim 不但可以用 不同颜色显示文字内容,还能够进行诸如 shell script, C program 等程序编辑功能, 你可以将 vim 视为一种程序编辑器!#程序编辑器而不仅仅是文字处理器。
63.vim 是一个『程序开发工具』而不是文字处理软件~^_^。vim的三种模式!
64.vim练习题
----------------
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2. 进入 vitest 这个目录当中;
3. 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man_db.conf 文件);
4. 使用 vi 开启本目录下的 man_db.conf 这个文件;
5. 在 vi 中设定一下行号;
6. 移动到第 43 列,向右移动 59 个字符,请问你看到的小括号内是哪个文字?
7. 移动到第一列,并且向下搜寻一下『 gzip 』这个字符串,请问他在第几列?
8. 接着下来,我要将 29 到 41 列之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑
选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』, 结果会在最后一列出现改变了几个 man
呢?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10. 我要复制 66 到 71 这 6 列的内容(含有 MANDB_MAP),并且贴到最后一列之后;
11. 113 到 128 列之间的开头为 # 符号的批注数据我不要了,要如何删除?
12. 将这个文件另存成一个 man.test.config 的檔名;
13. 去到第 25 列,并且删除 15 个字符,结果出现的第一个单字是什么?
14. 在第一列新增一列,该列内容输入『I am a student...』;
15. 储存后离开吧!
整个步骤可以如下显示:
1. 『mkdir /tmp/vitest』
2. 『cd /tmp/vitest』
3. 『cp /etc/man_db.conf .』
4. 『/bin/vi man_db.conf』
5. 『:set nu』然后你会在画面中看到左侧出现数字即为行号。
6. 先按下『43G』再按下『59→』会看到『 as 』这个单字在小括号内;
7. 先执行『1G』或『gg』后,直接输入『/gzip』,则会去到第 93 列才对!
8. 直接下达『 :29,41s/man/MAN/gc 』即可!若一直按『y』最终会出现『在 13 列内置换 13 个字符串』的
说明。
9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新读取一次
该文件;
10. 『66G』 然后再『 6yy 』之后最后一列会出现『复制 6 列』之类的说明字样。 按下『 G 』到最后一列,
再给他『 p 』贴上 6 列!
11. 因为 113~128 共 16 列,因此『 113G 』→『 16dd 』就能删除 16 列,此时你会发现游标所在 113 列
的地方变成 『 # Flags. 』 开头啰
12. 『 :w man.test.config 』,你会发现最后一列出现 "man.test.config" [New].. 的字样。
13. 『25G』 之后,再给他『 15x 』即可删除 15 个字符,出现『 tree 』的字样;
14. 先『 1G 』去到第一列,然后按下大写的『 O 』便新增一列且在插入模式;开始输入『I am a student...』
后, 按下[Esc]回到一般指令模式等待后续工作;
15. 『:wq』
------------------------
65.如果你之前的 vim 处理动作尚未储存,此时你应该要按下『R』,亦即使用 (R)ecover 的项目, 此时 vim 会载入 .man_db.conf.swp 的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。 不过那个 .man_db.conf.swp 并不会在你结束 vim 后自动删除,所以你离开 vim 后还得要自行删除 .man_db.conf.swp 才能避免每次打开这个文件都会出现这样的警告!如果你确定这个暂存盘是没有用的,那么你可以直接按下『D』删除掉这个暂存盘,亦即 (D)elete it这个项目即可。 此时 vim 会载入 man_db.conf ,并且将旧的 .man_db.conf.swp 删除后,建立这次会使用的新的 .man_db.conf.swp 喔!
#D会删除.swap文件,R不会。
66.linux默认用bash shell来跟核心沟通,其中更是提供强大的script进行脚本编写!懂了bash吗? #bash shell 与Bash shell scripts
67.为什么用bash?支持tab,script,回滚,通配符等多重强大的功能。#比一般的shell功能更多。
68.指令别名!#指令别名你可以自己研究下。
69. export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。#export ORACLE_SID=sqmmt,环境变量里面有了这个东西。
70.source 。。。。只在当前shell生效。由于 /etc/profile 与 ~/.bash_profile (环境变量到这里面去)都是在取得 login shell 的时候才会读取的配置文件,所以, 如果你将自己的偏好设定写入上述的文件后,通常都是得注销再登入后,该设定才会生效。那么,能不能直接读取配置文件而不注销登入呢? 可以的!那就得要利用 source (或者小数点)这个指令了!#有些配置文件只有刚进入shell的时候才会读取,为了不重启,可以用source或者. 但是只在当前的shell中生效。
71.# xargs与exec的写法是不一样的。
find /opt/ltedecoder/log -type f -name "*.log" -mtime +3 |xargs -n 5 rm -rf {} ;
find ./ -mtime +1 -exec ls -l {} \; #没有管道。
find . -maxdepth 1 ! -type d -name "*.ctrl" |xargs -n 5 rm -rf {};#!是反向查找。
72.通配符:*,?,[],[-],[^].
73.特殊字符(通配符不算特殊字符,遇到特殊字符要\)
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不执行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定(后两节介绍);
; 连续指令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变数前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将指令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向 (这两个留待下节介绍)
' ' 单引号,不具有变量置换的功能 ($ 变为纯文本)
" " 具有变量置换的功能! ($ 可保留相关功能)
` ` 两个『 ` 』中间为可以先执行的指令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ }在中间为命令区块的组合!
74.『标准输出 (STDOUT)』与『标准错 误输出 (STDERR)』, 这两个玩意儿默认都是输出到屏幕上面来的啊!#还有标准输入。
75.,标准输出指的是『指令执行所回传的正确的讯息』,而标准错误输出可理解为『 指令执 行失败后,所回传的错误讯息』
76.#输入为0,正确输出为1,错误输出为2。
1. 标准输入 (stdin) 键盘输入。管道之前也是,:代码为 0 ,使用 < 或 << ;
2. 标准输出 (stdout)屏幕输出,管道之后也是:代码为 1 ,使用 > 或 >> ;
3. 标准错误输出(stderr)错误信息:代码为 2 ,使用 2> 或 2>>
77. find /home - - name .bashrc > list 2>&1
78. cat > catfile < ~/.bashr catfile是新建立的。 用文件代替标准输入。
79.[dmtsai@study ~]$ cat > catfile << "eof" #<<的作用。就是能eof!
> This is a test.
> OK now stop
> eof <==输入
#> >>都是输出到文件,后者是追加。<是文件输入 <<是屏幕输入,多了个eof结束。
80.一次性执行多个命令的方法:
1.脚本。
2.没有关联性情况下用;
3.有关联情况下:
cmd1 && cmd2
若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。
若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
cmd1 || cmd2
若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。
81.范例三:我不清楚 /tmp/abc 是否存在,但就是要建立 /tmp/abc/hehe 文件
[dmtsai@study ~]$ ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/heh
82.这个管 线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于stdandard error 并没有直接处理的能力。
83.ll | more ....more也可以 #有些命令前面不支持管道。
84.管道后面的指令必须要能够接受 standard input (屏幕输入)的 数据才行,这样的指令才可以是为『管线命令』,例如 less, more, head, tail 等都是可以接受 standard input 的管线命令啦。至于例如 ls, cp, mv 等就不是管线命令了!
85.管道要注意82和84两点。#只能传送standard output信息,不能传送standard error信息,且后面的命令必须能接受standard input命令。
86.如果你硬要让 standard error 可以被管线命令所使用,那该如何处理?其实就 是透过上一小节的数据流重导向即可! 让 2>&1 加入指令中~就可以让 2> 变成 1> 啰!
87撷取命令: cut, grep。cut 主要的用途在于将『同一行里面的数据进行分解!』最常使用在分析一些数据或文字数据的时候!比如每一行都一样,取一段。取一行中的某段。cut 在处理多空格相连的 数据时,可能会比较吃力一点,所以某些时刻可能会使用下一章的 awk 来取代的!awk是cut的进阶。
88.sort命令:万能的排序!不仅仅是-t!unique重复的只取一个。wc 统计命令!不仅仅用在有多少行。
#sort取多个行,从第一列开始对比。
89.双向重导向: tee 不仅在屏幕上输出,在文件中也有。#既传送到文件,也传送到屏幕输出。
90.举例来 说,要将大写改成小写,或者是将数据中的 [tab] 按键转成空格键?还有,如何将两篇讯息整合成一篇? 底下我们就来介绍一下这些字符转换命令在管线当中的使用方法:字符转换命令: tr, col, join, paste, expand。
sed替换算是这些的进阶?算吧。
91.分区命令: split。如果你有文件太大,导致一些携带式装置无法复制的问题,嘿嘿!找 split 就对了!
92.xargs 可以读入 stdin 的数据(标准输出到管道的过来的也算标准输入),并 且以空格符或断行字符作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空格符作为分隔, 所以,如果有一些档名或者是其他意义的名词内含有空格符的时候, xargs 可能就会误判了。#xargs与exec的区别:前者能一批处理,但是无法识别有特殊字符的文件名。
93.很多指令其实并不支持管 线命令,因此我们可以透过 xargs 来提供该指令引用 standard input 之用!#Xargs和exec是很多不支持管道的命令的救星啊。
94.tar - - cvf - - /home | tar - - xvf - - - - C /tmp/homeback
上面这个例子是说:『我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送 到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前 一个指令的 stdout, 因此,我们就不需要使用 filename 了!这是很常见的例子喔!注意注意!#管道可以省去文件名。
95.type 可以用来找到执行指令为何种类型,亦可用于与 which 相同的功能;
96.使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量;
97.set 可以观察目前 bash 环境下的所有变量;
98.locale 可用于观察语系资料
99.可用 read 让用户由键盘输入变量的值 read -p
100.ulimit 可用以限制用户使用系统的资源情况
101.bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile,但是 /etc/profile 还会呼叫出其他的配置文件,non-login shell 则仅读取 ~/.bashrc.。source执行系统配置只会在当签到shell中生效。
login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。所以non-loginshell(X windows登入)
102.stty 也可以帮 助设定终端机的输入按键代表意义喔!(比如设置quit的热键)^ 表示 [Ctrl] 那个按键的意思#热键,更改文件名。
103.正规表示法是透过一些特殊字符的排列,用以『搜寻/取代/删除』一列或多列 文字字符串, 简单的说,正规表示法就是用在字符串的处理上面的一项『表示式』。正规表示法并不是一个工具程序, 而是一个字符串处理的标准依据,如果您想要以正规表示法的方式处理字符串,就得要使用支持正规表示法的工具程序 才行, 这类的工具程序很多,例如 vi, sed, awk 等等。简单的说,正规表示法就是处理字符串的方法,他是以行(正则)为单位来进行字符串的处理行为, 正规表示法透过一些特殊符号的辅助,可以让使用者轻易的达到『搜寻/删除/取代』某特定字符串的处 理程序。但例如 cp, ls 等指令并未支持正规表示法, 所以就只能使用 bash 自己本身的通 配符而已。正规表示法基本上是一种『表示法』, 只要工具程序支持这种表 示法,那么该工具程序就可以用来作为正规表示法的字符串处理之用。grep用了正则后不用通配符了。正则相当于通配符的进阶。
104.正则是重中之重
105.延伸的正规表示法
106.使用正规表示法时,需要特别留 意当时环境的语系为何, 否则可能会发现与别人不相同的撷取结果喔!
107.因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有空 字符或一个 o 以上的字符』!那如果是『oo*』呢?则第一个 o 肯定必须要存在.『.* 就代表零个或多个任 意字符』
108.正则中\{n,m\}。正则中*就是正则,{}在“” #特殊字符的排列。
11.2.4 基础正规表示法字符汇整 (characters)
RE 字符 意义与范例
^word
意义:待搜寻的字符串(word)在行首!
范例:搜寻行首为 # 开始的那一行,并列出行号
grep -n '^#' regular_express.txt
word$
意义:待搜寻的字符串(word)在行尾!
范例:将行尾为 ! 的那一行打印出来,并列出行号
grep -n '!$' regular_express.txt
.
意义:代表『一定有一个任意字符』的字符!
范例:搜寻的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e
中间『一定』仅有一个字符,而空格符也是字符!
grep -n 'e.e' regular_express.txt
\
意义:跳脱字符,将特殊符号的特殊意义去除!
范例:搜寻含有单引号 ' 的那一行!
grep -n \' regular_express.txt
*
意义:重复零个到无穷多个的前一个 RE 字符
范例:找出含有 (es) (ess) (esss) 等等的字符串,注意,因为 * 可以是 0 个,所以 es 也
是符合带搜寻字符串。另外,因为 * 为重复『前一个 RE 字符』的符号, 因此,在 * 之前必须
要紧接着一个 RE 字符喔!例如任意字符则为 『.*』 !
grep -n 'ess*' regular_express.txt
[list]
意义:字符集合的 RE 字符,里面列出想要撷取的字符!
范例:搜寻含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中『谨代表一个待搜寻
的字符』, 例如『 a[afl]y 』代表搜寻的字符串可以是 aay, afy, aly 即 [afl] 代表 a 或
f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2]
意义:字符集合的 RE 字符,里面列出想要撷取的字符范围!
范例:搜寻含有任意数字的那一行!需特别留意,在字符集合 [] 中的减号 - 是有特殊意义的,
他代表两个字符之间的所有连续字符!但这个连续与否与 ASCII 编码有关,因此,你的编码需要
设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确!) 例如所有大写字
符则为 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]
意义:字符集合的 RE 字符,里面列出不要的字符串或范围!
范例:搜寻的字符串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意
义是『反向选择』的意思。 例如,我不要大写字符,则为 [^A-Z]。但是,需要特别注意的是,
如果以 grep -n [^A-Z] regular_express.txt 来搜寻,却发现该文件内的所有行都被列
出,为什么?因为这个 [^A-Z] 是『非大写字符』的意思, 因为每一行均有非大写字符,例如第
一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字
grep -n 'oo[^t]' regular_express.txt
\{n,m\}
意义:连续 n 到 m 个的『前一个 RE 字符』
意义:若为 \{n\} 则是连续 n 个的前一个 RE 字符,
意义:若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符! 范例:在 g 与 g 之间有 2 个到
3 个的 o 存在的字符串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt
109. 双引号中的三种特殊字符不被忽略:$,\,`
110.通配符不算特殊字符,正则是通配符的进阶,是特殊字符的特殊结合。在工具中遇到特殊字符却又不想用他的原含义的可以用\。在双引号中只有·$\三个特殊字符有原含义。
111. printf 可以帮我们将资料输出的结果格式化,而且支持一些特殊的字符
112.printf ' 打印格式 ' 实际内容
113.awk中$0 代表『一整 列资料』的意思~
单引号已经是 awk 的指令固定用法,非变量的文字部分 ,需要使用双引号来定义出来。
cat test2 | awk 'NR==1 {printf "%10s\t %10s\t %10s\t %10s\t %10s\t \n",$1,$2,$3,$4,"total"};NR>1{total=$2+$3+$4;printf "%10s\t %10d\t %10d\t %10d\t %10f\t \n",$1,$2,$3,$4,total}' #必须要有\n,变量total不用$,注意分号的位置。
printf:可以自定义输出的模式,另外输出内容之后不自动换行
print:输出内容之后自动换行
#printf与print的区别是前者可以自定义模式。
114.diff 通常是用在同一的文件(或软件)的新旧版本差异 上!
115.diff 主要是 以『行』为单位比对, cmp 则是以『字节』为单位去比对,这并不相同!
116.正规表示法与通配符是完全不一样的东西!通配符 (wildcard) 代表的是 bash 操作接口的一个功能, 但正规表示法则是一种字符串处理的表示方式!
117.shell是一个文字接口底下让我们与系统沟通的一个工具接口.script是『脚本、剧本』的意思.shell script 是针对 shell 所写的『剧本!』
118.shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。shell script 可以简单的被看成是批处理文件。且这个程序语言由于都是利用 shell 与相关工具指令, 所以不需要编译即可执行。
119.系统的服务 (services) 启动的接口是在 /etc/init.d/ 这个目录下,目录下的所有文件都是 scripts ;
120.另外,包括开机 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关设定数据。
121。因为 shell script 用的是外部的指令与 bash shell 的一些默认工具,所以shell script 处理数据的速度上是不太够的。shell script 用在系统管理上 面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell scripts 的速度较慢, 且使用的 CPU 资源较多,造成主机资源的分配不良。
122.CentOS 默认用户家目录下的 ~/bin 目录会被设定到 ${PATH} 内,所以你也可以将 shell.sh 建立在
/home/dmtsai/bin/ 底下 ( ~/bin 目录需要自行设定) 。此时,若 shell.sh 在 ~/bin 内且具有 rx 的权限,
那就直接输入 shell.sh 即可执行该脚本程序!sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来执行 shell.sh 这个文件内的相关指令的意思,所以此时 你的 shell.sh 只要有 r 的权限即可被执行喔!而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与 追踪 shell.sh 的语法是否正确呢! ^_^。./shell会去指令搜索顺序中找。
123. PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒号使目录与目录之间隔开。
124.linux 中“\a”什么意思?\a 发出警告声;
125.因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法!
126.一般来说, 建议你一定要养成说明该 script 的:1. 内容与功能; 2. 版本信息; 3. 作者与联络方式; 4. 建檔日期;5. 历史纪录 等等。这将 有助于未来程序的改写与 debug 呢!
127.建议务必要将一些重要的环境变量设定好,比如PATH等等,后面将会方便很多。
128.我们也可 以利用 exit 这个指令来让程序中断,并且回传一个数值给系统。
129.echo -e :激活转义字符。
130.vim与vi相比 会有额外的语法检验机制。格外的许多功能。
131filename=${fileuser:-"filename"}
fileuser 变量未设定或者为空,filename取"-"后面的值;否则filename=$fileuser
132.鸟哥比较建议使用这样的方式来进行运算: var=$((运算内容))
133.bc命令:支持浮点运算。
134. time命令:获取一个程序的执行时间,可以获取到实际运行时间以及程序在用户态和内核态分别的时间,大部分的性能测试,可能只需要关注实际时间。
135.执行shell scripts的4种方式:
1./bin中放置路径,然后直接文件名,
2../filename或者绝对路径,
3.sh。这三种都是在子bash中运行,
4.source是在父bash中运行。
136.test进行各种条件判断。与[]类似。
137.[□"$HOME"□==□"$MAIL"□] []作为判断这些地方必须有空格。#[]要注意空格。
138.在 bash 当中使用一 个等号与两个等号的结果是一样的! 不过在一般惯用程序的写法中,一个等号代表『变量的设定』,两个等号则是 代表『逻辑判断 (是与否之意)』。#形式上的不一样。
在中括号 [] 内的每个组件都需要有空格键来分隔;
在中括号内的变数,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来
[ "${name}" == "VBird" ]#注意空格和双引号。
139.简单的方式 可以利用 && 与 || ,但如果我还想要执行一堆指令呢?那真的得要 if then 来帮忙啰.#多条指令堆积:脚本,;,&&
140.[ "${yn}" == "Y" -o "${yn}" == "y" ]
上式可替换为
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
# &&同理。
141.在 shell script 当中的 function 的设定一 定要在程序的最前面
142.for 这种语法,则是『 已经知道 要进行几次循环』的状态!
143. 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。
144.$(( ))的用途用来作整数运算。#$()与··是命令替换,$(())是整数运算。
145.shell scripts学习方法:『多看、多模仿、并加以修改成自己的样式!』 是最快的学习手段了!网络上有相当多的 朋友在开发一些相当有用的 scripts ,若是你可以将对方的 scripts 拿来,并且改成适合自己主机的 样子!那么学习的效果会是最快的呢!#将别人的scripts拿来,然后转换成自己主机的模样。
146. Linux 主机并不会直接认识你的 『账号名称』的,他仅认识 ID 啊
147.~每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。
148.那么你输入账 号密码后,系统帮你处理了什么呢?
1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚 刚输入的密码与里头的密码是否相符?
3. 如果一切都 OK 的话,就进入 Shell 控管的阶段啰!
4.root:x:0:0:root:/root:/bin/bash
username;密码;usedid;groupid;说明;家目录;shell;
149.新版的 Linux 中,初始群组的用户群已经不会加入在第四个字段!
150.有效群组(effective group) ,次要群组与初始群组(initial group) ? /etc/passwd中的是初始群组。
groups命令后第一个就是有效群组。
151.
152.所以当有使用者想要加入 某些群组时, root 或许会没有空管理。此时如果能够建立群组管理员的话,那么该群组管理员就能够将那个账号加入自己管理的群组中! 可以免去 root 的忙碌啦!
153.系统账号主要是用来进行运作系统所需服务的权限设定。UID小于1000.所以系统账号默认都不会主动建立家目录的
154.私有群组机制与公共群组机制。redhat和centos都是私有群组机制,默认群组是自己。而不是gid=100;同一个群组会产生很多问题。
155.你希望每个账号都只能使用 email 的收发信件功能, 而不许用户登入系统取得 shell ,那么可以将这里设定为 /sbin/nologin
156.SKEL=/etc/skel:用户家目录参考基准目录 这个咚咚就是指定用户家目录的参考基准目录啰
157.用户的数据有:
用户账号/密码相关参数:/etc/passwd, /etc/shadow
使用者群组相关参数:/etc/group, /etc/gshadow
用户个人文件数据: /home/username, /var/spool/mail/username..
#与user相关的操作都是在这些文件上操作的。
158.linux ACL是比普通权限更加细节的权限设定。#比如共享啥的。
159. apache ,我们可以额外建立一个名为 apache 的用户来启动 apache 软件啊,如此一来,如果这个程序被攻破,至少系统还不至于就损毁了~#apache不能访问root用户的。
160.su - 与 sudo都可以进行用户切换。sudo需要提前设定,不需要root密码。#但是只能执行某些操作。并且要在文件里面设定。
161.单纯使用『 su 』切换成为 root 的身份,读取的变量设定方式为 non-login shell 的方式(xshell与su 都是这种方式),这种方式 很多原本的变量不会被改变
162、虽然使用 su 很方便啦,不过缺点是,当我的主机是多人共管的环境时,如果大家都要使用 su 来切 换成为 root 的身份,那么不就每个人都得要知道 root 的密码,这样密码太多人知道可能会流出去, 很不妥当呢!怎办?透过 sudo 来处理即可!相对于 su 需要了解新切换的用户密码 (常常是需要 root 的密码), sudo 的执行则仅需要自己的密 码即可! 事实上,一般用户能够具有 sudo 的使用权,就是管理员事先审核通过后,才开放 sudo 的使用权的!因此, 除非是信任用户,否则一般用户默认是不能操作 sudo 的喔!
163.系统账号的 shell 是 /sbin/nologin), 这个时候 sudo 真是他 X 的好用了!
164.举例来说,各个系统账号,打印作业由 lp 这个 账号在管理, WWW 服务由 apache 这个账号在管理, 他们都可以进行系统程序的工作,但是就 是无法登入主机取得互动的 shell』而已啦!^_^
165. PAM (验证机制)是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要 求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序
166如果随便输入字典上面找的到的字符串, passwd 就会回报错 误信息了!这是为什么呢?这就是 PAM 的 pam_cracklib.so 模块的功能!
167所以,当你有任何需要判断是否在字典当中的密码字符串时,就可以使用 pam_cracklib.so 这个模块 来验证! 并根据验证的回报结果来撰写你的程序呢!这样说,可以理解 PAM 的功能了吧?
168.例题:
为什么 root 无法以 telnet 直接登入系统,但是却能够使用 ssh 直接登入?
答:
一般来说, telnet 会引用 login 的 PAM 模块,而 login 的验证阶段会有 /etc/securetty 的限制! 由于远程联机
属于 pts/n (n 为数字) 的动态终端机接口装置名称,并没有写入到 /etc/securetty , 因此 root 无法以 telnet 登
入远程主机。至于 ssh 使用的是 /etc/pam.d/sshd 这个模块, 你可以查阅一下该模块,由于该模块的验证阶段并
没有加入 pam_securetty ,因此就没有 /etc/securetty 的限制!故可以从远程直接联机到服务器端。#不同的验证机制
169.密码登录错误可以到/var/log/secure, /var/log/messages等文件中寻找错误。
170.linux用户间的通信:
wall(广播) ,write,mail
171.在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生.---使用quota进行规划。 Quota 是针对整个 filesystem 进行限制,XFS 文件系统可以限制目录!Quota 的使用必须要核心与文件系统均支持。文件系统的参数必须含有 usrquota, grpquota, prjquota------需要软件之云的支持。
新版的 CentOS 预设都有启用 SELinux 这个核心功能,该功能会加强某些细部的权限控制!
柔性劝导,硬性规定 (soft/hard)与gracetime(宽限时间):
172.RAID 可以透过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘装置; 而这个较大的磁盘功能可不止是储存而已,他还具有数据保护,快速读取的功能呢。
在组成 RAID-0 时,每颗磁盘 (Disk A 与 Disk B) 都会先被区隔成为小区块 (chunk)。 当有数据要写入 RAID 时,资料会先被切割成符合小区块的大小,然后再依序一个一个的放置到不 同的磁盘去。当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量想一想,如果某一颗磁盘损毁了,那么文件数据 将缺一块,此时这个文件就损毁了。 由于每个文件都是这样存放的,因此 RAID-0 只要有任何一颗 磁盘损毁,在 RAID 上面的所有数据都会遗失而无法读取。我用 200G 与 500G 组成 RAID-0 , 那么最初的 400GB 数据可同时写入两颗磁盘 (各消耗 200G 的容 量),后来再加入的数据就只能写入 500G 的那颗磁盘中了。 此时的效能就变差了,因为只剩下一颗
可以存放数据嘛!
RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类 似 RAID-0 , 不过每个循环的写入过程中 (striping),在每颗磁盘还加入一个同位检查数据 (Parity) , 这个数据会记录其他磁盘的备份数据。 RAID 5 的总容量会是整体磁盘数 量减一颗。以上图为例, 原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量 大于等于两颗时,这整组 RAID 5 的资料就损毁了。 因为 RAID 5 预设仅能支持一颗磁盘的损毁情 况。读取的效能还不赖!与 RAID-0 有的比!不过写的效能就不见得能够增加很 多! 这是因为要写入 RAID 5 的数据还得要经过计算同位检查码 (parity) 的关系。(读取都有变慢)由于加上这个计 算的动作, 所以写入的效能与系统的硬件关系较大!因为 RAID5, RAID6 读写都需要经过 parity 的计算器制,因此读/写效能都不会刚好满足于使用 的磁盘数量喔!
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启 动磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然 后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。#raid0不行。raid5可以。
Spare Disk :预备磁盘的功能:
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启 动磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上!然 后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘, 除非你的系统有支持热拔插,否则通常得要关机才能这么做。
所谓的硬件磁盘阵列 (hardware RAID) 是透过磁盘阵列卡来达 成数组的目的(我们的服务器好像都用的这个)。 磁盘阵列卡上面有一块专门的芯片在处理 RAID 的任务,因此在效能方面会比较好。软件磁盘阵列主要是透过软件来 仿真数组的任务, 因此会损耗较多的系统资源,比如说 CPU 的运算与 I/O 总线的资源等。不过目 前我们的个人计算机实在已经非常快速了, 因此以前的速度限制现在已经不存在!所以我们可以来 玩一玩软件磁盘阵列!
我们的 CentOS 提供的软件磁盘阵列为 mdadm 这套软件,这套软件会以 partition 或 disk 为磁盘 的单位,也就是说,你不需要两颗以上的磁盘,只要有两个以上的分区槽 (partition) 就能够设计你的 磁盘阵列了。#软件磁盘阵列只需要2个分区。
热插拔与冷插拔。
硬件磁盘 阵列的装置文件名为 /dev/sd[a-p] ,因为使用到 SCSI 的模块之故。至于软件磁盘阵列则是系统仿真 的,因此使用的装置文件名是系统的装置文件, 文件名为 /dev/md0, /dev/md1...,两者的装置文件名 并不相同!
173.LVM 的重点在于『可以弹性的调整 filesystem 的容量!』而并非在于效能与数据保全上面。 需要 文件的读写效能或者是数据的可靠性,请参考前面的 RAID 小节。
我们刚刚有谈到 LVM 可弹性的变更 filesystem 的容量,那是如何办到的?其实他就是透 过『交换 PE 』来进行数据转换。
基本上,LVM 最主要的用处是在实现一个可以弹性调整容量的文件系统上, 而不是在建立一个效 能为主的磁盘上。如果要强调效能与备份,那么就直接使用 RAID 即可, 不需要用到 LVM 啊!
如果你想要保有放大、缩小的本事, 那还请回去使用 EXT 家族最新的 EXT4 文件系统啰!XFS 目前是办不到的!
什么是 LVM thin Volume 呢?这东西其实挺好玩的,他的概念是:先建立一个可以实支实付、用多 少容量才分配实际写入多少容量的磁盘容量储存池 (thin pool), 然后再由这个 thin pool 去产生一个 『指定要固定容量大小的 LV 装置』,这个 LV 就有趣了!虽然你会看到『宣告上,他的容量可能 有 10GB ,但实际上, 该装置用到多少容量时,才会从 thin pool 去实际取得所需要的容量』!就 如同上面的环境说的,可能我们的 thin pool 仅有 1GB 的容量, 但是可以分配给一个 10GB 的 LV 装置!而该装置实际使用到 500M 时,整个 thin pool 才分配 500M 给该 LV 的意思!当然啦! 在 所有由 thin pool 所分配出来的 LV 装置中,总实际使用量绝不能超过 thin pool 的最大实际容量啊! 如这个案例说的, thin pool 仅有 1GB, 那所有的由这个 thin pool 建置出来的 LV 装置内的实际 用量,就绝不能超过 1GB 啊!
其实LVM还有一个重要的能力,那就 是 LV 磁盘的快照 (snapshot)。 什么是 LV 磁盘快照啊?快照就是将当时的系统信息记录下来,就
好像照相记录一般! 未来若有任何资料更动了,则原始资料会被搬移到快照区,没有被更动的区域 则由快照区与文件系统共享。-------其实就是备份。
174.从上面的说明当中,我们可以很清楚的发现两种工作排程的方式:
一种是例行性的,就是每隔一定的周期要来办的事项;
一种是突发性的,就是这次做完以后就没有的那一种 ( 3C 大降价...)
at :at 是个可以处理仅执行一次就结束排程的指令,
crontab :crontab 这个指令所设定的工作将会循环的一直进行下去!
要使用单一工作排程时(行程表),我们的 Linux 系统上面必须要有负责这个排程的服务,那就是 atd 这个玩 意儿。at:我要在某个时刻干某件事。#服务,所以要+d
由于 at 工作排程的使用上,系统会将该项 at 工作独立出你的 bash 环境中, 直接交给系统的 atd 程序来接管,因此,当你下达了 at 的工作之后就可以立刻脱机了, 剩下的工作就完全交给 Linux 管 理即可!所以啰,如果有长时间的网络工作时,嘿嘿! 使用 at 可以让你免除网络断线后的困扰喔!batch使at在cpu不繁忙的时候运行
/etc/cron.allow: #at类似。
将可以使用 crontab 的账号写入其中,若不在这个文件内的使用者则不可使用 crontab;
/etc/cron.deny:
将不可以使用 crontab 的账号记录到这写入其中,若未个文件当中的使用者,就可以使用 crontab 。当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去 了,而且是以账号来作为判别的喔!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错 误,会导致无法执行 cron 喔!另外, cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录 档中,所以啰,如果你的 Linux 不知道有否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录 档呢
系统的例行性任务在/etc/crontab里,与用户的例行任务不是一个文件。
cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容
在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工 作事项,但是某些原因或者是其他的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上执行, 这个时候请重新启动 crond 这个服务吧! 这样才能加到内存中。#支持脱机
175.一般来说,crond 预设有三个地方会有执行脚本配置文件,他们分别是: #命令套路都一样。
/etc/crontab #不同的情况使用不同的crontab方式,也会带来不同的后果。
/etc/cron.d/*
/var/spool/cron/*
个人化的行为使用『 crontab -e 』:如果你是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e 来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权 限喔!);
系统维护管理使用『 vim /etc/crontab 』:如果你这个例行工作排程是系统的重要工作,为了让自己管理方 便,同时容易追踪,建议直接写入 /etc/crontab 较佳!
自己开发软件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己开发软件,那当然最好就是使用全新的配 置文件,并且放置于 /etc/cron.d/ 目录内即可。
固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来 集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目 录中,直接写入指令即可
如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙,所以,这
个时候就必须要分别设定啦!我可以这样做:
[root@study ~]# vim /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4
这时候就得要靠 anacron 这个指令的功能了!在处理非 24 小 时一直启动的 Linux 系统的 crontab 的执行!这家伙可以 主动帮你进行时间到了但却没有执行的排程喔!
为什么隔了一阵子才将 CentOS 开机,开机过后约 1 小时左 右系统会有一小段时间的忙碌!而且硬盘会跑个不停!那就是因为 anacron 正在执行过去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里头的未进行的各项工作排程啦!
如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就 过期了,并不会被抓回来重新执行。anacron不会去这里运行。
触发
176.
任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时 依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。』 从此以后,这 个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!#PID与权限。
177.当 dmtsai 登入后,他取得一个 PID 号码为 2234 的进程,这个进程的 User/Group 都是 dmtsai ,而当这个程序进行其他作业时,例如上面提到的 touch 这个指令时, 那 么由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限的!
咦!明明我将有问题的进程关闭了,怎么过一阵子他又自动的产生?肯定有一支父进程存在,所以你杀掉子进程后, 父进程就会主动再生一支!
系统先以 fork 的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的差别就是 PID 不同! 但是这个暂存进程还会多一个 PPID 的参数,PPID 如前所述,就是父进程的进程标识符啦! 然后(2)暂存进程开始以 exec 的方式加载实际要执行的程序,以上述图标来讲,新的程序名称为 qqq , 最终子进程的程序代码就会变成 qqq 了! 这样了解乎!
常驻在内存当中的进程,常驻程序 就会被我们称为:服务 (daemon)。
启动一个可以负责网络监听的端口 (port) ,以提供外部客户端 (client) 的联机要求。
以 crontab 来说,他的主要执行程序名称应该是 cron 或 at 才对,为啥要加个 d 在 后面?而成为 crond, atd 呢?就是因为 Linux 希望我们可以简单的判断该程序是否为 daemon(服务,常驻内存的程序), 所以,一般 daemon 类型的程序都会加上 d 在文件名后头~包括服务器篇我们会看到的 httpd, vsftpd 等等都是 ^_^。
178.当多人同时登入系统时,其实会感受到整部主机好像就 为了你存在一般! 这就是多人多任务的环境啦!
在 Linux 当中,默认提供了六个文字界面登入窗口,以及一个图形界面
老实说, Linux 几乎可以说绝对不会当机的!因为他可以在任何时 候, 将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动!
179要注意的是,放入背景的工作想要 运作时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的! 因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!
如前所述,bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够 将别人的 bash 底下的 job 给他拿过来执行。#各个Bash各管各的,root也不能管别人。
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
[root@study ~]# jobs - -l l
[1]- 14566 Stopped vim ~/.bashrc #-代表倒数第二个放到背景中运行的job
[2]+ 14567 Stopped find / -print # +代表最新放到背景中运行的JOb
fg %number调用后台中暂停的Job
如果输入『 fg - 』 则代表将 - 号的那个工作号码拿出来
bg%number 让stop的后台程序running.
&直接在后台运行。
-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是 以正常步骤结束一项工作(15 也是默认值)。两者之间并不相同呦!举上面的例子来说, 我用 vim 的 时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal 时, vim 会尝试 以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中。这 样您应该可以稍微分辨一下了吧?
kill -9 %jobnumber 杀死job
&是 bash 的背景,并不是放到系统的背景去喔!在工作尚未结束的情况下你脱机了,该工作还会继续进行吗?答 案是『否』。脱机代表关闭bash!不会继续进行,而是会被中断掉。at 与cron是将工作放置到系统背景, 而与终端机无关。你也可以尝试使用 nohup 这个指令来处理喔!这个 nohup (disown)可以让你在脱机或 注销系统后,还能够让工作继续进行。
Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别。内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是写在bashy源码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程。比如:exit,history,cd,echo等。
外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找、加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可通过“echo $PATH”命令查看外部命令的存储路径,比如:ls、vi等。#内部命令没外部命令强大和复杂,但是调用较快。
我们在操作系统时的各项工作其实都是经过某个 PID 来达成的 (包括你的 bash 环境)
系统整体的进程运作是非常多的,但如果使用 ps -l 则仅列出与你的操作环境 (bash) 有关的进程 而已亦即最上层的父进程会是你自己的 bash 而没有延伸到 systemd (后续会交待!)
TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);除此之外,我们必须要知道的是『僵尸 (zombie) 』进程是什么? 通常,造成僵尸进程的成因是 因为该进程应该已经执行完毕,或者是因故应该要终止了, 但是该进程的父进程却无法完整的将 该进程结束掉,而造成那个进程一直存在内存当中。 如果你发现在某个进程的 CMD 后面还接上 <defunct> 时,就代表该进程是僵尸进程啦
事实上,通常僵尸进程都已经无法控管,而直接是交给 systemd 这支程序来负责了,偏偏 systemd 是系统第一支执行的程序, 他是所有程序的父程序!我们无法杀掉该程序的 (杀掉他,系统就死 掉了!),所以啰,如果产生僵尸进程, 而系统过一阵子还没有办法透过核心非经常性的特殊处理 来将该进程删除时,那你只好透过 reboot 的方式来将该进程抹去了!
虚拟内存 (Mem/Swap) 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!
top 预设使用 CPU 使用率 (%CPU) 作为排序的重点。
所有的进程都是依附在 systemd 这支进程底下的! 仔 细看一下,这支进程的 PID 是一号喔!因为他是由 Linux 核心所主动呼叫的第一支程序!所以 PID 就是一号了。 这也是我们刚刚提到僵尸进程时有提到,为啥发生僵尸进程需要重新启动? 因为 systemd 要重新启动,而重新启动 systemd 就是 reboot 啰!
如果 子进程挂点或者是老是砍不掉子进程时,该如何找到父进程吗?呵呵!用这个 pstree 就对了!
进程是如何互相管理的呢?其 实是透过给予该进程一个讯号 (signal) 去告知该进程你想要让她作什么!
kill -1 SIGHUP 启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重新启动
kill -9 SIGKILL 代表强制中断一个进程的进行,如果该进程进行到一半, 那么尚未完成的部分可能会有『半产 品』产生,类似 vim 会有 .filename.swp 保留下来。
kill -15 SIGTERM 以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的动作会将他完成。不过,如 果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
killall -9 httpd(不是pid号)
优先度:PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI 值的。
PRI(new) = PRI(old) + nice #通过nice调整优先级,但是核心会动态调整Old系统设定。整个 nice 值是可以在父进程 --> 子进程之间传递的 呢!
free命令后后面的 shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及快取的量,这些 shared/buffers/cached 的用量中,在系统比较忙碌时, 可以被释出而继续利用!因此后面就有一个 available (可用的) 数值!
一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上, 如果您发现 swap 的用量超过 20% ,那么,最好还是买物理内存来 插吧! 因为, Swap 的效能跟物理内存实在差很多,而系统会使用到 swap , 绝对是因为物理内 存不足了才会这样做的!如此,了解吧!
由于有 socket file,因此类似 X Window 这种需要透过网络连接的软件,目前 新版的 distributions 就以 socket 来进行窗口接口的联机沟通了。
SELinux 是由美国国家安全局 (NSA) 开发的,当初开发这玩意儿的目的是因为很多企业界发现, 通 常系统出现问题的原因大部分都在于『内部员工的资源误用』所导致的,实际由外部发动的攻击反而 没有这么严重。她们便使用 Linux 来作为研究的目标, 最后更 将研究的结果整合到 Linux 核心里面去,那就是 SELinux 啦!所以说, SELinux 是整合到核心的 一个模块喔!
SELinux 是在进行进程、文件等细部权限设定依据的一个核心模块!由于启动网 络服务的也是进程,因此刚好也能够控制网络服务能否存取系统资源的一道关卡!
这种存取文件系统的方式被称为『自主式访问控制 (Discretionary Access Control, DAC)』,基本上, 就是依据进程的拥有者与文件资源的 rwx 权限来决定有无存取的能力。 为 了避免 DAC 容易发生的问题,因此 SELinux 导入了委任式访问控制 (Mandatory Access Control, MAC) 的方法!我们针对控制的『主体』变成了『进程』而不是使用者喔!这个主体进程也不能任意使用系统文件资源,因为每个文件资源也有针对该主体进程设定可取用 的权限!
主体 (Subject) :
SELinux 主要想要管理的就是进程,因此你可以将『主体』跟本章谈到的 process 划上等号;
目标 (Object) :
主体进程能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;
政策 (Policy) :
由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会
有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个
主要的政策,分别是:
o targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
o minimum:由 target 修订而来,仅针对选择的进程来保护!
o mls:完整的 SELinux 限制,限制方面较为严格
主体与目标的安全性 本文必须一致才能够顺利存取。
查阅某个文件系统底下有多少进程正在占用该文件系统--fuser
fuser 是由文件或者装置去找出使用该文件或装置的进程,反过来说,如何查出某个进程开启 或者使用的文件与装置呢?--lsof
进程与文件之间的关系。
我们前面不是谈过主体进程需要经过政策规则、安全本文 比对之后,加上 rwx 的权限规范, 若一切合理才会让进程顺利的读取文件
Disabled 的 模式,那么 SELinux 将不会运作,当然受限的进程也不会经过 SELinux , 也是直接去判断 rwx 而 已。那如果是宽容 (permissive) 模式呢?这种模式也是不会将主体进程抵挡 (所以箭头是可以直接穿 透的喔!),不过万一没有通过政策规则,或者是安全本文的比对时, 那么该读写动作将会被纪录起 来 (log),可作为未来检查问题的判断依据。 至于最终那个 Enforcing 模式,就是实际将受限主体进入规则比对、安全本文比对的流程,若失败, 就直接抵挡主体进程的读写行为,并且将他记录下来。 如果通通没问题,这才进入到 rwx 权限的判 断喔!
如果改变了政策则需要重新启动是因为 SELinux 是整合到核心里面去的
SELinux 当初的设计是为了避免使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设定系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称 为 service 。 但是 service 的提供总是需要程序的运作吧!否则如何执行呢?所以达成这个 service 的程序我们就称呼他为 daemon 啰!
每一个服务的开发者,当初在开发他们的服务时,都有特别的故事啦!不 过,无论如何,这些服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d .这个 d 代表的就是 daemon 的意思
系统核心第一支 呼叫的程序是 init , 然后 init 去唤起所有的系统所需要的服务
/etc/init.d/
init 服务的分类中,依据服务是独立启动或被一只总管程序管理而分为两大类:
o 独立启动模式 (stand alone):服务独立启动,该服务直接常驻于内存中,提供本机或用户的服务行
为,反应速度快。
o 总管程序 (super daemon):由特殊的 xinetd 或 inetd 这两个总管程序提供 socket 对应或 port 对应
的管理。当没有用户要求某 socket 或 port 时, 所需要的服务是不会被启动的。若有用户要求时,
xinetd 总管才会去唤醒相对应的服务程序。
从 CentOS 7.x 以后,Red Hat 系列的 distribution 放弃沿用多年的 System V 开机启动服务的流程, 就是前一小节提到的 init 启动脚本的方法, 改用 systemd 这个启动服务管理机制
平行处理所有服务,加速开机流程:
旧的 init 启动脚本是『一项一项任务依序启动』的模式,因此不相依的服务也是得要一个一个的等待。但
目前我们的硬件主机系统与操作系统几乎都支持多核心架构了, 没道理未相依的服务不能同时启动啊!
systemd 就是可以让所有的服务同时启动,因此你会发现到,系统启动的速度变快了!
一经要求就响应的 on-demand 启动方式:
systemd 全部就是仅有一只 systemd 服务搭配 systemctl 指令来处理,无须其他额外的指令来支持。不像systemV 还要 init, chkconfig, service... 等等指令。 此外, systemd 由于常驻内存,因此任何要求(on-demand) 都可以立即处理后续的 daemon 启动的任务。还有很多更先进的地方,
systemd是Init的增强版。
systemd 这个启动服务的机制,主要是透过一只名为 systemctl 的指令来处理的!跟以前 systemV 需要 service / chkconfig / setup / init 等指令来协助不同, systemd 就是仅有 systemctl 这个 指令来处理而已呦!
180.什么是登录档 『详细而确实的分析以及备份系统的登录文件』就是记录系统活动信息的几个文件, 例如:何时、何地 (来源 IP)、何人 (什么服务名称)、做了什么动作 (讯息登录啰)。 换句话说就是:记录系统在什么时候由哪个程序做 了什么样的行为时,发生了何种的事件等等。
你可以透过 (1)察看屏幕上面的错误讯息与 (2) 登录文件的错误信息,几乎可以解决大部分的 Linux 问题!
登录档无非就是一些Log,一般都在某个文件夹下面,
180.开机管理程序可以指定使用哪个核心文件来开机,并实际加载核心到内存当中解压缩与执行, 此时 核心就能够开始在内存内活动,并侦测所有硬件信息与加载适当的驱动程序来使整部主机开始运作, 等到核心侦测硬件与加载驱动程序完毕后,一个最阳春的操作系统就开始在你的 PC 上面跑了。MBR 就代表该磁盘的最前面可 安装 boot loader 的那个区块就对了!
BIOS (Basic Input Output System)
但由于不同的操作系统他的文件系统格式不相同,因此我们必须要以一个开 机管理程序来处理核心文件加载 (load) 的问题, 因此这个开机管理程序就被称为 Boot Loader 了。 那这个 Boot Loader 程序安装在哪里呢?就在开机装置的第一个扇区 (sector) 内,也就是我们一直谈 到的 MBR (Master Boot Record, 主要启动记录区)。
那么如果我的主机上面有两颗硬盘的话, 系统会去哪颗硬盘的最前面区块读取 boot loader 呢?这个就得要看 BIOS 的设定了。
你会发现 systemd 的 PID 号码是一号啦。 systemd 最主要的功能就是准备软件执行的 环境,包括系统的主机名、网络设定、语系处理、文件系统格式及其他服务的启动等。
谈完了整个开机的流程,您应该会知道,在整个开机的过程当中,是否能够成功的驱动我们主机的硬 件配备, 是核心 (kernel) 的工作!由一只程序带动整个系统的其他程序。
181.在 W 牌的操作系统上面安装软件时,不是只要一直给他按 『下一步』 就可以安装妥当了吗?话是这样说没错啦,不过,也由于如此,所以在 Windows 系统上面的软件都 是一模一样的,也就是说,你『无法修改该软件的源代码』,因此, 万一你想要增加或者减少该软 件的某些功能时,大概只能求助于当初发行该软件的厂商了!
linux可以提早自己补漏。
这样说可以了解 Linux 的优点了吗?没错!因为 Linux 上面的软件几乎都是经过 GPL 的授权,所 以每个软件几乎均提供源代码, 并且你可以自行修改该程序代码,以符合你个人的需求呢!
Linux 系统上真 正认识的可执行文件其实是二进制文件 ( binary program)
gcc-----编译链接。
以除了每个主程序与子程序均需要写上一笔编译过程的指令外,还需要 写上最终的链接程序。程序代码小的时候还好,如果是类似 WWW 服务器软件 (例如 Apache) , 或者是类似核心的原始码,动则数百 MBytes 的数据量,编译指令会写到疯掉~这个时候,我们就 可以使用 make 这个指令的相关功能来进行编译过程的指令简化了!
当执行 make 时,make 会在当时的目录下搜寻 Makefile (or makefile) 这个文本文件,而 Makefile 里 面则记录了原始码如何编译的详细信息! make 会自动的判别原始码是否经过变动了,而自动更新 执行档,是软件工程师相当好用的一个辅助工具呢!
咦!make 是一支程序,会去找 Makefile ,那 Makefile 怎么写? 通常软件开发商都会写一支侦测 程序来侦测用户的作业环境, 以及该作业环境是否有软件开发商所需要的其他功能,该侦测程序侦 测完毕后,就会主动的建立这个 Makefile 的规则文件啦!通常这支侦测程序的文件名为 configure 或 者是 config 。
所以同 一套软件要在不同的平台上面执行时, 必须要重复编译!#环境不一样,所以要重新编译。所以才需要原始码嘛!了解乎!
谓的 Tarball 文件,其实就是将软件的所有原始码文件先以 tar 打包,然后再以压缩技术来压缩, 通常最常见的就是以 gzip 来压缩了。
编写hello.c(C语言程序)--gcc -c 编译生成.o文件(有排错功能)。----gcc -o 可将多个.o文件链接生成.最终文件。然后执行。
进阶: ----configure侦测环境生成makefile,然后Make程序再执行makefile。 make是gcc的进阶。
如果有一天,你更新了 thanks_2.c 这个文件的内容,则你只要重新编译 thanks_2.c 来产生新的 thanks_2.o ,然后再以连结制作出新的 binary 可执行文件即可!而不必重新编译其他没有更动过的 原始码文件。
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
# 2. 以新的目标 (clean) 测试看看执行 make 的结果:
[root@study ~]# make clean <==就是这里!透过 make 以 clean 为目标
rm -rf main main.o haha.o sin_value.o cos_value.o
跨平台就重新编译一下就可以了。
刚刚我们在 Linux 底下写的程序『理论上,是可以 在 Windows 上面编译的!』这就是原始码的好处啦!所以说,如果朋友们想要学习程序语言的话, 鸟哥个人是比较建议学习『具有跨平台能力的程序语言』,例如 C 就是很不错的一个!
gcc 或 cc 等 C 语言编译程序 (compiler)
源码安装,yum安装与rpm安装。---一共有三种安装。
源码安装流程:
1. 取得原始档:将 tarball 文件在 /usr/local/src 目录下解压缩;
2. 取得步骤流程:进入新建立的目录底下,去查阅 INSTALL 与 README 等相关文件内容 (很重要的步骤!);
3. 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
4. 建立 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并建立 Makefile 这个文件;
5. 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置文件,来进行 make (编译或其他)
的动作;
6. 安装:以 make 这个程序,并以 Makefile 这个参数配置文件,依据 install 这个目标 (target) 的指定来安
装到正确的路径!
make 生成目标文件, make install 执行目标文件然后安装到指定目录。 clean是clean这个目标。通常删除.o。
通常『make clean』代表着将目标文件 (object file) 清除掉,『make』则是将原始码进行编译而已。 注 意喔!编译完成的可执行文件与相关的配置文件还在原始码所在的目录当中喔!因此,最后要进行 『make install』来将编译完成的所有咚咚都给他安装到正确的路径去,这样就可以使用该软件啦!
!使用 make 就是要将原始码编译成为可以被执行的可执行文件,而这个可执行文件会放置在 目前所在的目录之下, 尚未被安装到预定安装的目录中;make install 通常这就是最后的安装步骤了,make 会依据 Makefile 这个文件里面关于 install 的项目,将上一个步骤所 编译完成的数据给他安装到预定的目录中,就完成安装啦!
我们晓得几乎每个软件都会提供联机帮助的服务,那就是 info 与 man 的功能。在预设 的情况下, man 会去搜寻 /usr/local/man 里面的说明文件, 因此,如果我们将软件安装在 /usr/local 底下的话,那么自然安装完成之后, 该软件的说明文件就可以被找到了。此外,如果你所管理的主 机其实是由多人共同管理的, 或者是如同学校里面,一部主机是由学生管理的,但是学生总会毕业 吧? 所以需要进行交接,如果大家都将软件安装在 /usr/local 底下,那么管理上不就显的特别的容 易吗!而且找库也会默认去找的。
静态函式库的特色:
扩展名:(扩展名为 .a)--升级要重新编译,库放到软件中,较大。
这类的函式库通常扩展名为 libxxx.a 的类型;
编译行为:
这类函式库在编译的时候会直接整合到执行程序当中,所以利用静态函式库编译成的文件会比较大一些喔;
独立执行的状态:
这类函式库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函式库的
内容 (请参照动态函式库的说明)。
升级难易度:
虽然执行档可以独立执行,但因为函式库是直接整合到执行档中, 因此若函式库升级时,整个执行档必须
要重新编译才能将新版的函式库整合到程序当中。 也就是说,在升级方面,只要函式库升级了,所有将此
函式库纳入的程序都需要重新编译!
动态函式库的特色:
扩展名:(扩展名为 .so)---通过指针外面找,文件较小,库升级不需要重新编译。
这类函式库通常扩展名为 libxxx.so 的类型;
编译行为:
动态函式库与静态函式库的编译行为差异挺大的。 与静态函式库被整个捉到程序中不同的,动态函式库在
编译的时候,在程序里面只有一个『指向 (Pointer)』的位置而已。也就是说,动态函式库的内容并没有被
整合到执行档当中,而是当执行档要使用到函式库的机制时, 程序才会去读取函式库来使用。由于执行文
件当中仅具有指向动态函式库所在的指标而已, 并不包含函式库的内容,所以他的文件会比较小一点。
独立执行的状态:
这类型的函式库所编译出来的程序不能被独立执行, 因为当我们使用到函式库的机制时,程序才会去读取
函式库,所以函式库文件『必须要存在』才行,而且,函式库的『所在目录也不能改变』,因为我们的可执
行文件里面仅有『指标』亦即当要取用该动态函式库时, 程序会主动去某个路径下读取,呵呵!所以动态
函式库可不能随意移动或删除,会影响很多相依的程序软件喔!
升级难易度:
虽然这类型的执行档无法独立运作,然而由于是具有指向的功能, 所以,当函式库升级后,执行档根本不
需要进行重新编译的行为,因为执行档会直接指向新的函式库文件 (前提是函式库新旧版本的档名相同喔!)。
函数库一帮放在/usr/lib64下。
如何将动态函式库加载高速缓存当中呢?
1. 首先,我们必须要在 /etc/ld.so.conf 里面写下『 想要读入高速缓存当中的动态函式库所在的目录』,注意
喔, 是目录而不是文件;
2. 接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中;
3. 同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中吶!
183.软件管理员:源码安装需要编译安装(gcc---make)大量的编译容易报错。从而引出了rpm。rpm是一些经过编译的东西,不再需要编译,有特定的硬软件要求,不合格安装不了。可以进行安装,升级,重建等操作。rpm升级非常麻烦,从而引出了ymp机制,支持通过rpm所建立的数据库信息,到os共享的服务器上在线批量更新,升级安装所需软件的功能。rpm现在已经被yum取代了。优先考虑yum再考虑源码安装。
使用的软件管理机制为 RPM 机制,而用来作为在线 升级的方式则为 yum !
RPM 全名是『 RedHat Package Manager 』。RPM 是以一种数据库记录的方式来将你所需要的软件安装到 你的 Linux 系统的一套管理机制。
有没有想过,如果我的 Linux 系统与厂商的系统一模一样,那么在厂商的系统上面编译出来的执
行档, 自然也就可以在我的系统上面跑啰!也就是说,厂商先在他们的系统上面编译好了我们用户
所需要的软件, 然后将这个编译好的可执行的软件直接释出给用户来安装--rpm的原理,避开了麻烦的源码安装。
客户端取得这个文件后,只要透过特定的指令来安装, 那么该软件文件就会依照内部的 脚本来侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装。
没错!您真聪明!目前新的 Linux 开发商都有提供这样的『在线升级』机制,透过这个机制, 原版
光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开发商所提供的任
何软件了呢! 在 dpkg 管理机制上就开发出 APT 的在线升级机制,RPM 则依开发商的不同,有
Red Hat 系统的 yum , SuSE 系统的 Yast Online Update (YOU) 等。---升级也不用编译了。
rpm的好处:
1. 由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);
2. 由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查询、升级与反安装
该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。
举例来说,rp-pppoe 这个 ADSL 拨接软件,他必须要在 ppp 这个软件存在的环境下才能进行安装!
有时候CentOS 6.x 的 RPM 文件就无法直接套用在 CentOS 7.x !
rpm要注意的问题:
1. 软件文件安装的环境必须与打包时的环境需求一致或相当;
2. 需要满足软件的相依属性需求;
3. 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!
那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时? 呵呵!还好,
还有 SRPM 这个东西!SRPM 是什么呢?顾名思义,他是 Source RPM 的意思,也就是这个 RPM 文
件里面含有原始码哩!特别注意的是,这个 SRPM 所提供的软件内容『并没有经过编译』, 它提供
的是原始码喔!
为何说 CentOS 是『社群维护的企业版』呢? Red Hat 公司的 RHEL 释出后,连带
会将 SRPM 释出。 社群的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复释出成为 CentOS,
所以才能号称与 Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一
支程序的, 也能够透过学习 SRPM 内含的编译参数,来学习的啊!
在安装的过程中, RPM 会去检验 一下数据库里面是否已经存在相关的软件了, 如果数据库显示不存在,那么这个 RPM 文件『预设』
就不能安装。呵呵!没有错,这个就是 RPM 类型的文件最为人所诟病的『软件的属性相依』问题 啦!
那想一想,要是我将这些相依属性的软件先列表, 在有要安装软件需求的时候,先到
这个列表去找,同时与系统内已安装的软件相比较,没安装到的相依软件就一口气同时安装起来, 那
不就解决了相依属性的问题了吗?有没有这种机制啊?有啊!那就是 YUM 机制的由来!
yum 就可以直接用来进行安装的动作,基本上 rpm 这个指 令真的就只剩下查询与检验的功能啰! 所以,查询与检验还是要学的,至于安装,透过 yum 就好了!
若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入 /var/lib/rpm/ 目录下的数据库文件中了。 上面这个目录内的数据很重要喔!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库, 而如果你想要查询系统已经安装的软件,也是从这里查询的!同时,目前的 RPM 也提供数字签名信息, 这些数字签名也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!
rpm安装,升级。
在查询的部分,所有的参数之前都需要加上 -q 才是所谓的查询!查询主要分为两部分, 一个是查 已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。
如果我误砍了某个重要文件,例如 /etc/crontab,偏偏不晓得他属于哪一个软件,该怎么办?通过rpm命令解决。
rpm软件包安装需要数字签名 (digital signature)。
RPM 反安装(卸载)与重建数据库(出问题的时候可用)。
要注意的是,『解安装的过程一定要由最上层往下解除』。
从范例一我们知道 pam 所提供的函式库是让非常多其他软件使用的,因此你不能移除 pam ,除非 将其他相依软件一口气也全部移除!你当然也能加 --nodeps 来强制移除, 不过,如此一来所有会用 到 pam 函式库的软件,都将成为无法运作的程序。
我们想要使用 yum 的功能时,必须要先找到适合的 yum server 才行啊!
事实上 CentOS 在释出软件时已经制作出多部映像站台 (mirror site) 提供全世界的软件更新之用。 所以,理论上我们不需要处理任何设定值,只要能够连上 Internet ,就可以使用 yum 啰!
,似乎不需要 rpm 这个指令也能够快乐的安装所有的软件了! 虽然是如 此,但是 yum 毕竟是架构在 rpm 上面所发展起来的,所以,鸟哥认为你还是得需要了解 rpm 才行! 不要学了 yum 之后就将 rpm 的功能忘记了呢!切记切记!
优先选择rpm安装,然后选择源码安装。
自己制作RPM.
SRPM 最大的优点就是可以让使用者自行修改设定参数 (makefile/configure 的参数) ,以 符合使用者自己的 Linux 环境;
RPM 软件的属性相依问题,已经可以藉由 yum 或者是 APT 等方式加以克服。
184.X windows系统包括xserver和xclient(包括Manager,其主要功能为控制多个client)两个主要模块。全部装在linux服务器上。server负责控制显示器等等的配置。client负责描绘数据传输到server进行展示。x windows系统不是一个操作系统,只是一个软件集合。多个client能够展示很多软件。
在 Linux 上头的图形接口我们称之为 X Window System,简称为 X 或 X11 啰! 为何称之为系统呢?这是因为 X 窗口 系统又分为 X server 与 X client ,既然是 Server/Client (主从架构) 这就表示其实 X 窗口系统是可以跨网络且跨平台的!X 窗口系统对于 Linux 来说仅是一个软件。
在 Unix Like 上面的图形用户接口 (GUI) 被称为 X 或 X11;
X11 是一个『软件』而不是一个操作系统;
X11 是利用网络架构来进行图形接口的执行与绘制;
较著名的 X 版本为 X11R6 这一版,目前大部分的 X 都是这一版演化出来的 (包括 X11R7);
现在大部分的 distribution 使用的 X 都是由 Xorg 基金会所提供的 X11 软件;
X11 使用的是 MIT 授权,为类似 GPL 的开放原始码授权方式。
其中 X Server 在管理硬件,
而 X Client 则是应用程序。
X Server 的重点就是在管理客户端的硬件,包括接受键盘/鼠标等设备的 输入信息, 并且将图形绘制到屏幕上 (请注意上图的所有组件之间的箭头指示)。
远程服务器提供的是 X client 软件啊!
包括键盘、鼠标、手写板、显示器 (monitor) 、屏幕分辨率与颜色深度、显 示适配器 (包含驱动程序) 与显示的字型等等,都是 X Server 管理的。
X Server 的主要功能就是 在管理『主机』上面的显示硬件与驱动程序。--有自己的驱动要配置,与Linux不一定相同。
每部客户端主机都需要安装 X Server,而服务器端则是提供 X Client 软件, 以 提供客户端绘图所需要的数据数据。
每个 X Client 并不知道其他 X Client 的存在, 意思 是说,如果有两个以上的 X client 同时存在时,两者并不知道对方到底传了什么数据给 X Server , 因此 X Client 的绘图常常会互相重迭而产生困扰喔!
X Client 不需要知道 X Server 的硬件配备与操作系统!
X client 彼此不知道对方在屏幕的哪个位置啊!为了克服这个问题,因此就有 ,Window Manager (WM, 窗口管理员) 的产生了。 窗口管理员也是 X client ,只是他主要在负责全部 。
X client 的控管,还包括提供某些特殊的功能,例如:
提供许多的控制元素,包括任务栏、背景桌面的设定等等;
管理虚拟桌面 (virtual desktop);
提供窗口控制参数,这包括窗口的大小、窗口的重迭显示、窗口的移动、窗口的最小化等等。
这两个窗口管理员上面还有提供非常多的 X client 软件, 包括办公室生产力软件 (Open Office) 以及常用的网络功能 (firefox 浏览器、 Thunderbird 收发信件软件) 等。
X server/X client/Window Manager 是同时存在于我们一部 Linux 主机上头的 啦!
184.核心主要管理系统的硬件,启动操作系统必须要有核心的支持,但是里面只有常用的功能,不常用的功能都变成了模块,需要时调用。如果你有需要可以重新编译核心。核心经过编译后才能到内存中被操作系统识别。
如果你想要 将你的 Linux 安装到 USB 随身碟、想要将你的 Eee PC 小笔电安装自己的 Linux , 想让你的 Linux 可以驱动你的小 家电,此时,核心编译就是相当重要的一个任务了!
你想要让计算机 进行的工作,都必须要『核心有支持』才可以!
这个核心文件通常被放置成 /boot/vmlinuz-xxx
.亦即是将一 些不常用的类似驱动程序的咚咚独立出核心,编译成为模块,然后, 核心可以在系统正常运作的过 程当中加载这个模块到核心的支持。驱动程序就是模块。
核心其实是一个文件.为什么会是一个文件呢?是经过核心编译的!变成文件放到主存中。
核心是操作系统中最早被加载到内存的咚咚。
Kernel 可以随时、随各人喜好而更动。
核心的主要工作是在控制硬件!。
185.LINUX命令格式: command 选项 参数
选项是 -h 或者全称 --help
186
如果要我们一个一个的去检查这些模块的主要信息,然后定义出他们的相依性, 我们可能会疯掉吧!所以说,我们的 Linux 当然会提供一些模块相依性的解决方案啰~ 对啦!那就是检查 /lib/modules/$(uname -r)/modules.dep 这个文件啦!
[root@study ~]# depmod [- - Ane]
选项与参数:
-A :不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入
/lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 参数时,则 depmod
会去搜寻比 modules.dep 内还要新的模块,如果真找到新模块,才会更新。
使用 lsmod 之后,系统会显示出目前已经存在于核心当中的模块,显示的内容包括有:
模块名称(Module);
模块的大小(size);
此模块是否被其他模块所使用 (Used by)。
模块其实真的有相依性喔!举上表为例,nf_conntrack 先被加载后,nf_conntrack_ftp 这个
模块才能够进一步的加载系统中!
这个 modinfo 除了可以『查阅在核心内的模块』之外,还可以检查『某个模块文件』,
好了,如果我想要自行手动加载模块,又该如何是好?有很多方法啦,最简单而且建议的,是使用 modprobe这个指令来加载模块,这是因为 modprobe 会主动的去搜寻 modules.dep 的内容,先克 服了模块的相依性后,再加载模块到核心之中。
[root@study ~]# modprobe vfat #加载,不需要完整路径名,因为modules.dep中有的。
# 很方便吧!不需要知道完整的模块文件名,这是因为该完整文件名已经记录到
# /lib/modules/`uname -r`/modules.dep 当中的缘故啊!如果要移除的话:
[root@study ~]# modprobe - - r vfat#在核心中删除模块。
核心就是一个文件。是有源码编译来的,放到内存中,然后才能运行操作系统。
其实核心就是系统上面的一个文件而已, 这个文件包含了驱动主机各项硬 件的侦测程序与驱动模块。
因为一部主机上面可以拥有多个核 心文件,只是开机的时候仅能选择一个来加载而已。
这个核心文件通常被放置成 /boot/vmlinuz-xxx
/lib/modules/$(uname -r)/kernel/放置核心源码。模块什么的也放在这里。
刚刚上面谈到的核心其实是一个文件,那么这个文件怎么来的?当然是透过原始码 (source code) 编 译而成的啊!因为核心是直接被读入到主存储器当中的,所以当然要将他编译成为系统可以认识的数 据才行!
一 般入门的使用者,基本上, 不太需要编译核心
重新编译核心的最主要目的是『想让系统变的更稳!』
/usr/src/kernels/下面是核心源码。和很多的模块。
make clean 仅会删除类似目标文件之类的编译过程产生的中间文件,而不会删除配置文件! 比如.o文件。
make mrproper 请注意,这个动作会将你以前进行过的核心功能选择文件也删除掉,
既然我们是第一次进行编译,因此,请下达『make mrproper』 吧!
如果你需要更加强大的核心功能则需要编译核心,如果你需要更加强大的模块功能,则重新编译模块。
.ko。模块后缀。
核心、核心模块。
/dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总物理内存的一半! 由于
是透过内存仿真出来的磁盘,因此你在这个目录底下建立任何数据文件时,访问速度是非常快速的!
/proc 这个挂载点,但是里面的东西都是0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』
的, 所以当然没有占任何的磁盘空间啰!
/pro 挂载在内存中,所以df -ah显示为0.
/dev/shm是内存虚拟出来的磁盘空间,通常是内存的一半,访问速度极快,
由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的
信息, 所以这个指令显示结果的速度非常的快速!
与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的文件数据,
df访问superblock达到列出整个文件系统的显示,du遍历整个文件系统 从而达到显示容量
磁盘busy 『离开该文件系统的挂载点』
第一栏:磁盘装置文件名/UUID/LABEL name:
这个字段可以填写的数据主要有三个项目:
文件系统或磁盘的装置文件名,如 /dev/vda2 等
文件系统的 UUID 名称,如 UUID=xxx
文件系统的 LABEL 名称,例如 LABEL=xxx
开机MOUNT注意Linux很可能将无法顺利开机完成!所以请务必要测试测试喔!
/etc/fstab 是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts这两个文件当中的。
你在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的/ 可是 read only 的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab 与/proc/mounts 都是记录信息,后者记录的是私有Namespace不然都在mtab中就混乱了。
cpu-静态随机存取内存(Static Random Access Memory )-动态随机存取内存(Dynamic Random Access Memory, DRAM)
BIOS(Basic Input Output System)是一套程序,这套程序是写死到主板上面的一个内存芯片中, 这个内存芯片在没有通电时也能够将数据记录下来,那就是只读存储器(Read OnlyMemory, ROM)。因为ROM不可更改,所以现在BIOS通常放在闪存或者EEPROM中。
BIOS 就是一个韧体, BIOS虽然对于我们日常操作计算机系统没有什么太大的关系,但是他却控制着开机时各项硬件参数的取得!所以我们会知道很多的硬件上头都会有 ROM 来写入韧体这个软件。
因此 BIOS 程序代码也可能需要作适度的修改才行,所以你才会在很多主板官网找到 BIOS 的更新程序啊!但是 BIOS 原本使用的是无法改写的 ROM ,因此根本无法修正 BIOS 程序代码!为此,现在的 BIOS 通常是写入类似闪存 (flash) 或 EEPROM (注 13) 中。
SATA与SAS型磁盘插口。
SSD就是拿闪存(ROM)做磁盘。
由于CMOS的记录要电,所以主板上才有电池。
CMOS记录机器的基本配置信息,里面有一个叫BIOS的程序,开机时,启动BIOS读取CMOS,然后调动开机程序启动机器。BIOS也可以修改CMOS里面的数据。
因为所谓的 Linux 版本指的应该是核心版本,centos6.3指的是distribution版本。
因为每个 Linux distributions 使用的 kernel 都是 http://www.kernel.org 所释出的
redhat以rpm来管理。有些distribution不以rpm来管理。
因为CentOS是抓RHEL的原始码来重新兜起来的一个Linux distribution,所以号称兼容于RHEL。
基础学好了,其他的部份大概找个keyword ,再 google 一下,一大堆数据就可以让你去分析判断了!
/dev/sda, /dev/sdb,/dev/sdc, 及 /dev/sdd 这四个文件
如果你插在SATA1和SATA5,但是根据 Linux 核心侦测到磁盘的顺序来标注sda.sdb。
以前磁盘状况:
磁盘(比如sda,vg1)第一个扇区 512bytes 会有这两个数据:
主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes
分区槽的最小单位『通常』为磁柱(cylinder),1-100磁柱为sda1。
为什么要分区?对安全和性能都有影响。
延伸分区的目的是使用额外的扇区来记录分区信息。(下面在p1和L1上有记录信息)
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
怎么装置文件名没有/dev/sda3 与/dev/sda4 呢?因为前面四个号码都是保留给 Primary 或Extended 用的嘛!
BIOS 会依据使用者的设定去取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的 MBR 位置。 MBR 这个仅有 446 bytes的硬盘容量里面会放置最基本的开机管理程序。这个开机管理程序的目的是在加载(load)核心文件。
由于开机管理程序是操作系统在安装的时候所提供的,所以他会认识硬盘内的文件系统格式,因此就能够读取核心文件, 然后接下来就是核心文件的工作,开机管理程序与 BIOS 也功成圆满,将之后的工作就交给大家所知道的操作系统啦!
1. BIOS:开机主动执行的韧体,会认识第一个可开机的装置;
2. MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;
3. 开机管理程序(boot loader):一支可读取核心文件来执行的软件;
4. 核心文件:开始操作系统的功能...
boot loader 的主要任务有底下这些项目:
提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!
载入核心文件:直接指向可开机的程序区段来开始操作系统;
转交其他 loader:将开机管理功能转交给其他 loader 负责。
开机管理程序除了可以安装在 MBR 之外, 还可以安装在每个分区槽(sda1,sda2)的启动扇区(boot sector)喔!
Windows 在安装的时候,他的安装程序会主动的覆盖掉 MBR 以及自己所在分区槽的启动扇区,你没有选择的机会, 而且他没有让我们自己选择选单的功能。--装两个系统要注意。
UEFI BIOS是以前BIOS的进阶。
USB:windows 概念下的挂载。
一个分区内有一个细节坏掉,那整个分区可能都会GG
标准分区与LVM同级别。
swap 是当物理内存容量不够用时,可以拿这个部份来存放内存中较少被使用的程序项目。是拿硬盘虚拟的内存。
MSDOS(MRT)---->GPT磁盘分区表。
『KDUMP』项目,这个项目主要在处理,当 Linux 系统因为核心问题导致的当机事件时, 会将该当机事件的内存内数据储存出来的一项特色!
如果你有需要的话,也可以启动它! 若不需要,也能够关闭它,对系统的影响似乎并不太大。--LINUX核心人员操作的。
p1p1, em1 等等比较特殊的网卡代号! 这是因为新的设计中,它是以网卡安插的插槽来作为网卡名称的由来。
目前的主流是BIOS+MRB
文本模式登入后所取得的程序被称为壳(Shell)---壳程序,各种各样的程序。
空格是很重要的特殊字符!隔开命令,选项和参数。
『第一个被输入的数据绝对是指令或者是可执行的文件』!
指令之后的选项除了前面带有减号『-』之外,某些特殊情况下,选项或参数前面也会带有正号『+』的情况!
选项/参数的补齐需要安装一个软件。
先按着[Ctrl]不放,且再按下 c 按键,是组合按键), 那就是中断目前程序的按键啦!
ctrl+d 相当于exit,结束文字接口输入。
重启系统执勤的操作:sync,将有些在内存中运行没有放到硬盘中的数据放到硬盘中,因为硬盘与内存间的交互很浪费时间,不可能时时写入。
以前 shutdown 后面一定得要加时间参数才行,如果没有加上的话,系统会跳到单人维护模式中
上面谈到的 halt, poweroff, reboot, shutdown 等等,其实都是呼叫这个 systemctl 指令的喔!
ssh是pts,实际终端是tty
当你对一个文件具有 w 权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的 rwx 来说, 主要都是针对『文件的内容』而言。
目录主要的内容在记录文件名列表,目录只是记录文件名和其详细信息而已。目录没有r就不能读取文件的详细信息,只能读取文件名。
对一般文件来说,rwx 主要是针对『文件的内容』来设计权限,对目录来说,rwx 则是针对『目录内的文件名列表』来设计权限。X就是进入目录的钥匙。
文件数据的mv只需要r就可以。
正规文件包括数据文件,二进制文件和可读文件。
具有『可执行的权限』以及『具有可执行的程序代码』是两回事!
FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。
root 在 Linux 里面的意义真的很多很多
/bin 放置的是在单人维护模式下还能够被操作的指令。 在/bin底下的指令可以被root与一般账号所使用
/boot这个目录主要在放置开机会使用到的文件
/dev在 Linux 系统上,任何装置与接口设备都是以文件的型态存在于这个目录当中的
/etc系统主要的配置文件几乎都放置在这个目录内
/lib 放置的则是在开机时会用到的函式库, 以及在/bin 或/sbin 底下的指令的呼叫的函式库而已
tty与pts。直接文字终端显示器接入是tty。其他基本上都是pts。
Login-shell与non-login-shell。前者需要完整的登录验证,比如说直接文字终端登录,xshell登录。后者是图形界面登录,su oracle。
Login shell的流程:/etc/profile及其衍生文件,~/.bash_profile及其衍生文件。
non-login-shell:只会读取~/.bash_profile的衍生文件。
su - 会去读取bash_profile及其衍生物。
185:grep,awk,sed的运作机制。
grep 以行为单位进行抓取分析。
awk: awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'
其中:BEGIN和END中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和扫尾。
1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
3. 做完所有的动作与条件类型;
4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
sed:以行为单位进行操作。
187.yum server提供 centosplus, cloud, extras, fasttrack, os, updates 等软件库
最重要的特色就是那个『 repodata 』的目录!该目录就是分析 RPM 软件后所产生的软件属性相依数据放置处!因此,当你要找软件库所在网址时, 最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是软件库的网址了!
1.需要访问外网才能访问阿里云等这些yum源网站。内网只能访问自己的yum源。
2.yum配置文件是/etc/yum.conf可进行多个属性配置。
3.访问设置为/etc/yum.d.repo/....
4.redhat yum 要钱。
[root@study ~]# yum [option] [ 查 询 工作 项 目 ] [ 相 关参数] ]
选项与参数:
[option]:主要的选项,包括有:
-y :当 yum 要等待用户输入时,这个选项可以自动提供 yes 的响应;
--installroot=/some/path :将该软件安装在 /some/path 而不使用默认路径
[查询工作项目] [相关参数]:这方面的参数有:
search :搜寻某个软件名称或者是描述 (description) 的重要关键字; 去yum server找。
list :列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa;
info :同上,不过有点类似 rpm -qai 的执行结果;
provides:从文件去搜寻软件!类似 rpm -qf 的功能!
[base]:代表软件库的名字!中括号一定要存在,里面的名称则可以随意取。但是不能有两个相同的软件库
名称, 否则 yum 会不晓得该到哪里去找软件库相关软件列表文件。
name:只是说明一下这个软件库的意义而已,重要性不高!
mirrorlist=:列出这个软件库可以使用的映射站台,如果不想使用,可以批注到这行;
baseurl=:这个最重要,因为后面接的就是软件库的实际网址! mirrorlist 是由 yum 程序自行去捉映像站
台, baseurl 则是指定固定的一个软件库网址!我们刚刚找到的网址放到这里来啦!
enable=1:就是让这个软件库被启动。如果不想启动可以使用 enable=0 喔!
gpgcheck=1:还记得 RPM 的数字签名吗?这就是指定是否需要查阅 RPM 文件内的数字签名!
gpgkey=:就是数字签名的公钥文件所在位置!使用默认值即可
y所有软件库数据都删除!
范例一:删除已下载过的所有软件库的相关数据 (含软件本身与列表)
[root@study ~]#yum clean all
#yum只修改URL不改名字会起冲突。
如果想要让 groupinstall 预设安装好所有的 optional 软件呢?那就得要修改配置文件!更改选groupinstall 选择的软件项目即可!如下所示:
[root@study ~]# vim /etc/yum.conf
.....(前面省略).....
distroverpkg=centos-release # 找到这一行,底下新增一行!
group_package_types=default, mandatory, optional
https://dl.fedoraproject.org/pub/epel/7/x86_64/#满足不足的软件仓库。
yum -- enablerepo=epel install netcdf R
188.直接输入 ifconfig 就会列出目前已经被启动的卡,而如果是输入 ifconfig eth0,则仅会秀出这张接口的相关数据,而不管该接口是否有启动。
2.2.5 MTU 最大传输单位:一般网络上所有机器默认1500.一个封包越大,拆解越小,带宽越高。
ifconfig命令后面接选项和参数能够直接修改网络配置。
ifconfig etum repolist all
[root@study ~]# yum clean [packages|headers|all]
选项与参数:
packages:将已下载的软件文件删除
headers :将下载的软件文件头删除#就是yum数据列表里的数据
all :将h0:0 192.168.50.50#一个网卡上设置多个IP,可以一个作为内网IP,一个作为外网IP。
[root@www ~]# /etc/init.d/network restart
# 刚刚设定的数据全部失效,会以 ifcfg-ethX 的设定为主!
如果是要直接以配置文件, 亦即是在 /etc/sysconfig/network-scripts 里面的 ifcfg-ethx 等档案的设定参数来启动的话, 那就得要透过 ifdown 或 ifup 来达成了。
# Flags :共有多个旗标可以来表示该网域或主机代表的意义:
# U:代表该路由可用;
# G:代表该网域需要经由 Gateway 来帮忙转递;
# H:代表该行路由为一部主机,而非一整个网域;
万一我们要传送的封包目的地 IP 不在路由规则里面,那么就会将封包传送到『default』所在的那个路由规则去,也就是 192.168.0.254 那个 Gateway 喔!因为在最后一行啊。
局域网内主机连接外网的方式:1.每台主机自己拨号管理,不好统一管理,适合家庭用户。2.专门设置一台IP分享器,便于管理,例如DCN。
linux服务器当做简单的硬件防火墙
dmesg | grep -in eth查询网卡信息,全双工所以来回500M!
/etc/init.d/network restart
这个 script 最重要!因为可以一口气重新启动整个网络的参数! 他会主动的去读取所有的网络配置文件,所以可以很快的恢复系统默认的参数值。
尽量不要用networkManager。
GATEWAY:代表的是『整个主机系统的 default gateway』, 所以,设定这个项目时,请特别留意!不要有重复设定的情况发生喔!也就是当你有 ifcfg-eth0, ifcfg-eth1.... 等多个档案,只要在其中一个档案设定 GATEWAY 即可
/etc/hosts中配置的hostname是dns解析用的
/etc/sysconfig/network是你的真正的hostname
主机服务很多需要HOSTNAME所以你再ping过hostName后必须重启
DHCP只需要在ifcfg-eh0中设置一小部分。
因为 ppp0 拨接成功后, ISP 会主动的给予 ppp0 接口一个可以连上 Internet 的 defaultgateway , 如果你又设定另一个 default gateway ,两个网关可能会造成你的
网络不通喔!
ip :复合式的指令:里面有route,ifconfig,ifdown,ifup几个命令结合。
如果以 ifconfig eth0 .... 来设定或者是修改了网络接口后, 那就无法再以ifdown eth0 的方式来关闭了!因为 ifdown 会分析比对目前的网络参数与ifcfg-eth0 是否相符,不符的话,就会放弃该次动作。因此,使用 ifconfig 修改完毕后,应该要以 ifconfig eth0 down 才能够关闭该接口喔
路由顺序:根据路由表从上到下。最后到默认路由。
[root@www ~]# route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0#网关不通的时候写dev
# 上面这个动作可以删除掉 169.254.0.0/16 这个网域!
# 请注意,在删除的时候,需要将路由表上面出现的信息都写入
# 包括 netmask , dev 等等参数喔!注意注意
linux网络侦错命令
linux网络代理文件。---TCP协议之类的文件形式
tcpdump文字接口,wireshark是图形接口。
静态路由与动态路由。
< 取代键盘输入。
现在的分区通常使用扇区为最小分区单位,磁盘分区完毕后还需要进行格式化(format),之后操作系统才能够使用这个文件系统。
这些技术可以将一个分区槽格式化为多个文件系统(例如 LVM),也能够将多个分区槽合成一个文件系统(LVM, RAID)!
较新的操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中。
每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。
挂载点一定是目录,该目录为进入该文件系统的入口。
1个磁盘可以对应多个分区,分区与文件系统可以是1对多,1对1,多对1,多对多。
硬链接与CP的区别。前者指向同一个inode,修改其中一个,另一个也会变。
硬链接与软连接:前者连到同一个inode与block,删掉一个,另一个继续指向。软连接只是新建一个Inode与block,然后指向原inode,原文件删掉就指向不了了。
目录不支持硬链接,因为如果目录下的所有文件都建立硬链接相当复杂。
硬链接与bind-mount的区别:
1.mount --bind连接的两个目录的inode号码并不一样,只是被挂载目录的block被屏蔽掉,inode被重定向到挂载目录的inode(被挂载目录的inode和block依然没变)
2.两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了
其实 + 代表最近被放到背景癿工作号码, - 代表最近最后第二个被放置到背景中癿工作号码。 而超过
最后第三个以后癿工作,就丌会有 +/- 符号存在了!
一般一个核心一个线程。
CPU 每次能够处理的数据量称为字组大小(word size),字组大小依据 CPU 的设计而有 32 位与 64 位。 我们
现在所称的计算机是 32 或 64 位主要是依据这个 CPU 解析的字组大小而来的!
关于 CPU 的频率部分:外频指的是 CPU 与外部组件进行数据传输时的速度,倍频则是 CPU 内部用来加速
工作效能的一个倍数, 两者相乘才是 CPU 的频率速度;
Unix 的前身是由贝尔实验室(Bell lab.)的 Ken Thompson 利用汇编语言写成的, 后来在 1971-1973 年间由
Dennis Ritchie 以 C 程序语言进行改写,才称为 Unix
linux与linux distribution.
redhat与centos 只有服务的区别。
centos与ubuntun的区别,软件,rpm,用的核心可能不一样,其他的标准什么的几乎都一样。
一般要求 swap 应该要是 1.5~2 倍的物理内存量,但即使没有 swap 依旧能够安装与运作 Linux 操作系统;
info page 可将一份说明文件拆成多个节点(node)显示,并具有类似超链接的功能,增加易读性
正则表达式是一个字符串的处理依据。find命令不支持正则表达式,所以只能用通配符。
linux中有许多特殊字符,这些特殊字符包括通配符。
正规表达式是通过特殊字符的辅助而形成的一种字符串处理依据。
find这些命令不支持正规表达式所以只能用特殊字符(其中有通配符)
sed支持正规表示法,功能更强大,所以就不用通配符了。
shell scripts是利用shell的功能缩写的一个程序,一个工具,sed,awk,grep这些都是一个程序和工具!
acl控制细分权限,比如规定某个人不能访问某个目录。
selinux也对权限做了规定,规定某些程序不能访问在其权限之外的目录。selinux就是增强安全型Linux的意思,最大程度限制linux服务进程的访问资源(最小权限原则)。当一个程序以root身份运行时,如果出现漏洞,黑客进入将能为所欲为,这个权限管理机制的主体是用户,而selinux权限管理机制的主体是进程,这样能够最大程度保障安全。
quota控制多用户每个用户的磁盘大小,防止某个用户过多使用。
为什么会出现LVM?将多个磁盘合在一起,然后再按照需要进行分区。
PE:LVM的基本单位。
PV:一个DISK一个PV标志。
VG:多个磁盘可以组合成一个VG。
LV:将VG分区后,每个分区槽就是一个LV。
RPM是经过编译的。
make和make install是gcc编译的进步,通过寻找本目录内的makefile文件,make生成目标文件,make install将目标文件安装到指定目录。
top里的cpu利用率不是代表真正的cpu利用率,期间包括了堵塞。
export与source都是仅在当前shell下生效。