首页 > 系统服务 > 详细

Linux语法笔记

时间:2020-04-20 20:29:04      阅读:392      评论:0      收藏:0      [点我收藏+]

目录

Linux基本架构

FHS文件系统:

/boot:???系统启动相关的文件,如内核和initrd(initramfs),以及grub(bootloader),应当成为一个基本分区
????????POST-->BIOS(HD)-->(MBR)bootloader-->内核
/dev: 设备文件所在目录,不能单独分区
????????块设备:随机访问
????????字符设备:线性访问(以一个字符一个字符进行访问的,比如键盘)
????????设备号:主设备号(major)和次设备号(minor)
????????在linux2.6版本之后,Linux开始使用udev机制,在内核识别到硬件后动态在/dev目录下创建一个设备文件(内核识别硬件依赖于驱动文件)
/etc: 配置文件所存放的地方
    /etc/fstab:记录着当前系统自动挂载的文件路径
    /etc/init.d:启动脚本位置
    /etc/sysconfig:初始化环境配置文件位置
    /etc/xinetd.conf:xinetd配置文件
    /etc/xinetd.d基于xinetd服务的启动脚本
/home:用户的家目录,每一个用户的家目录通常默认为同名目录,最好单独分区
/lib:库文件
????静态库()
????动态库()
/media:挂载点目录,移动设备,(软盘,光盘),但基本上被/run/media取代,Manjaro中已经没有此目录
/mnt: 挂载点目录,额外的临时文件,(U盘,移动硬盘)
/opt:可选目录 原本是第三方程序安装目录,是早期使用。现在已经几乎被/usr/local所替代,而变成了GUI程序的安装目录.而/usr/local变成第三方cli程序的目录
/proc:伪文件系统,内核映射文件(优化监控和调优的目录),不能单独分区,默认为空
????????/proc/partitions:查看当前系统已经识别分区(可以借助partprobe进行相应的刷新)
????????/proc/mdstat: 查看raid类型的设备状态
/sys:伪文件系统,跟硬件设备相关的属性映射文件,不能 单独分区,默认为空
/tmp: 临时文件
/var: 可变化的文件,应当单独分区,在创建时非常小,但是会随着运行而变大,动态数据保存位置,主要保存缓存,日志以及软件运行时产生的目录。。应当单独分区。
????/var/lib: 服务产生的数据放在这里
/bin: binary可执行文件,用户命令
/sbin:管理命令目录
/root可以没有,但是如果有的话,不应当单独分区
/misc(NFS服务共享目录),是系统推荐的目录,
/srv/服务数据目录,一些系统服务启动,可以在这个目录中保存所需要的数据。
/usr:universal shared read-only,可以单独分区,usr->Unix Software Resource.所以不是存放用户数据,而是存放系统软件资源的目录。系统中安装的软件大多数保存在这里。
????????/usr/bin
????????/usr/sbin
????????/usr/lib
/usr/local:????可以单独分区
????????/usr/local/bin
????????/usr/local/sbin
????????/usr/local/lib

Shell

站在用户登录的角度来说,SHELL的类型:

登录式shell(正常登录某终端登录):
su - USERNAME   
su -l USERNAME

非登陆式shell:  
1. su USERNAME
2. 图形终端下打开命令窗口
3. 自动执行的shell脚本

bash的配置文件

全局配置:  
/etc/profile, /etc/profile.d/*.sh, /etc/bashrc

个人配置:
~/.bash_profile,~/.bashrc

profile类的文件作用:  
设定环境变量
运行命令或者脚本

bashrc类的文件作用:  
设定本地变量
定义命令别名

登录式shell如何读取配置文件?

/etc/profile -->
/etc/profile.d/*.sh -->
~/.bash_profile-->
~/.bashrc-->
/etc/bashrc

非登陆式shell?

~/.bashrc --> /etc/bashrc -->/etc/profile.d/*.sh

基本信息获取

终端类型

console:控制台   
pty:物理终端(VGA)  
tty:虚拟控制台(VGA)  
ttyS:串行终端  
pts/#:伪终端  
使用tty命令可以查看当前的tty

登陆信息获取命令

w :show who is logged on and what they are doing  
who : show who is logged on(shell:su过去的并不是真正意义上的登陆命令)  
whoami : print effective userid  
last:显示/var/log/wtmp文件(此文件已经加密),显示用户登陆历史及系统重启历史
lastb:显示用户错误的登陆尝试
lastlog:显示每一个用户最近一次的成功登陆信息
basename:获取某文件的基名  
hostname:效于$HOSTNAME

随机数生成器:

/dev/random
/dev/urandom
random更安全但会阻塞,但是urandom并不会阻塞
$RANDOM 0-32768之间的一个随机数

虚拟机三种模式的介绍

bridged networking(桥接模式)

在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,配置好网关和DNS的地址后,以实现通过局域网的网关或路由器访问互联网。

network address translation(NAT模式)

使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统 接入互联网非常简单,只需要宿主机器能访问互联网,你不需要配置IP地址,子网掩码,网关,但是DNS地址还是要根据实际情况填的。添加DNS地址除了在网卡属性中填写,还可以在虚拟机中的“虚拟网络编辑器”中的NAT选项卡中点击“编辑”按钮中来添加。

Host-only(仅主机):

在Host-Only模式下,虚拟网络是一个全封闭的网络,它唯一能够访问的就是主机。其实Host-Only网络和NAT网络很相似,不同的地方就是Host-Only网络没有NAT服务,所以虚拟网络不能连接到Internet。主机和虚拟机之间的通信是通过VMware Network Adepter VMnet1虚拟网卡来实现的。主要用在安全测试。

CentOS的网络操作

CentOS7默认是无法查看本地ip的,当我们输入ip addr(取代旧版本的ipconfig),只能看到本机回环地址127.0.0.1,因此我们需要对使用:
ls /etc/sysconfig/network-scripts/  (查看本地网卡内容)
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 将onboot=no,修改为yes

然后wq,然后重启网络命令。
Centos6:service network restart
Centos7:systemctl restart network

可以使用ping命令测试: ping g.cn

virtualbox的NAT配置

如果非要使用virtualbox,则应优先选择桥接模,对于NAT模式,由于Virtualbox没有自动建立类似于vmware的映射机制所以我们需要配置。
virtualBox:  控制->设置->网络->NAT(高级)->端口转发->创造一条规则:如
>主机ip:127.0.0.1   
>主机端口:2222(也可以是任意没有被系统占用的端口)  
>子系统端口:22(22是SSH连接默认使用的端口,也可以设置为其它端口,设置后在客户主机中进行对应设置即可。)
[配置相关链接](https://blog.csdn.net/zero_295813128/article/details/51159805)  
设置完成后,NAT网络会通过设置的本地端口转发到虚拟机对应的端口。
`ssh -l root -p 2222 127.0.0.1`

CentOS7的防火墙机制处理

CentOS7自带防火墙
可以通过`firewall-cmd --state`查看  
启动命令:
`systemctl stop/start/stop firewalld.service`  

加密方法

对称加密:加密和解密使用同一个密码
公钥加密:每个密码都成双儿出现,一个为私钥(secret key),一个为公钥(public key)
单向加密,散列加密:用来提取数据特征码,只能由数据明文取得其密文,而不能由密文得到其明文,常常用来数据完整性校验。它有着如下的特征:

2.1.雪崩效应   
2.定长输出  
**MD5**:Message Digeat,128位定长输出  
**SHA1**:Secure Hash Algorithm,160位定长输出  
**SHA256**(256位)等等。  

SSH命令

ssh

    ssh USERNAME@HOST
    ssh -l USERNAME HOSt
    ssh USERNAME@HOST "COMMAND"

ssh-keygen

 -t rsa
    ~/.ssh/id_rsa
    ~/.ssh/id_rsa.pub
        将公钥保存到远程主机某用户的家目录下的.ssh/authorized_keys文件.ssh/authorized_keys2
        (.ssh如果有则已,没有的话则创建,并且权限要设定为700)
-f /PATH/TO/KEY_FILE_NAME
-p ‘‘:指定加密私钥的密码

ssh-copy-id

-i ~/.ssh/id_rsa.pub
    专门实现将公钥传输到对方远程主机下的工具
    ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@HOST     

vim编辑器

文本编辑器,字处理器.

vim打开

vim +#:打开文件,并定位于第#行  
vim +:打开文件,定位到最后一行  
vim +/pattern:打开文件,定位到第一次被Pattern匹配到的行的行首

vim模式:

编辑模式-->输入模式

i :在当前光标所在字符的前面,转为输入模式
a :在当前光标所在字符的后面,输入为输入模式
o :在当前光标所在行的下方,新建一行,并转化为输入模式
I :在当前光标所在行的行首,转换为输入模式
A :在当前光标所在行的行尾,转换为输入模式
O :在当前光标所在行的上一行,转换为输入模式

输入模式-->编辑模式

ESC一键直达
末行模式(只能由编辑模式进入末行模式)
    :一键直达
末行模式-->编辑模式
    ESC。可能需要使用多次esc

关闭文件

1.在末行模式下关闭文件

:q  退出
:w  保存
:wq 保存并退出
:q! 不保存退出
:w! 强行保存(管理员保存)
:wq-->x 是一个意思

2.在编辑模式下保存并退出

ZZ(大写的ZZ)

移动光标

h:左 l:右 j:下 k:上(或者箭头)
#h,移动#个字符
w:移动到下一个单词的词首
e:移动到当前或下一个单词的词尾
b:移动到当前或前一个单词的词首
#w也可以这样的使用

行内跳转

0:绝对行首
^: 行首的第一个非空白字符
$:绝对行尾

行间跳转

#G:跳转到第#行
G:跳转到最后一行
末行模式下,直接给出行号即可

翻屏操作

Ctrl+f:向下
Ctrl+b:向上翻一屏
Ctrl+d:向下翻半屏
Ctrl+u:向上翻半屏

编辑命令

删除命令:x,d

x:删除光标所在处单个字符  #x删除光标所在处及向后的共#个字符
d(专用删除命令):这个命令需要和其它命令一起使用才能有效果
#d跳转命令组合使用
#dw,#de,#db
dd删除当前光标所在行
#dd:删除包括当前光标所在行在内的行

末行模式下:
    startadd,endaDDd    删除从开始行到结束
    .:表示当前行
    $:最后一行
    +#:向下的#行

粘贴命令:p

p:如果删除或复制为整行内容,则粘贴到光标所在行的下方,如果复制或删除的内容为非整行后面,
P:如果删除或复制为整行内容,则粘贴到光标所在行的上方.如果复制或删除的内容为非整行前面,

复制命令:y

用法同d命令
先删除内容,再转换为输入模式
c:修改命令,用法同d命令

替换命令:r

只能用于替换单个字符
R:切换到替换模式

撤销编辑:u(undo)

撤销前一次的编辑操作
连续操作可以取消N次,但是vim往往只保留最近50次的操作
#u:直接撤销最近#次编辑
Ctrl+r:还原最近一次的撤销操作

重复前一次的编辑操作

.

可视化模式

v:按字符选取
V:按矩形选取

查找

/pattern 从光标所在处往最后
?pattern 从光标所在处往前
n 向后一个跳转
N 向前一个跳转

查找并替换:s

在末行模式下使用
s/// g/i类似于sed
ADDR1,ADDR2s@@@gi
1,$
%全文替换

使用vim编辑多个文件

vim FILES1 FILES2
:next 切换到下一个文件
:prev 切换到前一个文件
:last 切换到最后一个文件
:first 切换到第一个文件
退出
:qa 全部退出
如何分屏显示一个文件
    ctrl+w,s:水平拆分窗口
    ctrl+w,v:垂直拆分窗口
    在窗口间切换光标
        ctrl+w,ARROW
        :qa 退出所有窗口
    分窗口编辑多个文件
        vim -o :水平分割显示    
        vim  -O: 垂直分割显示
    将当前文件中部分内容另外为另外一个文件
        末行模式下使用w命令
            :w  如: :ADDR1,ADDR2w /path to way
    将另外一个文件的内容填充在当前文件中
            :r /path to way
    在vim中与shell交互
        :! COMMAND

高级话题

1.显示或取消行号
    :set nu
    :set nonu
2.显示忽略或区分字符大小写
    :set ignorencase
    :set ic
    :set noignorencase
3.设定自动缩进
    :set indent
    :set autoindent(ai)noai
4.查找到的文本高亮显示或取消
    :set hlsearch
    :set nohlsearch
5.语法高亮
    :syntax on
    :syntax off

配置文件

全局
/etc/vimrc 对于Ubuntu /etc/vim/vimrc
局部
~/.vimrc

可以使用vimtutor使用参考课程

vim非法退出所形成的问题

E325错误,常见于vim在使用时没有适当退出(比如在编辑的时候强行退出之类的非法退出),导致窗口虽然退出但是vim进程仍然在shell中,这个时候会在同名目录上有一个名为xxx.swp的同名非后缀文件。这个时候的一个解决方案是rm 掉这个文件即可。如果需要保存恢复,我们可以使用vim -r xxx,然后再rm掉这个swp文件

CentOS软件包管理

/etc,/bin,/sbin,/lib(仅仅启动所用到的)

系统启动就需要用到的程序,这些目录不能挂载额外的外区,必须在根文件系统的分区上
/usr/ OS核心功能,可以单独分区
	bin,sbin,lib
/usr/local 第三方软件安装所用到的
	bin
	sbin
	lib
	etc
	man

rpm语法

0. 数据库
	/var/lib/rpm,/var/lib/pacman等 ????????
1.安装
????????rpm
????????????-i /PATH/TO/PACKAGE_NAME
????????????-h:以#显示进度,每个#表示%
????????????-v:显示详细
????????????-vv:更详细的显示
????????????-ivh:通常一起使用
????????????--nodeps:忽略依赖关系,(可以实现安装,但是导致安装后也无法运行)
????????????--replacepkgs:重新安装,替换原有安装
????????????--force:强行安装,可以实现重装或者降级
????????????--oldpackage::降级式安装
2.查询
????????rpm
????????????-q PACKAGE_NAME
????????????-qa:查询所有已经安装的所有包(用来解决通配符的问题)
????????????-qi:查询指定包的说明信息
????????????-ql:查询指定包安装生成的文件列表
????????????-qf /path/to/file:查询指定的文件是由哪个rpm包安装生成的(反向查询)
????????????-qc:查询指定包安装的配置文件
????????????-qd: document???
????????????-q --script PACKAGE_NAME:查询指定包中的脚本
????????????如果某rpm包尚未安装,我们需查询其说明信息,安装以后会生成的文件
????????????????rpm -qpi /PATH/TO/PACKAGE_NAME
????????????????????????-qpL
3.升级
????????rpm
????????????-Uvh /PATH/TO/NEW_PACKAGE:如果有老版本的则升级,否则安装(安装加升级)
????????????-Fvh /PATH/TO/NEW_PACKAGE:如果有老版本的,则升级,否则退出(纯升级)
???????--oldpackage::降级式安装
4.卸载
????rpm
??????-e(erase) PACKAGE_NAME
????????--nodeps去除掉被别人依赖这种情况
5.检验
????rpm
????????-V PACKAGE_NAME 校验已经安装包的完整性
6.重建数据库(/var/lib/rpm)
????rpm
????????--rebuilddb:重建数据库,一定会重新建立
????????--initdb:初始化数据库 ,没有才建立,有就不用建立
7.检验来源合法性,及软件完整性
8.加密类型????
    对称:加密解密使用同一个密钥
    公钥:一对儿密钥,公钥,私钥,公钥可以从私钥中提取出来,并公开出去
    单向:毁灭性破解
	RedHat公司已经提供了公钥,使得我们可以借助它去判断完整性。它的公钥		在/etc/pki/rpm-gpg目录下,当然它只能用来检验红帽公司开发的包
????如:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat 导入redhat公钥包
????rpm -K 包名
????dsa,gpg:验证来源合法性,也即验证签名,可以使用--nmosignature略过此项
????sha1,md5:验证软件包完整性,可以使用--nodigest略过此项
9.rpmbuild:
????????安装,查询,卸载,升级,校验,数据库的重建,数据包的验证等工作
10.rpm命名规则:
	包组成部分
????????????主包:
????????????????bind-9.7.1.1.i586.el5.rpm
????????????子包:
????????????????bind-libs-9.7.1.1.i586.el5.rpm
?????????	 bind-utlis-9.7.1.1.i586.el5.rpm
	命名格式
?????????	name-version-release.arch.rpm
?????????	如:bind-major.minor.release-release.arch.rpm
  主版本号:重大改进
????次版本号:某个子功能发生重大变化
????发行号:修正了部分bug,调整了一点功能
????rpm包:二进制格式,源码格式

yum语法

1. 使用C/S架构
2. yum repository
????文件服务类型:ftp,web,file
????Client:配置文件(rpm包的仓库):
????????primary.xml.gz
????????????????所有RPM包的列表
????????????????依赖关系
????????????????每个RPM安装生成的文件列表
????????filelists.xml.gz
????????????????当前仓库中所有RPM包的所有文件列表
????????other.xml.gz
????????????????额外信息,RPM包的修改日志
????????repomd.xml
????????????????记录的的是上面 三个文件的时间戳和校验和
????????comps*.xml
????????????????RPM包分组信息
3.怎样为yum定义repo文件??
[Repo_name]
name-Description
baseurl=ftp://,http://,file://
enabled={1|0}
gpgcheck={1|0}
gpgkey=

4. yum语法
????list:列表(支持glob)
????????all:
????????availalbe
????????installed
????????updates:可用的升级
????clean:清理缓存
????????packages
????????headers
????????metadata
????????dbcache
????????all?????
????repolistj显示repo列表以及简要信息
????????all
????????enabled
????????disabled
????install:安装
????????yum install PACKAGE_NAME,可以使用yum list all *keyword*,
????????????????这个功能在zsh中被屏蔽了,但是bash中可以正常使用
????????????????-y:自动回答为yes
????????????????--nogpgcheck
        update:升级
        update_to:升级为指定版本
        remove|erase:卸载??
        info:类似于rpm -qi查看已安装包的信息
        provides | whatprovidess:查看指定的文件或
        group{install|info。。。以组的形式进行处理????
        yum localinstall 本地包(localinstall可以处理依赖关系)
5.如何创建yum仓库
????createrepo

RPM包安装过程:

二进制格式:

源程序-->编译-->二进制格式
有些特性是编译选定的,如果编译未选定此特性,将无法使用
RPM包的版本会落后于源码包

定制:手动编译安装

1. 编译安装的三步骤(前提:准备开发环境Development Tools和Development Library)
./configure
	--help(打开默认参考文档)
    --prefix=/path/to/somewhere(不加默认安装到/usr/local的相对应目录)
    --sysconfdir=/path/to/configure_path
    --conf-path=PATH(具体是否支持看--help里面有无此项,即官方是否支持)
????????????????????功能:1.让用户选定编译特性??2.检查编译环境
?make
?make install

2.修改PATH环境变量,以能够识别此程序的二进制程序
?????????使用源码包安装的脚本通常是不能直接运行的,它就类似于我们写的脚本,要么使用./name.sh,要么将它加入到全局变量中去。加入到全局变量中去
???????第一: 修改/etc/profile,然后使用source /etc/profile
???????第二: 创建一个软链接,将其加入到系统环境变量中去(不推荐,因为这意味着
????????????如果软件提供多个binary,我们就需要一个一个添加)
???????第三: 在/etc/profile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/binary(这是为了避免对系统文件进行干扰定义)
3.库文件,默认情况下,系统搜索库文件的路径/lib,,/usr/lib;要增添额外搜寻路径;
???????????2.1在/etc/ld.so.conf.d/中创建以conf为后缀名的文件,而后把要增添的路径
????????????????????直接写到此文件中
???????????2.2#ldconfig 通知系统重新搜寻库文件
????????????????????-v:显示重新搜寻库的过程
4.头文件:输出给系统 (默认: /usr/include)
????????????????????增添头文件搜寻路径,使用链接进行
?????????????????????ln -s /usr/local/tengine/include/??/usr/include
?????????????????????ln -s /usr/local/tengine/include/*??/usr/include或
???????????ln -s /usr/local/tengine/include??/usr/include/tengine
5.man文件路径:默认安装在--prefix指定的目录下的man目录,但是系统默认????????????????????????在/usr/share/man等目录下
????????????1.man -M /PATH/TO/MAN_DIR command
????????????2.在/etc/man.db.config中添加一条manpath

自启动

vim /etc/rc.d/rc.local
加入/usr/localapache2/bin/apache start

源码安装详细过程:

当执行make时,make会在当前的目录下搜寻makefile(Makefile),而makefile里则记录了原始码如何编译的详细信息同时,make会自动的判别原始码是否经过变动了,而自动更新执行档。而makefile的形成依赖于configure/config
????????是否有适合的编译程序可以编译本软件的程序代码
????????是否已经存在本软件所需要的函数库,或其他需要的软件
????????操作系统平台是否适合本软件
????????核心的(header include)是否存在
xx.tar.gz
????源代码文件
????configure/config
????INSTALL/README
g++
	-O 产生优化的级别(一般加上2就行)
    -Wall Enable most warning messages
make (将原始码进行编译)
make install(将编译完成的all安装到正确的路径中去)
make uninstall(卸载此默认安装的文件)
make clean(将生成目标文件清除)
make dist打包成文档(生成tar.gz)以供发布。

如果我们在安装时使用了./configure --prefix=/usr/local/packages_name中,我们最好将man page写入到/etc/man_db.conf

软件相关安装注意

????????/etc/httpd
????????/usr/lib
????????/usr/bin
????????/usr/share/man
????如果我们使用默认的安装路径/usr/local,那么我们安装的tarball相关数据会放在:
????????/usr/local/etc
????????/usr/local/bin
????????/usr/local/bin
????????/usr/local/man
????????但如果每个软件都选择默认路径下安装的话,那么所有的软件的文件都会放置在这四个目录当中,因此,如果未来想要升级或者移除时,就会比较难以追查文件来源!如果在安装的时候是单独的目录,如/usr/local/apache中,则文件目录变成:
????????????/usr/local/apache/etc
????????????/usr/local/apache/bin
????????????/usr/local/apache/lib
????????????/usr/local/apache/man
删除时只要将此目录删除即可认为该软件被删除如:rm -rf /usr/local/apache
当时删除简单的代价就是不那么容易被直接使用,事实上指令的直接使用依赖于$PATH,而这个/usr/local/apache/bin肯定是不在path里面的,所以执行时就必须使用绝对路径,否则就需要将这个bin加入到PATH里面。另外,那个man也需要加入man page搜寻路径中。
????????????????1.最好将tarball解压缩到/usr/local/src当中
????????????????2.安装时,最好安装到/usr/local这个默认路径下
????????????????3.考虑到未来的反安装步骤,最好可以将每个软件单独的安装在/usr/local底下
????????????????????在/etc/profile这个文件定义了相关的二进制风格,我们最好将这个bin以脚本的形式加入到
????????????????????????/etc/profile.d 下,
????????????????????????????export PATH=$PATH:/usr/local/apache/bin/httpd1
????????????????????????????然后刷新此目录
????????????????4.为安装到单独目录的软件之man page加入 man path搜寻
????????????????????/etc/man_db.conf(40-50)
????????????????????setup Path to MANPATH mapping
????????????????????it shows what man tree holds pages for what binary directory
????????????????????MANPATH_MAP /usr/local/software/bin /usr/local/software/man
????????????????5.自启
????????????????????/etc/rc.d/rc.local中加入 /usr/local/apache/bin/apache start
????????????????????或者在systemd中编写相关的服务,然后让系统以统一的方式systemctl enable xxx
例子:
????????????????cd /usr/local/src
????????????????tar xf /root/ntp-1.tar.gz(z-gzip,j-bz2,J-xz)
????????????????tar xf ntp-1.tar.gz -C /usr/local/src
????????????????mkdir /usr/local/ntp-1
????????????????cd ntp-1
????????????????vim INSTALL
????????????????????./configure --help | more
????????????????????????--prefix=PREFIX
????????????????????????--enable-all-clocks
????????????????????????--enable-parse-clocks
????????????????make clean
????????????????make
????????????????make check
????????????????make install
????????????????diff+patch避免对整个源码的重新编译(而仅仅作出升级处理)

正则表达式

系统设定

默认输出设备:标准输出STDOUT,1
默认输入设备:标准输入STDIN,0
标准错误输出:STDERR,2
标准输入:键盘
标准输出和错误输出:显示器

Linux的I/O重定向

输出重定向(输出到一个文件夹):
????????>:覆盖输出
????????>>:追加输出
????????2>:重定向错误输出
????????2>>:重定向追加错误输出
????????如果想要同时重定向正确的和错误的,那么我们可以使用
????????????ls /var > /tmp/var4.out 2> /tmp/var4.out
????????????ls /varr > /tmp/var4.out 2> /tmp/var4.out
????????????ls /varr &> /tmp/var5.out(同时具有两个效果)
输入重定向:
?????????<:将某文件信息显示出来
?????????<<:在此处生成文档(heredoc),如cat >> /tmp/myfile.txt << EOF
set -C(禁止对已经存在的文件使用覆盖重定向,强制覆盖输出,则使用>|)
????????+C(关闭上述功能)

正则表达式

.?:匹配任意单个字符
[]??: 匹配指定范围内的任意字符
[^]??: 匹配指定范围外的任意字符

匹配次数:
????????*??: 匹配其前面的字符任意次
????????.* :任意长度的任意字符(贪婪模式)
????????\? :匹配其前面的字符一次或者0次
????????\{m,n\}:匹配其前面的字符至少m次,至多n次
????????位置锚定:
?????????????????^???:????锚定行首,
?????????????????$???:锚定行尾
?????????^$ : 空白行
??????????????????\<或\b:其后面的任意字符串必须作为单词首部出现,锚定词首
?????????????????\>或\b:其前面的任意字符必须作为单词的尾部出现,锚定词尾
????????分组:
?????????????????\(\) :如 \(ab\)*,任意个ab
????????后向引用:
????????????????\1: 引用第一个左括号以及与之对应的右括号所包括的所有的内容,如:grep ‘\([0-9]\).*\1$‘
????????扩展正则表达式:grep -E = egrep
????????????????字符匹配:.???[]????[^]
????????????????次数匹配:???*????????????????+(匹配其前面的字符至少一次)???????{m,n}:不需要使用反斜线
????????????????位置锚定:^???$?????\<??????????????????????????????????\>
????????????????分组:()???\1,\2,\3????
????????????????或者:| ,如:ip:??\<[1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3]\>

文本处理三剑客(grep,sed,awk)

grep,egrep,fgrep(不支持正则表达式)

grep:根据模式,搜索文本(只能搜索文件而不能搜索目录),并将符合模式的文本行显示出来
    -i(忽略大小写) 、
    --color
    -v:显示没有被模式匹配的行
    -o:只显示被模式匹配的串
    -A(after)
    -B(before)
    -C(context)
    -E(使用扩展正则表达式,相对于egrep,好处是不需要反向字符)

sed(流编辑器):stream editer (编辑器又分为:行编辑器,全屏编辑器)

sed:模式空间
默认不编辑源文件,仅对模式空间中的数据作处理,处理结束后,将模式空间打印到屏幕
????sed [option] ‘AddressCommand‘ file
????????-n 静默模式(不显示模式空间中的内容,不再默认显示模式空间中的内容)
????????-i:直接修改原文件
????????-e SCRIPT -e SCRIPT:可以同时执行多个脚本
????????-f /PATH/TO/FILE file
????????-r :使用扩展正则表达式
????Address:
?????????1.StartLine,Endline 比如 1,100
????????????$:最后一行
????????????$-1:倒数第二行
?????????2./RegExp/ /^root/
?????????3. /pattern1/,/pattern2/第一次被模式1匹配到的行开始至第一次被模式2匹配到的行结束
?????????4.LinueNumber 指定的行
?????????5.StartLine,+N 从指定行开始,向后的N行
????Command:
????????d:删除符合条件的行;
????????p:显示符合条件的行;
????????a \"string":在指定的行后面追加新行,内容为"string"
????????i \string: 在指定的行前面添加新行,内容为string
????????r FILE:将指定文件的内容添加到符合条件的行处
????????w FILE:将地址指定范围内的内容另存到指定的文件中
????????s /pattern/string/修饰符位置 :查找并替换.默认只替换每行中第一次被模式匹配到的字符
????????????加修饰符?????g:全局替换?????i:查找时忽略字符大小写
????????????s///,s###,s@@@(可以避免转义字符)
????????????&相当于模式匹配串,用来替代pattern所得到的值

awk+printf

printf
	%ns
	%ni
	%N.nf
awk 是一个非常棒的数据处理工具!相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理.因此,awk相当的适合处理小型的数据处理
awk ‘条件类型1{动作1} 条件类型2{动作2}‘ filename (默认字段分隔符为空格或者TAB)
读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中;
依据 "条件类型" 的限制,判断是否需要进行后面的 "动作";
做完所有的动作与条件类型;
若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。
NF 每一行($0)拥有的字段总数
NR 目前awk所处理的是第几行数据
FS 目前的分隔字符,默认是空格键			
awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』
间隔, 或者直接以 [Enter] 按键来隔开每个指令,例如上面的范例中,鸟哥共按了三次 [enter] 喔!
逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』!
格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行!
与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

shell编程

(类似于python的哲学思想,不需要加;来判断结束,但是有些语法使用的情况下必须要加)

变量类型及程序返回参数解释

?????引用变量:${VARNAME} ,绝大多数情况下大括号可以省略,在printf引用时不能省略。
?????本地变量:VARNAME=VALUE(整个bash进程均可以使用)
?????局部变量: local VARNAME=VALUE (作用域为当前代码段)
?????环境变量: export VARNAME=VALUE,有时候也称导出变量(作用域为当前shell进程及其子进程)
?????特殊变量:($?:上一个命令的执行状态返回值;$#:参数的个数;$*:参数列表;$@:参数列表;
???????????????$0:执行脚本时的脚本路径基名称)
?????位置变量:$1,$2,$3,...... ,shift
?????撤销变量:unset VARNAME
?????查看变量:1.set查看当前shell中的所有变量??
????????????  	      2.查看当前shell中的环境变量 printenv,env,export
????????????  	      
程序执行有两类返回值:
?????????1.程序执行结果
?????????2.程序状态返回代码(0-255 || 0:正确执行,1-255:错误执行,1,2,127系统预留)
????????????????(幸福的家庭都是相似的,不幸的家庭却各有各的不幸)
????????3.脚本在执行时会自动启动一个子shell进程,
????????????????命令行中启动的脚本会继承当前shell环境变量
????????????????系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
????????????????脚本 :命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序。由于Linux内核只能识别并直接执行ELF格式(可以通过file /bin),因此我们需用引入一个叫做shebang的东西。shebang有特殊的格式,如"#!/bin/bash",shebang必须要写在第一行。而且只有第一行的#被当作shebang,其它的行中的#都会被当作注释。

类型测试

整数测试:bash不支持浮点数的运算,只能使用基于整数的测试
????-eq:测试两个整数是否相等:比如 $A -eq $B
????????-ne:测试两个整数是否不等:不等为真,等为假
????????-gt:大于
????????-lt:小于
????????-ge:大于等于
????????-le:小于等于
????shell中的算术运算
????????1.let 算术运算表达式
????????2. $[算术运算表达式] C=[$A+$B]
????????3. $(($A+$B))
????????4. expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用????
????let 实现从字符串到整型字符的计算????
????seq 生成序列
????declare -i SUM=0将变量生成了整数
????????-s 将一个变量声明为环境变量
????测试方法:
????????[ expression ]????[ $INT1 -eq $INT2 ]????
????????[[ expression ]]??[[ $INT1 -eq $INT2 ]]
????????test expression test $INT1 -eq $INT2
文件测试
????????-e FILE:测试文件是否存在
????????-f FILE:测试文件是否为普通文件
????????-d FILE:测试指定路径是否为目录
????????-r FILE:测试当前用户对指定文件是否有读取权限
????????-w
????????-x
????????测试方法:
????????????[ -e /etc/inittab ]
????????????[ -x /etc/rc.d/rc.sysinit ]
字符测试:
????????== "用来等值比较"
????????!= "用来测试不等"
????????>
????????<
????????-n string:测试指定字符串是否为空
????????-z string:测试字符串是否不空
组合测试条件:
????????-a : 与关系
????????-o:??或关系
????????!:非关系
语法测试:
????????bash -n 脚本名:测试脚本语法错误
????????bash -x 脚本名:单步执行脚本
exit:退出脚本
????如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码????????

条件判断

单分支的if语句
?????if 判断条件; then
???????statement1
???????statement2
?????fi
??双分支的if语句
????if 判断条件;then
????????statement1
????????statement2
????else
????????statement3
????????statement4
????????...
????fi
??多分支的if语句:
????if 判断条件1;then
????????statement1
????elif 判断条件2;then
????????statement2
????else
????????statement3
????fi
for循环
????for 变量 in 列表;do
????????循环体
????done
while循环:适用于循环次数未知的场景
语法:
????while CONDITION;do
????????statement
????????........
????done
??echo -e "\033[5;32mHello\033[0m,world."??基于echo的一个扩展,实现颜色变化??

until这个循环机制和while刚好相反
until CONDITION;do
????statement
????............
done
for循环的另外用法,相当于C语言中的用法
while循环:适用于循环次数未知的场景
语法:
????while CONDITION;do
????????statement
????????........
????done
??echo -e "\033[5;32mHello\033[0m,world."??基于echo的一个扩展,实现颜色变化??

until这个循环机制和while刚好相反
until CONDITION;do
????statement
????............
done
for循环的另外用法,相当于C语言中的用法

定义函数
function FUNCNAME{
????command
}
FUNCNAME(){
????command
}

字符串测试:

=~ 左侧字符串能否被右侧的模式匹配
-Z "STRING":判断指定的子串是否为空
-n "STRING":判断指定的字符串是否不空
1.字符串要加引号 2.尽可能使用[[]]

文件测试:

文件是否存在:
    -a FILE
    -e FILE
类型测试:
    -b FILE:是否存在且为块设备
    -c FILE:是否存在且为字符设备
    -d FILE:是否存在且为目录设备
    -f FILE:是否存在且普通设备
    -h FILE/-L FILE:是否存在且为符号链接设备
    -p FILE:是否存在且管道设备
    -S FILE:是否存在且套接字设备
权限测试:
    -r FILE:是否存在并且对当前用户可读
    -w FILE: 是否存在并且对当前用户可写
    -x FILE: 是否存在并且对当前用户可执行
特殊权限测试:
    -u FILE: 是否存在并且拥有suid
    -g FILE: 是否存在并且拥有sgid
    -k FILE: 是否存在并且拥有sticky
文件是否有内容:
	-s FILE:是否有内容
时间戳:
	-N FILE:文件自上次读操作后是否被修改过
从属关系测试:
    -O FILE:是否属主
    -G FILE:是否属组
双目测试:
    FILE1 -ef FILE2:是否为指向同一个inode的硬链接
    -nt      :FILE1是否新于FILE2
    -ot      :FILE1是否旧于FILE2

linux文件的用户权限

文件权限及类型

1.文件类型、权限、硬链接数、所属用户、所属用户组、文件大小、最后修改时间、文件名
????文件被硬连接的次数
????文件的属主(owner)
????文件的属组(group)
????文件的大小
????时间戳:时间戳有三个,但是这里只显示最近一次被修改的时间即m。
????????访问:access
????????修改: modify??文件内容发生了变化
????????改变: change(metadata)
2.???r=读取属性(值=4)????w=写入属性(值=2)????x=执行属性(值=1)
3.???总共有七种类型的文件
????????-:普通文件
????????d:文件夹
????????l:链接(类似Windows的快捷方式,但是分硬链接和软链接)
????????????当不同路径下的文件指向同样一个inode,被称为硬链接(文件大小是一样的),
????????????1.事实上,硬链接在删除时,只要其硬链接次数大于等于2,其inode号就会被保存起来,直到其inode号小于1时,其inode号所代表的数据块,才会被真正清除掉。
????????????2.只能对文件进行硬链接。而不允许对目录进行硬链接。事实上Linux下所有的目录硬链接数都默认为2,一个是filename,另外一个是.代表着此文件
????????????3.创建硬链接会增加文件被链接的次数
????????????4.不能跨文件系统
????????????当一个文件路径的文件指向地是另外一个文件的路径,称为软链接(文件大小所占有的字节数是所指向的路径所占有的字节数,其权限一般都是777)
????????????1.可应用于目录
????????????2.可以跨文件系统
????????????3.不会增加被链接文件的链接次数
????????????4.其大小为指定的路径所包含的字母个数
????????b:块设备文件(例如硬盘、光驱等)
????????????按块为单位,随机访问的设备
????????c:字符设备文件(例如键盘等串口设备)
????????????按字符为单位,线性设备
????????????b,c都是设备,它们在/dev下被显示出来,当我们使用ls -l /dev时,我们可以得到两个设备号
????????????????主设备号(major number):???用来标识设备类型
????????????????次设备号??(minor number)??:用来标识同一种类型下的不同设备
????????????????其创建命令使用mknod:
????????????????????mknod:?????-make??block or charcter special files
????????????????????mknod [OPTION]... NAME TYPE [MAJOR MINOR]
????????????????-m MODE
?????????重要以及特殊设备文件标识:
????????????/dev/cdrom,/dev/dvd,/dev/cdrw :默认光驱设备
????????????/dev/null 数据黑洞
????????????/dev/zero 数据泡泡
????p:管道文件
????????管道:将前一个命令的输出,作为后一个命令的输入
????????命令1 | 命令2 | 命令3
????????s:套接口文件/数据接口文件(例如启动一个MySql服务器时会产生一个mysql.sock文件)
4.修改方式
????????chmod 用户+(-)权限 文件名
????????chmod o+r test.txt???或??chmod 权限 文件名
????????如:chmod 775 test.txt

压缩与打包

1. 压缩和打包的区别:打包是将一些文件或目录变成一个总的文件,而压缩则是将一个大的文件通过压缩算法变成一个小的文件。
2. gzip/gunzip应该是最基本的压缩(解压缩)的工具,bzip2更多用于备份,它们的区别更多在于压缩比和压缩速度上。如果想要针对目录,则我们可以使用tar进行相应的目录打包处理。在tar完之后,我们还可以借助gzip对这个统一目录进行压缩处理,从而得到tar.gz这个后缀。事实上这个后缀就是大名鼎鼎的互联网最常用目录。
3.	压缩格式:gz,,bz2,xz,zip,Z(压缩算法不同,所得到的压缩比也会不同)
    gzip:压缩之后为.gz
    gzip /path/to/file
        -d: 相当于解压缩
        -#: 1-9,指定压缩比,默认为6
          -k:
    gunzip:解压缩
    zcat:临时查看已经压缩后的文件
    bzip2: 压缩之后为.bz2
            比gzip有着更大压缩比的压缩工具(对于大文件来说有着明显优势,
            但是对于小文件来说gzip要更好一些)使用格式和gzip近似。
                    -d:解压
                    -k:在压缩后保留原文件
            bunzip2
            bzcat:临时查看已经压缩后的文件

    xz: 压缩之后为.xz(默认条件下并没有集成在linux系统中,需要手动安装),应该是目前对大文件压缩比最大的压缩工具,但是相对而言速度慢一些。
            unxz
            xzcat
        1.默认只能压缩文件,不能压缩目录
        2.压缩之后会删除原文件

    zip 可压缩目录 如:zip FILENAME.zip /path/
            unzip FILENAME.zip
            zip既可以压缩又可以归档(archive:将多个文件整合成一个文件,与打包一样),但是压缩比很小。不过好处是windows,linux,macos天生支持,又可以既归档又压缩。

4. tar 命令,The GNU version of the tar archiving utility.打包之后加入了一系列的元数据,导致打包后的size大于个体之和的size,
    -c:创建归档文件
    -f FILE.tar:操作的归档文件:如tar -cf test.tar test*.txt(为数不多的短命令不允许调换位置的,其后面必须跟着文件名)
    -x:展开归档
    --xattrs:归档时,保留文件的扩展属性信息。类似于-p选项
    -t:不展开归档,查看归档的内容类似于gzip,bz2和xz中的xcat等
    -v:列出整个过程详细的信息
    -z:调用gzip(可根据其后面的参数c或者x自动判断出是解压缩还是压缩)
    -j:调用bzip2
    -J:调用xz
    -C:解压后并且展开到某个目录
	解压缩的时候可以忽略前面的z,j,J,因为tar可以根据后缀名自动识别调用相关的工具。此外,这里的-也是可以省略的,因此往往我们只使用xf两个参数就可以完全自适应不同后缀。
cpio:归档工具,比起tar而言更加古老,但是有时候会好用,这个针对内核更多。

进程处理

进程创建:

	init
		父子关系
		进程都是由父进程创建:fork(),clone()
	进程优先级
		0-139(数字越小进程优先级越高)
			1-99:实时优先级
			100-139:静态优先级	
		Nice值可以调节

进程的分类:

? ? 与终端有关的进程
? ? 与终端无关的进程

进程状态:

? ? D:不可中断的眨眼
? ? R:运行或就绪
? ? S:可中断的睡眠
? ? T:停止
? ? Z:僵死
?? ?
? ? <: 高优先级进程
? ? N: 低优先级进程
? ? +:前台进程组中的进程
? ? l:多线程进程
? ? s:会话进程首进程(包含子进程)

ps:Process State([]代表着内核级别的线程)

格式:ps [OPTION]
    BSD feature:(not dash)
        a:与终端相关的进程
        x:与终端无关的进程
        u:以用户为中心组织进程状态信息显示
        ---------------------------
        VSZ:虚拟内存集
        RSS:常驻内存集(一定不能放在交换内存里面的)
        STAT:
            R(Running)
            S(interuptable sleeping)
            D(uniterruptable sleeping)
            T(Stopped)
            Z(Zombie)

            +:前台进程
            l:多线程进程
            N:低优先级进程
            <:高优先级进程
            s:session leader
    UNIX feature(must have dash)
        -e:显示所有进程
        -f:显示完整格式
        -F:显示完整格式信息
            C:cpu utilization
            PSR:运行于那个CPU之上
        -H:以层级方式显示信息
    o filed1,field2 自定义显示的字符列表,以逗号分开
        常用的field:(pid,ni,pri,psr,pcpu,stat,commn,tty,ppid)
    -eo
    axo
pstree,显示进程树
pgrep
? ? -u euid
? ? -U uid
pidof:根据程序名,查找其相关进程的ID号
top:监控系统性能?
? ? M:根据驻留内存大小进行排序
? ? P:根据CPU占用率进行排序
? ? T:根据累计时间进行排序
?? ?
? ? l:是否显示平均负载和启动时间
? ? t:是否显示进程和CPU状态相关信息
? ? m:是否显示内存相关信息

? ? c:是否显示完整的命令行信息
? ? q:退出top
? ? k:杀死某个进程?

? ? -d:指定刷新时间,单位为秒
? ? -b:以批处理模式
? ? -t: #?在批模式下,共显示多少批

进程间通信(IPC:inter process communication)

? ? 1.共享内存
? ? 2.信号量机制
?? ?? ? Signal,Semaphore
?? ?? ? 重要的信号:
?? ??? ?? ? 1:SIGHUP,让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效
?? ??? ?? ? 2:SIGINT,Ctrl+c:中断
?? ??? ?? ? 9:SIGKILL,杀死一个进程
?? ??? ?? ? 15:SIGTERN,终止一个进程(默认)
?? ?? ? 指定一个信号:
?? ??? ?? ? 信号号码: kill -1?
?? ??? ?? ? 信号名称:kill -SIGKILL
?? ??? ?? ? 信号名称简写:kill -KILL(去掉全称的SIG)
?? ?? ? kill PID
?? ?? ? killall COMMAND
?? ?? ? pkill

调整nice值
? ? renice NI PID
在启动时指定nice值:
?? ?? ? nice -n NI?COMMAND
前台:占据了命令提示符
后台:启动之后,释放命令提示符,后续的操作在后台完成
?? ?? ? 前台-->后台:
?? ??? ?? ? Ctrl+z:把已经在前台的送往后台
?? ??? ?? ? COMMAND &:让命令在后台执行
?? ?? ? jobs:查看当前系统后台的作业。作业号不同于进程号
?? ??? ??? ??? ?? ? +:命令将默认操作的作业
?? ??? ??? ??? ?? ? -:命令将第二个默认操作的作业
?? ?? ? bg:让后台的作业继续运行 [%JOBS]
?? ?? ? fg:将后台的作业调回前台? [%JOBS]
?? ?? ? %通常可省,但是在kill杀死作业时是必须要加
? ? ?kill %JOBID:终止某作业
vmstat:系统状态查看命令
?? ?vmstat [刷新延迟] [刷新次数]
?? ?如vmstat 1 3
uptime:与top第一行的效果是一样的

dmesg 查看开机时内核检测信息

uname -a(all信息) -r(版本) -s(名称)
uname -r查看系统版本的方式



lsof【选项】 列出进程调用或者打开的文件信息
-c(以字符串开关的进程打开的文件)
-u(列出某个用户的进程打开的文件)
-p(列出某个PID进程打开的文件)

/proc/cpuinfo
/proc/meminfo
/proc/1/maps?可以详细看到每个进程所占用的逻辑空间。

ps命令:ps- report a snapshot of the current processes(由于是快照,所以只能显示一次)		
/proc/:内核中的状态信息
    内核参数:
        1.可以设置其值从而调整内核运行状态的参数:/proc/sys/
        2.状态变量:其用于输出内核中统计信息或状态信息,仅仅用于查看
    参数:模拟火车呢过文件系统类型
进程:
    /proc/#(就是)
    #PID

pgrep,pkill
-u uid: effective user
-U uid: real user
-t termianl:与指定终端有关的进程
-l: 显示进程名
-a:显示完整格式的进程名
-P pid:显示进程的子进程
pidof:
取指定进程的pid号码
top命令:
(目前时间) (已经运行了多长时间) (已经登录用户) (平均负载1,5,15)  uptime也可以用来查看这一行 
(Tasks进程任务)
us(用户空间) sy(内核占比) ni(用于nice值调整) id(空闲) wa(等待时间) hi,si,st

排序:P(CPU),M(Memeory)T(累积占用CPU资源)

首部信息:
uptime (l)
tasks and cpu(t)
memory(m)
退出:q  修改刷新时间:s 终止指定的进程:k
选项:
-d #:以指定时间间隔显示
-b:以【批次方式显示
-n #:显示多少批次
htop:
子命令:
l:显示选定的进程打开的文件列表
s:跟踪选定的进程的系统调用
t:以层级关系显示进程状态
a:将选定的进程绑定至某指定的CPU个数
vmstat [option][delay][count]
procs:
r:等待运行的进程个数:CPU上等待运行的任务的队列长度
b:处于不可中断睡眠的进程个数:被阻塞的任务队列的长度
memory
swpd:交换内存的使用总量
free:
buffer:
cache:
swap:
si:进入swap中的数据速率(kb/s)
so:离开swap中的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率
bo:保存数据至块设备的速率
system:
in:interrupts:中断速率
cs:context switch(上下文切换的速率)
cpu:
us:user space
sy:system
id:idle
wa:wait
st:stolen
-s:显示内存统计数据
pmap
pmap [option] pid
-x:显示详细格式的信息(cat /proc/PID/maps)
dstat:
    -c:显示cpu相关信息
    -d:显示磁盘的相关信息
    -g:显示page相关的速率
    -m:memeory
    -n:interface
    -p:process
    -r:io
    -s:swapper

    --tcp
    --udp
    --raw
    --socket
    -ipc
    --top-cpu
    --top-io
    --top-mem
    --top-lantency
kill[-s signal | SOIGNAL] pid
-l:显示当前系统可用信号
1)SIGHUP:无需关闭进程而让其重读配置文件
2)SIGINT:终止正在运行的进程,相当于CTRL+C
9))SIGKILL:杀死正在运行的进程
15)SIGTERM:终止运行的进程
18)SIGCONT:将后台停止的进程继续
19)SIGSTOP:相当于ctrl+z
killall-kill process by name(对于向httpd这样的多进程)
ps aux | grep "httpd" | grep -v grep(过滤掉grep本身所打开的)

作业控制

job:
前台作业:通过终端启动,且启动后会一直占据终端
后台作业:可以通过终端启动,但启动后会转入后台终端
通常是一些服务类程序

1.如何让作业运行于后台??
(1)运行中的作业
ctrl+z(但送往后台后,作业会转为停止态)
(2)尚未启动的作业
#COMMAND &(此类作业虽然被送往后台,但其依然与终端相关,只要终端停止,此进程依然停止)
#nohup COMMAND &(使作业运行于后台的同时,并且脱离和终端的关系)
2.查看所有的作业
#jobs
3.可以实现作业控制的常用命令			
fg[[%]JOB_NUM]
bg[[%]JOB_NUM]
kill[[%]JOB_NUM]

进程启动时,其nice值默认为0,其优先级是120.		
nice命令可以修改nice值。

基本命令

命令分为短命令和长命令,长命令不能组合,而短命令往往可以组合,少数情况不能组合,比如tar -xf中的f与x就不能互换。

ls

-l:以长格式显示
-h:做单位转换,等效为长命令 --human-readable
-a:显示隐藏文件(linux的隐藏文件以.开关;.表示当前目录;..表示上一级目录)
????????--color=auto 显示颜色
-A:显示所有隐藏文件,不包括.和..两个特殊目录文件
-d:显示目录自身属性
-i:显示文件的索引结点号
????linux系统中每一个文件都有一个结点标识号(称为index node)
-r:逆序显示
-R:递归显示????

cd

~ :(表示家目录,可以不加~,因为那是默认的权限)(假如用户不使用任何参数)对家目录而言用户具有所有的权限(root可以使用 cd ~User到别人的家目录里面去)
- :在当前目录和前一次所在的目录之间来回切换

type:

????显示指定命令属于哪种类型Linux命令类型有两种,一种是内置命令(shell内置),另外一种是外部命令。有一些命令是shell builtin(即内置命令),而外部命令是指:在文件系统的某个路径下有一个和命令名称相对应的可执行文件。如vim这个命令或者安装了而可以直接调用filezilla这个命令.

man+help

????内部命令: help command
????外部命令: command --help
????但是总的来说,无论是内部命令还是外部命令,往往都可以被man(manual)所支持(man command),它表示使用手册。
????man命令是分章节的:
????1.用户命令
????2.系统调用
????3.库调用
????4.特殊文件(设备文件)
????5.文件格式(配置文件的语法)
????6.游戏
????7.杂项(Miscellaneous)
????8.管理命令(通常只有管理员才能资格使用的命令/sbin,/usr/sbin/usr/local/sbin)
????<>:必选???[]:可选???---:可以出现多次??l:多选一??{}:分组
????#man 7 glob可以获得以上这些列表,有些系统如centos不支持这种分章节查询方法
---------------------------------------
????MAN:
????????NAME:命令名称及功能简要说明
????????SYNOPSIS:用法说明,包括可用的选项
????????DESCRIPTION:命令功能的详尽说明,可能包括每一个选项的意义
????????OPTIONS:说明每一个选项的意义
????????FILES:此命令的相关文件
????????BUGS:
????????EXAMPLES:使用示例
????????SEE ALSO:??另外参照
-------------------------------
????翻屏:
????????向后翻一屏:SPACE
????????向前翻一屏:b
????????向后翻一行:ENTER
????????向前翻一行:k
????查找:
????????/KEYWORD :自前向后(n:下一个)
?????????KEYWORD:自后向前(N:前一个)
????退出:q
-----------------------------------------
????info command(在线文档)
????本地文档: /usr/share/doc

printenv:

打印系统当前环境变量(系统会根据里面的PATH从而确定相应的路径),感觉是调用echo $PATH

mkdir:

????比如创建 /mnt/test/x/m,y时,我们可以简写为mkdir /mnt/test/{x/m,y} -pv
????比如在创建a_b,b_c,d_b,d_c时,甚至可以使用mkdir -pv /mnt/test/{a,b}_{d,c}

touch +tr+sort+uniq+tee

touch:可以用来创建文件。但是其目的不是用来创建文件的,而是用来修改文件时间戳的而其文件状态可以使用stat filename。从而用来改变时间戳

tr:文本替换

sort :文本排序
????sort -t: -k3 /etc/passwd
????????-n:数值排序
????????-r:降序
????????-t:字段分隔符
????????-k:以哪个字段为关键字进行排序
????????-u:排序后相同的行只显示一次
????????-f:排序时忽略字符大小写

uniq:显示重复的行
????-c:显示文件中行重复的次数
????-d:只显示重复的行

tee:
从标准输入中读入数据,并写入到文件和标准输出中去。

数据匹配

locate:

非实时,模糊匹配,查找是根据全系统文件数据库进行的。如果是刚刚装系统的话,那么很有可能由于文件数据库并未建立,而无法使用此命令。当然我们可以使用#updatedb来手动生成文件数据库(centos不支持)

find:

实时,精确,遍历指定目录中的所有文件完成查找,速度慢,支持众多查找标准
find 查找路径 查找标准 查找到以后的处理动作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理动作:默认为显示到屏幕中
匹配标准
    -name ‘FILENAME‘: 对文件名进行精确匹配,支持文件名通配:*/?/[]
    -iname ‘FILENAME‘: 文件名匹配不区分大小写
    -regex PATTERN :基于正则模式实现文件查找
????-user USERNAME :根据文件属主进行查找
????-group GROUP :根据属组查找
????-uid UID:根据UID号进行查找
????-gid GID:根据GID号进行查找
????-nouser:查找没有属主的用户
????-type( f:普通文件,d,c,b,l,p,s)????????????
????-size (-ls 显示出相应的文件大小)
????    [+|-]#k,+代表大于,-代表小于,不加代表精确为多少。但是实际上也并不精确,是一种取整型的
?????   #M
????????#G
    组合条件:
????????????-a
????????????-o
????????????-not
????????????????-mtime : 最近一次修改时间
????????????????-ctime :最近改变时间
????????????????-atime :最近一次访问时间
[+|-]:#天之内和之外
????????????????-mmin
????????????????-cmin
????????????????-amin
????????????????????分钟
????????????-perm MODE???按权限查找,不加/-,代表着精确匹配
????????????????-mode 文件权限能完全包括此mode时才能显示
????????????????/mode 只要有一个对应即可
?????????动作:
????????????-print :显示
????????????-ls :类似ls -l的形式显示每个文件的详细
????????????-ok COMMAND {} \; 每次操作都需要用户确认
????????????-exec COMMAND {} \;每次操作不需要用户确认
????????????-xargs 从标准输入流中读取命令执行
????????????????如:find /etc -size +1M | xargs echo >> /tmp/etc.largefile

echo

-n:不进行换行
-e:让转义符生效
单引号:强引用:变量引用不执行替换
双引号:弱引用,变量引用会被替换????

history

.bash_history(每个用户家目录下都会自动生成,以保存用户输入记录)
    -c:清空命令历史
    -d offset:删除指定历史命令
    -r:从文件读取命令至历史列表中
    -w:把历史列表写到文件中
history #:显示最近的#条命令
调用命令历史列表中的命令(!)
    !#:再一次执行历史列表中的第#条命令
    !!:再一次执行上一条命令
    !string:再一次执行命令历史中最近一次以string开头的命令(需要依赖于幂等性)
调用上一条命令的最后一个参数
	ESC,.(快捷键)
	!$(字符串组合)
控制命令历史的方式
HISTCONTROL
    ignoredups:忽略重复的命令
    ignorespace:忽略以空格开始的命令历史
    ignoreboth:以上两者同事生效

命令操作

光标跳转
?? ?ctrl+a:跳到命令行首
?? ?ctrl+e:跳到命令行尾
?? ?ctrl+u:删除光标至命令行首的内容(这个在bash中如此,在zsh中被另外一种方式取代,相当于ctrl+k)
? ??ctrl+k:删除光标至命令行尾的内容
?? ?ctrl+l:相当于clear,清屏(但是更好用,可以在输入字符的条件下使用,而且保留正在输入的值)

命令历史
?? ?history:查看命令历史:
? ? ?? ?-c:清空命令历史
? ??? ? -d?offset [n]:删除指定位置的历史命令
? ? ?? ?-w:保存命令历史至历史文件中

命令/路径补全
?? ??? ?TAB补全
?? ??? ?双击Tab可以显示所有可能

环境变量(可以使用echo $+环境变量名以显示相应的东西)
?? ?PATH:命令搜索路径
?? ?HISTSIZE:命令历史缓冲区大小

命令历史的使用技巧
?? ?!+n/-n从而选择相应的历史命令?? ?
?? ??? ?!!:执行上一条命令
?? ??? ?!string:执行命令历史中最近一个以指定字符串开头的命令
?? ??? ?!$:引用前一个命令的最后一个参数(ESC + .或者Alt + .)

命令别名
alias COMMANDALIS=‘COMMAND‘
unalias?COMMAND

?所有定义的别名只在当前shell的生命周期中有效。如果想要永久有效使用,我们需要编辑bash相对应的配置文件,
?? ?如.bashrc(如alias ll = "ls -lh --color=auto")。

命令替换( $+() 或者 ``)
echo "The current directory is $(pwd)."
touch ./file-$(date +%F-%H-%M-%S).txt

?? ?其中bash所支持的引号(一共三种)
``(反引号):  命令替换
""(双引号):? 弱替代,可以实现变量替换
‘‘(单引号):? 强引用,不完成变量替换

文件名通配(globbing)
通配符很难表达所有all需要的情况,因此它只能用于简单的匹配规则。如果需要更加完整而且复杂的匹配规则,我们需要正则表达式。
*? :匹配任意长度的任意字符包括(长度0)
? :匹配任意单个字符
[] :匹配指定范围内的任意单个字符,采用特殊标志,
    [abc](以a或b或c)为标志的,[a-m],[a-z],[0-9],[a-zA-Z]
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:大小写字母
[:digit:]:数字
[:alnum:]:数字和大小写字母
[^]: 匹配指定范围之外的任意单个字符,相当于上面的取反

用户权限

1.组是权限的容器(集合),当用户想要获得某些计算资源时,应当依附于这个组。由于组本身关联着权限。它被称为用户组,用户组的出现是为了方便地指派权限。
2.从上面这个角度来说,我们就可以将用户权限定义为三类,属主,属组,其它人。用户是一个标识,用来判断是否可以获取系统中的计算资源。计算资源本质上是由进程来访问的,这个进程有一个发起者,使得资源本身可以判断发起者是否这次的访问是否安全。最终,我们可以看到两个标准(secure context)
3.权限只有三种,分别是r,w,x。(我们可以以8进制数来表示它们所有的允许操作状态)
????u User,即文件或目录的拥有者;
????g Group,即文件或目录的所属群组;
????o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
????a All,即全部的用户,包含拥有者,所属群组以及其他用户;
????r 读取权限,数字代号为“4”;
????w 写入权限,数字代号为“2”;
????x 执行或切换权限,数字代号为“1”;
????- 不具任何权限,数字代号为“0”;
????s 特殊功能说明:变更文件或目录的权限。

????文件:
????????r:可读,可以用类似于cat等命令查看文件内容
????????w:可写,可以编辑或者删除文件
????????x:可以执行(eXacutable),可以在命令提示符下当作命令提交给内核运行

????目录:
????????r:可以对此目录执行ls以列同内部的所有文件
????????w:可以在此目录中创建文件
????????x:可以使用cd,切换进此目录,也可以使用ls -l查看内部的详细信息。

????用户:UID /etc/passwd
????级:??GID /etc/group
????影子口令(保存了用户的具体密码,打开相应的文件实际上也是加密过的):
????????用户:/etc/shadow
????????组: /etc/gshadow
????用户类别:
????????管理员:root 0
????????普通用户:1-65535
????????????系统用户:1-499 只能用来操作,而不能登陆,一般是公共命令。
????????????一般用户: 500-60000
????用户组类别:
????????管理员组:
????????普通组:
????????????系统组:
????????????一般组:
????????????
????私有组:(创建用户时,在没有为该用户创建所属于的组时,系统会自动为其创建一个与用户名同名的组)
????基本组:用户的默认组
????附加组:额外组,默认组以外的其它组。
???????????????
????用户管理:
????????useradd,userdel,usermod,passwd,chsh,chfn,finger,id,chage
????组管理:
????????groupadd,groupdel,groupmod,gpasswd
????权限管理:
????????chown,chgrp,chmod
useradd [option] USERNAME 其定义规则在/etc/login.defs中被定义
????-u UID
????-g GID(基本组)
????-G GID,.....(附加组)
????-c "COMMENT"指定注释信息
????-d /path/to/somewhere 指定家目录
????-s /etc/shells 指定当前系统可用的安全shell
????????-m -k 创建家目录(配合-k一起实现)
????????-M 不创建用户家目录
????????
userdel??userdel USERNAME直接删除掉相关的用户
????-r:在删除用户的同时会删除用户的家目录
????????
id:查看用户的账号属性信息
????????-u
????????-g
????????-G
????????-n 显示相应的名称而非id号

修改用户账号属性
usermod
????????-u UID
????????-g GID
????????-a -G GID(追加新的附加组,不使用-a会覆盖此前的附加组)
????????-c
????????-d -m(即移动用户目录,又将里面的数据迁移到新目录,和-a差不多)
????????-s 修改用户的shell
????????-l
????????-L:锁定账号,类似于禁用
????????-U:解锁账号

chsh:用于修改用户shell
?????chsh -s /etc/shells?? username

chfn:修改注释信息
passwd:修改密码,默认情况下只能修改自己的密码,但是root也可以用来修改其它人的密码
pwck:检查用户账号完整性
组管理:
????????创建组:groupadd
????????????????????-g 指定GID
????????????????????-r:添加一个系统账号
????????????groupmod
????????????groupdel
????????????gpasswd:给组加密码
????????????newgrp:登陆到一个新组
chown:改变文件属主
??????chown USERNAME file/dir
????????-R:修改目录用其内部文件的属主(递归修改)
????????--reference=/path to you file 将文件的属主和该路径属主一样。
chgrp:用法和chown一样,是用来修改属组
?????当然,chown即可以用来修改属主也可以用来修改属组,因此基本上已经被取代。
chmod:修改文件的权限
1.修改三类用户的权限
????????chmod MODE file/dir
????????????????-R(这种权限的修改是单向的,对于目录而言。如果想要整体修改,那么我们需要以)
2.修改某类用户或某些类用户权限
????????chmod 用户类别=MODE file,....
3.修改某类的用户某位或者某些位权限
????????chmod 用户类别 +|- MODE file,....
umask: 遮罩码
????????文件:666-umask
????????目录:777-umask
????????022(管理员)?????002(普通用户)
????????文件默认是不允许具有执行权限,如果算得的结果有执行权限,则将其权限加1
特殊权限:
????用户在运行程序时,展开的进程会以用户本身的属主和属组去执行。介一旦具有s这个选项,那个执行起来的结果是程序A启动所带动的程序B,会以这个程序A的身份去运行
passwd:s
????SUID:运行某程序时,相应进程的属主是程序文件本身的属主,而不是启动者的属主
????????????chmod u+s FILE(如果file原来就有执行权限,就显示为s,如果没有大写权限,就显示为S )
????????????最著名的就是passwd这个命令以rws作为属主,但是却能够执行/etc/shadow这个文件权限
????SGID:运行某程序时,相应进程的属主是程序文件本身的属组,而不是启动者的属组
??????chmod g+s FILE
??????chmod g-s FILE
????Sticky:
????????????在一个公共目录,每个人都可以创建文件,删除自己的文件,但是不能搞别人的文件
????????????chmod o+t DIR
????????????chmod o-t Dir
????000
????001
????.....
????110
????111
????chmod 1755 /backup/test 此时最前面的1代表着001也就是sticky

Linux系统

Linux系统修复

1.使用grub命令,使用ls+cat命令找到/etc/fstab并找到根分区
      指定kernel
      指定initramfs
      boot重启即可
      完成这三步,就已经可以正常启动
  操作流程
      grub> ls/cat 定位到相应的根分区目录和(/etc/fstab)
      grub> linux (hd#,msdos#)/(hd#,gpt#)/boot/vmlinuz-xx rw root=/dev/sdX# 
      grub> initrd (hd#,msdos#)/(hd#,gpt#)/boot/initramfs-xx 
      grub> boot
      
2.grub-install  --root-directory=/path/to/boot‘s_parent_dir  /PATH/TO/DEVICE(在新版本之后,这些参数--root-directory这个参数被废弃)

系统初始化

    文件作用:
        /etc/rc.d/rc.sysinit完成的任务
            0.检测并以读写方式重新挂载根文件系统
            1.激活udev和selinux
            2.根据/etc/sysctl.conf文件,来设定内核参数
            3.设定时钟
            4.装载键盘映射
            5.启用交换分区
            6.设定主机名
            7.根据文件系统检测,并以读写方式重新挂载
            8.激活RAID和LVM设备
            9.启用磁盘配额
            10.根据/etc/fstab,检查并挂载其它文件系统
            11清理过期的锁和PID文件
            rc#.d/ 它们的链接由chkconfig(centos7中已经被systemctl取代)
                K*:kill-->stop
                S*:start
        /etc/inittab
            1.设定默认运行级别
            2.运行系统初始化脚本
            3.运行指定级别对应的目录下的脚本
            4.设定Ctrl+Alt+Del组合键的操作
            5.定义UPS电源在电源操作故障/恢复时执行的操作
            6.启动虚拟终端(2345)
            7.启动图形终端(5级别)
            ---------------------------  
            id:5:initdefault:
            id:标识符
            runlevel:运行级别
            action:在什么情况下执行此行
                initdefault:设定默认运行级别
                sysinit:系统初始化
                wait:等待级别切换到此级别执行
                respawn:一旦程序终止,会重新启动
                process:要运行的程序
            ---------------------------
    服务脚本特点:一旦服务创建,它会在/var/lock/subsys/创建一个同名文件
    /etc/rc.d/init.d , /etc/init.d
    SysV:
        start|stop|restart|status(应当是必要的)
        reload|configtest(可以是非必要的)
    chkconfig:
        chkconfig:runlevels SS KK
            当chkconfig命令来为此脚本在rc#.d目录创建链接时,
        runlevels:-表示没有级别,默认创建为S*开头的链接,除此之外创建的
            默认为以K*开头的链接;S后面的启动优先级为SS所表示的数字;
            K后面关闭优先次序为KK所表示的数字
        description:用于说明此脚本的简单功能:  \,续行
            --list 列出当前系统中的所有独立守护服务的启动设定:独立守护进程
            --add service_name
            --del service_name
            --level 24 myservice {off|on}
                level如果省略,默认为2345
    /etc/rc.d/rc.local: 系统最后启动的一个服务,准确说,应该执行的一个脚本
    守护进程的类型:
        独立守护进程
        xinetd:超级守护进程, 瞬时守护进程:(不需要关联到运行级别)

Kernel初始的过程

    1. 设备探测
    2. 驱动初始化(可能会从initrd(initramfs)文件中装载驱动模块)
    3. 以只读方式挂载根文件系统(为了安全起见)
    4.装载第一个进程init(PID:1)  init,使用串行启动,但是时至今日它已经发生了很大的变化。/sbin/init,已经成为一个链接,而被技术更加先进的并行启动器所取代。
    5.init程序类型有:
        upstart: ubuntu,d-bus(event-driven)
        systemd:目前绝大多数的Linux包括ubuntu自己目前也使用了systemd
        init对应文件:/etc/uinittab和/etc/init/*.conf
        OpenRC(gentoo使用)     

系统参数查看

查看当前系统运行级别:
       1. runlevel
       2. who -r
   运行级别解释:0-6
       0:   halt
       1:    single user mode,直接以管理员身份切入 s,S,single
       2:    multi user mode,no NFS
       3:    multi user mode,text mode
       4:    reseved(保留级别)
       5:    multi user mode,graphic mode
       6:   reboot
   关机命令:
       reboot/halt/poweroff/exit
       shutdown(一个更加强大的命令,可以实现上面的功能)
       init 0
       init 6
   查看内核架构版本号等
       uname  -a ,-r,-s等诸多信息

内核参数修改

    伪文件系统在用户空间访问,监控内核的方式/proc,/sys
        /proc/sys:此目录中的文件很多是可读写的
        /sys:某些文件可写
    设定内核参数值的方法(会立即生效,但是一重启就失效,永久有效需要修改/etc/sysctl.conf,但是不能立即生效)
        1.  echi VALUE > /proc/sys/TO/SOMEFILE
        2.  sysctl -w  kernel.hostname="darling"
    修改文件完成之后,执行如下命令可立即生效
        sysctl -p
        sysctl -a查看所有的参数

内核模块管理

    lsmod:查看
    modprobe MOD_NAME:装载某模块
    modprobe -r MOD_NAME:卸载某模块
    modinfo MOD_NAME::查看模块信息
    insmod /PATH/TO/MODIULE_FILE:装载模块
    rmmod MOD_NAME
    depmod /PATH/TO/MODELS_FILE生成模块

CentOS下内核编译:

    0:内核中的功能除了核心功能之外,在编译时,大多数都有三种选择
        1.不使用此功能
        2.编译成内核模块
        3.编译进内核
    1.准备条件(开发工具)
        yum grouplist/install Development Tools/Development: Library
    2.进入编译选项并
        图形界面+图形工具开发库:
            make gconfig:Gnome
            make kconfig:KDE  
        文本图形窗口(可以将/boot这个目录下的.config文件拷贝到内核目录之下,从而实现快速配置)
            make menuconfig(文本图行窗口,需要全屏模式,当过小时会报错,这个也是最长用的)
    3.保存并开始内核编译
        make -jN(对于intel CPU而言,N可以为线程数量+1)
        make modules_install
        make install
        如果是二次编译时要清理,清理前,如果有需要,请备份配置文件.config:
            make clean
            make mrproper

开机流程:

基本概念介绍
Firmware:BIOS(Legacy BIOS)和UEFI(UEFI BIOS)
    说明:无论传统BIOS还是UEFI BIOS都被简称为bios
PartitionTables:MBR(MasterBootRecord)和GPT(GUID Partition Table)
    说明1:虽然分区表有传统MBR以及新式GPT,不过GPT也有保留一块兼容MBR的区块。
    说明2:
        1.win8以及之后已经锁定了mbr,使得已经不可能实现windows8和linux共存的又系统情况了,但linux是非常开放的生态
        2.linux的bootloader有多种,当然最常用的还是grub,这个目前有grub1,grub2:
        3. GRUB(GRand Unified Bootloader)
                 stage 1  :MBR
                 stage 1.5:用来识别不同的操作系统
                 stage2   :/boot/grub  
过渡根(initramfs/initrd)
    在启动初期,Linux借助过渡根完成伪根到真实根的映射,过渡根又被称作(redhat5:initrd readhat6:initramfs)
    内核由内核核心和内核模块组成,事实上众多驱动都是内核模块:
核心:/boot/vmlinuz-version
内核模块(ko):  /lib/modules/version/


1.系统首先去加载bios,然后借助bios程序去加载cmos的信息,再借由cmos内的设定值取得主机的各项硬件配置(频率,大小类型等),在取得信息后,bios还会进行post,然后开始执行硬件侦测的初始化,并设定Pnp,之后再定义出可开机的装置顺序,接下来就会开始进行开机装置的数据读取
2.bios会指定开机的装置使得我们可以读取磁盘中的os核心文件,但是由于不同os其文件系统格式不同,因此我们需要以一个开机管理程序来处理核心文件加载问题。这个bootloader位于MBR中
3.每个OS默认是会安装一套bootloader到自己的FS,而linux安装时,可以选择将bootloader安装到mbr,也可以选择不安装。如果选择安装到mbr,那么理论上你在mbr与boot sector都会保有一份bootloader程序。而windows预设会主动的将mbr与boot sector都装上一份bootloader。这往往会导致windows覆盖其它的bootloader
    理论0:操作系统以Partition作为安装单元,其中每个分区的第一个sector被称作(boot sector),如果有系统安装的话。那么系统就会将自己kernel的位置放在这个sector上以便于当这这个boot sector被加载时能够直接找到核心的位置。但是安装操作系统首先需要将分区以格式化成系统能够识别的FS.
    理论1:每个OS都可以安装一份OSloader到自己的(boot sector)中,这使得OS可以透过自己的bootloader来加载核心。但是一块磁盘的MBR只有一个(位于磁盘的第一个sector)
    理论2:bootloader(1.提供选单,使得用户可以选择不同的开机项目;2.载入核心文件;3.转交其他loader,但是实际上windows-loader(WindowsBootManager)预设不具有转交功能,因此不能使用windows的loader来加载linux的loader)
    理论3:当我们借由bootloader的管理而开始读取核心文件后。接下来,linux就会将核心解压缩到RAM当中,并且利用核心的功能重新开始测试与驱动各个周边装置(通常是储存装置/CPU/网卡/声卡/等核心包括的模块。
        即此时linux核心会以自己的功能重新侦测一次硬件,而不同于使用bios侦测到的硬件信息。
        此时,核心才开始真正接管bios后的工作。即/boot/vmlinuz-XX.
        而且由于linux作为一个Monolithic设计,为了简化硬件开发商与其他核心功能开发者的便利,是通过动态加载核心模块的/lib/modules(/与/lib必须在同一个partition)
    理论4: /boot/grub2/grub.cfg is automatically generated by grub-mkconfig using templates
    理论5: 模块放置到磁盘的根目录下,而开机时,核心必须要挂载根目录,才能读取核心模块提供加载驱动程序的功能
            而且为了担心影响到磁盘内的文件系统,开机过程中根目录是以只读方式来挂载的。
          而磁盘驱动则通常是以模块的方式存在的。
          问题出现了:核心不认识sata磁盘,所以需要加载sata磁盘的驱动程序,否则无法挂载根目录。但是sata驱动
          又在/lib/modules内的驱动程序中。
          于是虚拟文件系统(initramfs,initrd)出现了,它能够通过bootloader来加载到内存中,然后这个文件会被
          解压缩并且在内存当中仿真成一个根目录,且此仿真在内存当中的文件系统能够提供一个可执行程序,这个程序可
          用来加载开机过程中所最需要的核心模块(USB,RAID,LVM,SCSI)等文件系统与磁盘接口的驱动程序
    理论6:bootloader can load ‘kernel‘ and ‘initramfs‘,然后让initramfs解压缩在内存中成为根目录。使得
            kernel就能够借此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,便能够开始正常
            的开机流程。
            lsinitramfs initrd.img
            kernel/x86/microcode/GenuineIntel.bin等
            1.其实initramfs就是一个小型的根目录,这个小型根目录里面也是通过systemd来进行管理。同时
                systemctl list-denpendencies default.target,会发现其实这个小型系统就是通过initrd.target
                来开机,而initrd.target也是需要读入一堆如 basic.target,sysinit.target等的硬件侦测,核心功能
                启用的流程,然后开始让系统顺利运作,最终才卸除initramfs的小型系统,实际上挂载系统的根目录。
            2.initramfs也没有包含众多,它仅是带入开机过程会用到的核心模块而已。事实上解压这个模块去找modules这个                关键词,主要的核心模块大概就是SCSI,RAID等和磁盘相关性比较高的模块。所以要么我们将SATA的模块直接
                编译进核心,要么就无法正常开机。
            3.第一个程序 systemd(pid=1),systemd最主要功能就是,准备软件执行的环境,包括主机名,网络设定,语系处理
文件系统格式及其他服务的启动。而所有的动作都会通过systemd的默认启动服务集合
(/etc/systemd/system/default.target)来规划。它是对沿用多年的systemV的runlevel的舍弃。
当我们取得了/etc/systemd/system/default.target这一个预设操作界面的设定之后,接下来会链接到
/usr/lib/systemd/system这个目录中的multi-user.target或graphical.target这两个其中之一。
进而进入/etc/systemd/system/graphical.target.wants(使用者设定加载的unit)和
/usr/lib/systemd/system/graphical.target.wants(系统默认加载的unit)
---------------------------------
任何一个service的书写规则:
 [Unit]:unit本身的相关说明                 Description:当使用systemctl list-units/status输出给管理员看的说明        Documentation:相关文件声明                After:说明此unit是在哪个daemon启动之后才启动的意思!基本上说明服务启动顺序, 不强制。与Requires有区别              Before:同样是一个规范,声明什么服务启动前最好启动这个服务   Requires:强制要求,其指定的unit必须在daemon启动之后才能启动。如果不启动,则unit不会被启动 Wants:规范最好还要启动什么服务比较好,不过,也不是强制。
                            Conflicts:代表冲突的服务,如果这个项目后面接的服务如果有启动,则此unit不能启动。
                                如果此unit启动,则此项目后的服务就不能启动。即冲突性栓查。                    
                        [Service][Socket][Timer][Mount][Path]:不同type使用相对应的设定项目
                            ...
                        [Install] :将此unit安装到哪个target
                            WantedBy:这个设定后面接的大部分是*.target unit,其意思是这个unit本身是附挂在哪个
                                target unit底下
                            Also:相关性启动
                            Alias:别名                            
                    ---------------------------------
                    而mutil-user.target-->basic.target/getty.target/remote-fs.target
                                            -->sysinit.target/socket.target
                        我们可以通过systemctl list-denpendencies basic.target来显示地分析其依赖关系
                                                            --reverse来反向引索
                        也可以通过cat /usr/lib/systemd/system/xx.target来查看某个所依赖的


 4.过去的systemV使用的是一个称为runlevel的概念来启动系统的,systemd为了兼容于旧式的systemV操作行为,也将runlevel与操作环境结合:
runlevel0.target-->poweroff.target
runlevel1.target-->rescue.target
runlevel2.target-->multi-user.target
runlevel3.target-->multi-user.target
runlevel4.target-->multi-user.target
runlevel5.target-->graphical.target                    
runlevel6.target-->reboot.target

5. local-fs.target+swap.target : 挂载/etc/fstab里面所规范的文件系统与内存置换空间
sysinit.target : 这个target主要在侦测硬件,加载所需要核心模块等动作
basic.target : 加载主要的外围硬件驱动程序与防火墙相关
multi-user.target : 底下的其它一般系统或网络服务的加载
图形界面相关服务等其他服务

 6.systemctl disable vsftpd.service
rm ‘/etc/systemd/system/multi-user.target.wants/vsftpd.service‘
systemctl disable vsftpd.service
ln -s ‘/usr/lib/systemd/system/vsftpd.service‘ ‘/etc/systemd/system/multi-user.target.wants‘(ln -s(symbolic) -f(force)  : ln [option] target DIRECTORY)

  7.为了兼容systemV,而引入了rc-local.service.它是为了设置用户自启动而引入的(/etc/rc.d/rc.local)。
当然新版本更建议直接写一个systemd的启动脚本配置文件到/etc/systemd/system底下,然后使用systemctl enable 的方式来启动它。而不要直接使用rc.local这个文件

8. 核心模块: /lib/modules/$(uname -r)/kernel当中
arch:
crypo:                
drivers:
fs:
lib:
net:
sound:
通常在centos下,initramfs.img是一个.gz的压缩文件。我们需要将其重命令,然后解压,然后形成cpio的压缩文件。当然也有一个linux直接把这个设定为cpio格式的压缩文件。        

9.grub2
                stage1:execute boodloader main program
                    bootloader的主程序,必须要被安装在开机区,要么是MBR要么是boot sector.但是由于MBR实在太小,so,
                    MBR或者boot sector通常仅安装boot loader的最小主程序,并没有安装loader的相关配置文件
                stage2:main program loads configuration file
                    第二阶段为通过bootloader加载所有的配置文件与相关的环境参数文件(主要是FS定义与grub.cfg),它们一般
                    都放在/boot底下,而与grub2相关的都放置到/boot/grub2中
                    device.map
                    fonts       开机过程中的画面会使用到的字体数据
                    grub.cfg    grub的主配置文件!!
                    grubenv     一些环境区块的符号
                    i386-pc        针对一般x86 PC所需要的grub2的相关模块
                        acpi.mod 电源管理相关模块
                        ata.mod
                        chain.mod
                        command.lst
                        efiemu32.o
                        efiemu64.o
                        ext2.mod
                        fat.mod
                        gcry_sha256.mod
                        iso9660.mod
                        lvm.mod
                        mdraid09.mod
                        minix.mod
                        msdospart.mod 一般MBR分区表
                        part_gpt.mod
                        part_msdos.mod
                        scsi.mod
                        usb_keyboard.mod
                        vga.mod
                        xfs.mod                        
                    locale      语系相关的数据
                    themes        开机主题画面数据等
10.可以通过修改几个特定的配置文件,然后使用grub2-mkconfig这个指令来产生新的grub.cfg文件,而不必自己去写。
                /boot/grub/grub.cfg(标准配置,不建议修改)
                /etc/grub.d/*
                /etc/default/grub
                    grub-install  :install GRUB to a device
                        grub-install [--boot-directory=DIR] INSTALL_DEVICE
                            grub-install 仅能安装grub2主程序与相关软件到/boot/grub目录中去。
                                如果后面的设备填的是整个系统(/dev/vda,/dev/sda),那么loader
                                的程序才会写入到MBR里面去。
                    grub-mkconfig :generated a GRUB configuration file
                        -o /path/to/grub.cfg
11.核心模块位于/lib/modules/`uname -r`/kernel/中,这些模块必须要根目录
                被挂载时才能被读取。但是如果核心本身不具有磁盘的驱动程序,就无法挂载根目录,
                也就没有办法取得驱动程序,因此两难。
                而initramfs可以将/lib/modules/内的[开机过程当中需要的模块]打包成一个文件,然后
                在开机时通过主机 的INT 13硬件功能将该文件读出来解压缩,并且initramfs在内存中会仿
                真成根目录,由于此(Initial RAM Disk)主要包含磁盘和文件系统的模块,因此我们的核心
                最后就能认识实际的磁盘,那就能够进行实际根目录的挂载!


 bootloader(Linux主流为grub2,早期是grub1或lilo.而Hackintosh多用Clover)
1.加载BIOS的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置
2.读取并执行第一个开机装置内MBR的bootloader
3.依据bootloader的设定(如果有多个系统,则用户可以作为选择),加载kernel,kernel会开始侦测硬件与加载驱动
4.在硬件驱动成功后,kernel会主动呼叫systemd程序,并以default.target流程开机
    systemd执行sysinit.target初始化系统及basic.target准备OS
    systemd启动multi-user.target下的本机与服务器服务
    systemd执行multi-user.target下的/etc/rc.d/rc.local
    systemd执行multi-user.target下的getty.target
    systemd执行graphical需要的服务

磁盘基础介绍

MBR(主引导记录 共512byte) Master Boot Record

446bytes: BootLoader程序
64bytes: 其中16bytes:标识一个分区(这意味着最多只能创建4个主分区。不过一般情况下我们将最后一个分区作为一个扩展分区。从而形成3(主)+1(扩展分区))
2bytes:Magic Number 标记MBR是否有效

磁盘转速

磁盘的转速往往可以作为磁盘性能的一个重要指,不过往往转速越快越可能发热
笔记本往往是5400转/min (简写为RPM)
台式机往往是7200转/min
固态硬盘可能达到10k以上的转速

磁盘管理命令

ln -s -v] SRC DEST 这里最好将SRC和DEST使用绝对路径

-s ,-- symbolic  make symbolic links instead of hard links
-v, --verbose   print name of each linked file
--version  output version information and exit

du -estimate file space usage

-s
-h

df -report file system disk space usage

-i
-P
-h

磁盘相关命令

系统分区查看和制作

1.分区 (MBR分区表应当使用fdisk进行分区,而GPT分区表应该使用gdidk分区,否则会分区失败。我们应当首先使用lsblk或者blkid先找到磁盘,再用parted /dev/xxx print来找出内部的分区表类型,之后采用gdisk或者fdisk来操作系统。当然parted不仅可以用来更改分区,甚至可以更改分区表类型)  
fdisk:查看了当前系统识别了几块硬盘,当然也可以用来管理磁盘分区,它是一个交互式的分区管理工具。
fdisk -l  /dev/to/some_device_file ]:列出系统磁盘以及所有磁盘分区(lsblk实际上更好用一些)                
**fdisk**  /dev/sdX(fdisk最多支持创建15个分区)
p:显示当前硬件的分区,包括没保存的改动
n:创建新分区
d:删除一个分区
w:保存退出
q:不保存退出
t:修改分区类型
l:显示所支持的所有类型
**partprobe**:使内核重读分区表  
**free**:查看物理内存和交换空间的使用情况
-m :以M的方式显示               

文件系统介绍

	VFS:virtual file system
		Linux的文件系统:ext2,ext3,ext4,xfs,reiserfs,btrfs
		光盘:iso9660
		网络文件系统:nfs,cifs
		集群文件系统:gfs2,ocfs2
		内核级分布式文件系统:ceph
		windows文件系统:vfat,ntfs
		伪文件系统:proc,sysfs,tmpfs,hugepagefs
		Unix文件系统,UFS,FFS,JFS
		用户空间的分布式文件系统:mogilefs,moosefs,glusterfs

创建文件系统

**mkfs**:make file system (实际上,这已经是最常用的用来创建FS的命令了。)
-t FSTYPE  DEVNAME  如:mkfs -t ext2  /dev/sda5
    FSTYPE:(cat /proc/filesystems 查看当前内核支持的文件系统)
    DEVNAME:具体的设备分区文件名(应当是之前分区已经创建好的)
    -t, --type type Specify  the type of filesystem to be built(默认貌似是ext2).
    快捷方式:mkfs -t ext4 = mkfs.ext4
        mkfs.xfs = mkfs -t xfs
**swap分区**:(swap也有自己的特有文件系统,且必须是独立的分区,mkswap+swapon)  

格式化交换分区    
    mkswap /dev/sda8
        -L LABEL
启用/关闭交换分区:
    swapon /dev/sda8
         -a:启用所有的定义在/etc/fstab文件中的交换设备
    swapoff /dev/sda8

专门管理ext系列文件:

mke2fs - create an ext2/ext3/ext4 filesystem

t fs-type:指定文件系统类型(如ext2,ext3,ext4等等),会从/etc/mke2fs.conf文件中读取默认配置; 
-b block-size:设置硬盘的block大小。默认为4096,可取1024,2048,4096
-L ‘LABEL‘:设置卷标;
-j:创建ext3文件系统,mkfs.ext3自带了该选项
-N:设置inode节点的数量;
-m:设置为文件系统预留的块的百分比;
-c:在创建文件系统前进程硬盘自检;
-i: specify the bytes/inode radio;默认为8196,这里给出的数值应为块数量的两倍
-F:强制创建文件系统
-E:用户指定额外的文件系统属性

blkid: locate/print block device attributes

blkid /dev/sda5
    UUID 唯一生成号(几乎)
    LABLE:blkid也可以顺便查看lable
    TYPE:blkid主要用来查看这个文件系统的类型

e2lable:专门用来查看或者修改卷标
tune2fs:调整文件系统的相关属性

-j: 不损害原有数据,将ext2升级为ext3
-L: 用于设定或修改卷标
-m #:调整预留百分比
-r #:指定预留块数
-o:设定默认挂载选项
    acl
-c #:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能
-i #:指定每挂载使用多少天后进行自检,0或-1表关闭此功能
-l:显示超级块中的信息

dump2fs: dump ext2/ext3/ext4 filesystem information

-h: 只显示超级块信息

fsck:检查并修复文件系统

-t FSTYPE: 指定文件系统类型
-a: 像rm一样不询问,自动修复

e2fsck:专用于ext系列修复

-f :强制检查,没问题也要检查
-p :自动修复

挂载卸载介绍

挂载和卸载

挂载:将新的文件系统关联到当前根文件系统(这是因为新的disk可以被文件系统所识别,但是由于没有被根文件系统所挂载导致无法访问,最新版本的桌面版本linux已经能够像windows一样实现自动挂载和自动识别,但是就系统端而言,我们仍然需要挂载从而完成识别。VMware可以通过添加软盘设备从而实现虚拟磁盘的概念)
卸载:将某文件系统与当前根文件系统的关联关系预以移除

mount: 挂载 (不加参数条件下,默认显示当前系统已经挂载的设备及挂载点,载完成之后,要通过挂载点访问对应文件系统上的文件,Linux系统默认提供两个挂载点,/media与/mnt,前者多用于挂载可移除设备,后者多用于挂载临时文件系统)

mount 设备 挂载点  
   设备(三种标识):
       设备文件: /dev/sda5
       卷标:Lable=""
       UUID:UUID=""
   挂载点:目录
       要求:
           1.此目录没有被其它进程使用
           2.目录需要事先存在
           3.目录中的原有的文件将会暂时隐藏
   -a:表示挂载/etc/fstab文件中定义的所有文件系统
   -n:默认情况下,mount命令每挂载一个设备,都会把挂载的设备信息保存到/etc/fstab文件;使用-n选项意味着挂载设备时,不把信息写入/etc/mtab上。
   -t FSTYPE:指定正在挂载设备上的文件系统的类型。不使用此选项时,mount会调用blkid命令获取对应系统文件类型
   -r:只读挂载(比如光盘,就只能以此选项)
   -w:读写挂载
   -o: 指定额外的挂载选项,也即指定文件系统启用的属性
       remount:重新挂载当前文件系统
       ro:只读挂载
       rw:读写挂载

mount 命令,也可以用来挂载iso镜像(非光盘型,类似于网上下载的iso镜像文件)

-o loop:挂载本地回环设备(往往用来挂载iso镜像)

umount:卸载某文件系统

umount 设备 or umount 挂载点
卸载注意事项:挂载的设备没有被进程使用
文件系统的配置文件 /etc/fstab

1.系统重启之后,挂载的系统将不复存在。但是写在/etc/fstab中定义的每一个文件系统,都会被识别。
2.当然,实际上filesystem的挂载是记录到/etc/mtab和/pro/mount中的。但是当整个/etc/是可读的时候(比如出错的时候,由于其子系统必然也只是可读的),我们需要使用-n选项来表明不将此信息写入到/etc/mtab中。从而实现对/etc/fstab的重写。
3.在archlinux中可以使用genfstab 命令来生成相应的信息。

要挂载的设备(三种写法均支持)
挂载点


文件系统类型
挂载选项
转储许可(检查该文件系统是否能被备份指令dump作用,一般为0即可,我们一般自己去备份)
启动检查次序 是否用fsck检验扇区(只有根文件系统应该是1,其他的文件系统应该是2。如果是0,则不进行检查,xfs这种文件系统则应该是0,因为不适用此命令进行检查)

fuser:验证进程正在使用的文件和或者套接字

-v :显示相关的详细信息
-k :kill processes accessing the file
-m :specifies  a file on a mounted file system or a block device that is mounted.
-km MOUNT_POINT:终止正在访问此挂载点的所有进程
利用dd或者cat制作loopback光盘

loopback,使用软件来模拟实现硬件(本地回环设备)

dd: -convert and copy a file(以底层字节流为标准进行备份)

dd if=/etc/inittab of=/root/inittab
    if= :input file
    of= : output file
    bs=1 (默认即是Bytes,可以加单位K,M等)
    count=2(bs的个数)
    seek=N skip N obs-sized blocks at start of output(创建数据跳过多少空间,制造一个假文件)
    如:dd if=/dev/sda of=/mnt/usr/mbr.backup bs=512 count=1(备份mbr)

Linux语法笔记

原文:https://www.cnblogs.com/suxiaoman/p/12739961.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!