Linux-常用命令大汇总

日常命令

常用命令详释及参数

命令的基本格式

[root@localhost ~]# 命令 [选项] [参数]
- 选项是用于调整命令的功能
- 参数是命令的操作对象,如果省略参数,是因为有默认参数

如果有的地方打错了,删除是乱码,使用ctrl+退格

目录操作命令

ls [选项] [文件名或目录]  // 查看文件或目录信息
- -a : 显示所有文件
- -d : 显示目录,而不是显示目录下
- -h : 按人性化单位显示,非字节单位,k,m,g容量单位
- -l : 长格式显示,详细模式
- -i : 显示文件的i字点号
- --color=[默认 {when=always}always 总,never 不,auto 自动] 支持颜色输出
- -R : 列出所有子目录下的文件
- -r : 依相反次序排序
- -t : 根据最后的修改时间 (mtime)排序,默认是以文件名排序 cd [路径] // 变换目录 - . : 此层目录 - .. : 上一层目录 - - : 前一个工作目录 - ~ : [目前使用者身份]所在的家目录 - ~user : 代表 user 这个用户的家目录 单独的一个.表示source mkdir [选项] [目录名] //建立一个新的目录 - -p : 递归创建 rmdir:删除一个'空'的目录 pwd :显示目前的目录

文件操作命令

文件操作命令:
touch // 创建空文件,或者修改文件创建时间 
- -a : 之更改访问时间(atime)
- -m : 更改文件的修改时间记录(mtime)
- -c : 加入目标文件不存在,则不会建立新的文件
- -d<字符串> : 使用指定字符串表示时间而非当前时间
- -t<日期时间> : 使用MMDDhhmm格式的时间而非当前时间

stat [文件名]  // 查看文件信息
 
cat [文件名] // 查看文件内容 看小文件
- -n : 显示行号
- -A : 相当于-vET选项的整合,列出所有隐藏符号
- -v : 列出特殊字符
- -E : 列出结尾的回车符$
- -T : 把tap键用^I显示出来
- -b :列出行号,仅针对非空白行号显示,空白行不标行号; more [文件名] // 分屏显示文件内容 - 空格键 : 向下翻页 - b : 向上翻页 - 回车键 : 向下滚动一行 - '/' : 搜索指定的字符串 q : 退出 less [文件名] // 分行显示命令
空格键:向下翻动一页
​- Pagedown:向下翻动一页
​- Pageup: 向上翻动一页
​- /字符串: 向下搜寻[字符串]功能
​- ?字符串:向上搜寻[字符串]功能
​- n: 重复前一个搜寻(与/或?有关)
​- N: 反向重复前一个搜寻(与/或?有关)
​- q: 离开less这个程序 head [文件名] // 显示文件头 - -n [行数] : 从文件结尾开始,显示指定行数 tail [文件名] // 显示文件尾 - -n [行数] : 从文件结尾开始,显示指定行数 - -f : 监听文件新增内容 需用ctrl+c退出 ln [选项] 源文件一定要写绝对路径 目标文件 // 创建链接 - -s : 建立软连接,不加就创建硬链接 - -f : 强制,如果目标文件已经存在,则删除目标文件后在建立链接文件 硬链接和软链接的特点: 硬链接: - 源文件和硬链接文件有相同的Inode和Block = 修改任意一个文件,另一个都改变 - 删除任意一个文件,另一个都能使用 - 硬链接标记不清,很难确认硬链接文件位置,不建议使用 - 硬链接不能链接目录 - 硬链接不能跨分区 软链接: // 一定要写绝对路径 - 源文件和软链接文件有不同的Inode和Block - 两个文件任意修改一个,另一个都改变 - 删除软链接,源文件不受影响,删除源文件,软链接不能使用 - 软连接的权限是最大型权限lrwxrwxrwx. ,但是由于没有实际数据,最终访问时需要参考源文件权限 - 软链接可以链接目录 - 软链接可以跨分区 - 软链接特证明显,建议使用软链接

文件目录都操作命令

rm [文件或目录]   // 删除文件或文件夹
- -i : 默认,交互删除,删除之前会询问
- -r : 递归删除,可以删除目录
- -f : 强制删除

cp 源文件 路径/[文件名] // 复制文件
- -i : 询问,如果目标文件已经存在,则会询问是否覆盖
- -a : 相当于-dpr选线集合
- -d : 如果源文件位软链接(对硬链接无效),则复制出的目标文件也为软链接
- -p : 复制后目标文件保存源文件的属性(包括所有者,所属组,权限和时间)
- -r : 递归复制,用于复制目录
- -b : 若需覆盖文件,则覆盖前先行备份
- -f :如果目标文件或目录已经存在,则将其覆盖,并不作提示 mv [选项] 源文件 目标文件 // 剪切或重命名 - -f : 强制覆盖 - -i : 询问 - -v : 详细信息

基本的权限命令

chmod [选项] 权限模式[u[+-=]rwx,g[+-=]rwx,o[+-=]rwx 777 ] 文件名 // 修改文件权限

chown [选项] 所有者:所属组 文件或目录
- R : 递归设置权限,目录

chgrp 所属组 文件或目录

umask [0000]  // 临时修改
- 永久修改:vim /etc/profile 环境变量配置文件
- -S : 查看字母
- 新建文件最大权限666
- 新建目录最大权限777

帮助命令

man [选项] 命令 // 查询命令
- -f : 查看命令拥有那个级别的帮助
- 快捷键: 
  - 上箭头 -> 向上移动一行
  - 下箭头 -> 向下移动一行
  - PGUP -> 向上翻页
  - PGDN -> 向下翻页
  - g -> 移动到第一页
  - G -> 移动到最后一页
  - /字符串 -> 从当前页面向下搜索字符串
  - ?字符串 -> 从当前页面向上搜索字符串
  - n -> 当前搜索字符串时向下搜索下一个
  - N -> 当前搜索字符串时向上搜索上一个
  - q -> 退出

info 命令 // 查询命令 像一本书
- 快捷键: 
  - 上箭头 -> 向上移动一行
  - 下箭头 -> 向下移动一行
  - Tap -> 再有'*'符号节点间进行切换
  - 回车 -> 进入有'*'符号的子页面,查看详细帮助信息
  - u -> 进入上一层信息,回车进入下一层信息
  - n -> 进入下一小节信息
  - p -> 进入上一小节信息
  - ? -> 查看帮助
  - q -> 退出info信息 

help 命令  // 只能获取shell内置命令的帮助 不常用

--help // 这不是命令是选项,绝大部分命令加这个选项都会有帮助,常用命令有中文

搜索命令

whereis [命令] // 查看命令二进制命名,源文件和帮助文档 只能搜索系统命令

which [命令] // 可以查找二进制命名的同时,查找帮助文档的位置,有别名还可以找到别名 只能搜索系统命令

whatis [命令] // 这个命令是干嘛的

locate // 按照数据库搜索,速度快,数据库:/var/lib/mlocate/mlocate.db 只能搜文件名 updatedb 不会搜索/tmp/

find 搜索路径 [选项] 搜索内容
- -name : 按照文件名搜索
- -iname : 按照文件名搜索,不区分大小写
- -inum : 按照inode i节点号搜索
- -size [+|-] : 默认b 512字节,c 一字节,w 双字节,k 1024字节,M 1024k or 1048576字节,G 1024M 1073741824字节
- 按大小的 [+|-] :
  - +的意思是搜索比指定的大小要 大 的文件
  - -的意思是搜索比指定的大小要 小 的文件
- -atime [+|-] : 按照访问时间搜索
- -mtime [+|-] : 按照数据修改时间搜索
- -ctime [+|-] : 按照文件状态修改时间搜索
- 按时间的[+|-] : 
  - -5代表五天内
  - 5代表5-6的那一天
  - +5代表六天前
- -perm权限 : 查找刚好等于的权限 777
- -perm +权限 : 查找任意权限大于等于输入的数字
- -perm -权限 : 查找的权限必须比输入的数字大
- -uid 用户id : 按照用户ID查找所有者是指定ID的文件
- -gid 组id : 按照用户组ID查找所属组是指定ID的文件
- -user 用户名 : 按照用户名查找所有者是指定用户的文件
- -group 组名 : 按照组名查找所属组是指定用户组的文件
- -nouser : 查找没有所有者的文件 光盘u盘中的文件如果是windows复制的,在linux查看就是没有所有者的文件,手工源码包也可能没有所有者
- -type d : 查找目录
- -type f : 查找普通文件
- -type l : 查找软链接文件
- -a : and 逻辑与 find 搜索路径 [选项] 搜索内容 -a [选项] 搜索内容
- -o :or 逻辑或 find 搜索路径 [选项] 搜索内容 -o [选项] 搜索内容
- -not 'or' ! :not 逻辑非
- -exec : find 搜索路径 [选项] 搜索内容 -exec [命令] {} \;   把find命令的结果交给 -exec调用的命令2 来处理 {} 就代表find命令的查找结果
- -ok : 跟exec一样 ,但是会询问

grep [选项] “搜索内容” 文件名 //shell 编程 找文件内容
- -An : 列出符合条件的行,并列出后续的n行
- -Bn : 列出符合条件的行,并列出前面的n行
- -i :忽略大小写
- -n : 输出行号
- -v : 反向查找
- --color=auto : 搜索出的关键字用颜色显示

补充命令

命令1 | 命令2  // 管道符, 补充命令 文本流操作 
例子1 -> ll -a /etc/ | more //  显示/etc下的内容并用more查看
例子2 -> ll -a /etc/ | grep [文件名] // 查找/etc/下的 [文件名]
例子3 -> netstat -an | grep ESTABLTSHED | wc -l  // 统计当前登陆的人数
例子4 -> netstat -tuln | grep 80 // 查看当前80的使用状态
 
alias 别名='原命令'  // 查看和命名系统命令的别名  主要照顾管理员的使用习惯
永久生效别名: 
vi /~/.bashrc 
source .bashrc   不用重启也能直接使用环境变量 刷新  

别名的优先级:
1.用绝对路径或相对路径执行的命令
2.别名
3.执行bash的内部命令
4.执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令 

echo //打印到屏幕 
> // 覆盖echo 123 >> 1.txt  把123打印到1.txt里面
>> // 重定向 echo 123 >> 1.txt  把123打印到1.txt里面的最后一行

wc [选项] [文件名]     // 查看文件多少行,多少个字符,不加选项全统计
-c : 统计字节数
-w : 统计单词数
-m : 统计字符数
-l : 统计行数


whoami // 查看当前登陆的是谁
type [命令] // 查看命令时是内部还是外部命令

关机和重启命令

sync //数据同步 刷新文件系统缓冲区 ,常使用于关机或重启前

shutdown [选项] 时间:now,00:00 [警告信息]  // 尽量使用这个命令,关机重启前会保存
- -c : 取消已经执行的shutdown命令
- -h : 关机
- -r : 重启

reboot // 重启 也挺安全

helt // 立即关机 不建议

poweroff // 立即关机 不建议

init 0 // 不建议使用


常用网络命令

配置IP地址:
setup: 6.*用来设置网络等,7.*可以设置系统服务和配置且网络使用nmtui

详解点这里

vim /etc/sysconfig/network-scripts/ifcfg-eth*

route add default gw
route add [-nat | -host] [网段地址/主机地址] netmask [掩码] [gw 网关地址/dev 接口]
route del  [-nat | -host] [网段地址/主机地址] netmask [掩码] [gw 网关地址/dev 接口]

重启网络服务 
centos 6:
service network restart
centos 7:
systemctl restart network

ifconfig  // 查看网络信息

ping [选项] IP或域名
- -b : 后面加入广播地址,用于对整个网段进行探测 ping -b -c 2 192.168.1.255 //最后一定是255也就是广播地址
- -c 次数 : 用于指定ping的次数  
- -s 字节 : 指定探测包的大小

write user1 pts/1  // 向其他用户发送信息 使用ctrl+d快捷键保存发送的数据 // 查看登陆方式使用w命令

wall "想写的东西" // 向所有用户发送消息

mail // 发送和接受电子邮件
- -s : 指定邮件标题
例子:
-> mail user1 // 给 user1 发送邮件
-> mail -s "test mail " root < /文件路径/  // 将文件内容发送给root

netstat


netstat [选项]  // 安装命令 yum -y install net-snmp.x86_64 net-tools.x86_64
- -a : 列出所有网络状态,包括Socket程序
- -c 秒 : 指定每隔几秒刷新一次网络状态
- -n : 使用IP地址和端口号显示,不使用域名与服务名
- -p : 显示PID和程序名
- -t : 显示使用TCP协议端口的连接状况
- -u : 显示使用UDP协议端口的连接状况
- -l : 仅显示监听状态的连接
- -r : 显示路由表
- 显示内容:
  -> proto : 网络连接的协议
  -> recv-Q : 表示收到的数据
  -> Proto : 网络连接的协议,一般就是TCP协议或者UDP协议。
  -> Recv-Q : 表示接收到的数据,已经在本地的缓冲中,但是还没有被进程取走
  -> Send-Q : 表示从本机发送,对方还没有收到的数据,依然在本地的缓冲中,一般是不具备ACK标志的数据包。-> 
  -> Local address : 本机的I地址和端口号。
  -> Foreign address : 远程主机的IP地址和端口号。
  -> State : 状态。常见的状态主要有以下几种。 
  -> LISTEN : 监听状态,只有TCP协议需要监听,而UDP协议不需要监听。
  -> ESTABLISHED : 已经建立连接的状态。如果使用“-1”选项,则看不到已经建立连接的状态。
  -> SYN SENT : SYN发起包,就是主动发起连接的数据包。
  -> SYN RECV : 接收到主动连接的数据包。
  -> FIN WAITI1 : 正在中断的连接。
  -> FIN WAIT2 : 已经中断的连接,但是正在等待对方主机进行确认。
  -> TIME WAIT : 连接已经中断,但是套接字依然在网络中等待结束。
  -> CLOSED : 套接字没有被使用
常用例子:
netstat -tunlp | grep 端口号  // 查看这个端口号被谁占用,查看谁用了这个端口号

lsof

lsof -i  : 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具
每列的意义是:
  -> COMMAND:进程的名称或者进程开启的方式
  -> PID:进程id
  -> USER:进程所有者
  -> FD:文件描述符
  -> TYPE:协议类型
  -> DEVICE:端口号
  -> SIZE/OFF:偏移
  -> NODE:协议名
  -> NAME:节点名
常用命令:
 lsof -i:[端口号或者协议名]

虚拟机克隆或快照后uuid冲突

虚拟机克隆或快照后uuid冲突
删除mac地址行
vim /etc/sysconfig/network-script/ifcfg-eth*
删除mac地址和uuid绑定文件
rm -rf /etc/udev/rules.d/70-persistent-net.rules
重启
reboot 

系统痕迹命令

系统中有一些重要的痕迹日志文件,如
/var/log/wtmp
/var/run/utmp
/var/log/btmp
/var/log/lastlog
....
这些文件使用vim打开后是乱码,修改不了,只能通过对应的命令来查看

w   // 看当前登陆了多人 对应->/var/run/utmp
输出内容:
第一行:
00:00:00 {系统时间} up 1 day 00:00 {开机到现在多长时间} 2 users {当前登陆了两个用户}
load average : 0.00,0.00,0.00 {系统在之前一分钟,五分钟,十五分钟的平均负载,cpu有几个核心,最高负载就是几}
第二行:
USER : 当前登陆的用户
TTY : 登陆的终端
FROM : 登陆的IP地址,如果是本地终端,则是空
LOGIN@ : 登陆时间
IDLE : 用户闲置时间
JCPU : 所有的进程占用的CPU时间
WHAT : 用户正在进行的操作
终端请查看[终端名称]

who // 看当前登陆了多人 比w更简单 用户名 登陆终端 登陆时间和来源ip  查看的是/var/run/utmp日志

last  // 查看系统所有登陆过的用户信息,包括正在登陆的用户和之前登陆的用户,这个命令查看的是/var/log/wtmp日志 ,还有系统重启的信息记录
第一列 -> 用户名
第二列 -> 终端号
第三列 -> 来源ip地址
第四列 -> 登陆时间
第五列 -> 退出时间

lastlog // 查看所有用户最后一次登陆的时间 查看的是/var/log/lastlog文件

lastb  // 查看错误登陆的信息

进程命令

ps [选项]
-e显示所有进程,环境变量
-f全格式

-h不显示标题

-l长格式
-w宽输出

-a显示终端上地所有进程,包括其他用户地进程
-r只显示正在运行地进程

-x显示没有控制终端地进程
示例: 
ps -ef | grep java

表示查看所有进程里CMD是java的进程信息

ps -aux | grep java
-aux显示所有状态

通常用ps查看进程PID,用kill命令终止进程,如:

例如:kill -9 [PID]

top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。
htop与top很类似,但是htop是交互式的文本模式的进程查看器。它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装。

pstree [选项]
-a 显示该行程的完整指令及参数, 如果是被记忆体置换出去的行程则会加上括号
-c 如果有重覆的行程名, 则分开列出(预设值是会在前面加上 *)
-n按PID排列进程

特别表明在运行的进程
pstree -apnh //显示进程间的关系
同时显示用户名称
pstree -u //显示用户名称

vim常用快捷键及命令

vim是一个全屏幕文本编辑器,是vi编辑器的增强版  

如果打开文件名存在就打开文件,如果不存在则会创建

vi 文件名 -> 命令模式
命令模式 输入i,a,o -> 进入输入模式 -> esc 进入命令模式
命令模式 输入: -> 进入编辑模式 -> 回车执行命令或者esc退出到命令模式

输入模式:
- a : 在光标所在字符后插入
- A : 在光标所在的行尾插入
- i : 在光标所在字符前插入
- I : 在光标所在的行首插入
- o : 在光标下插入新行
- O : 在光标上插入新行
编辑模式:
- :w : 保存不退出
- : w 新文件名 : 把文件另存为新文件 
- :q : 退出不保存
- :wq : 保存退出
- ZZ : 保存退出
- :! : 强制
- :q! : 强制退出 不保存数据退出 所有用户可以执行
- :wq! : 强制保存退出 文件所有者或root在对编辑文件没有写权限的时候,强制写入数据
命令模式:
移动光标
左下上右方向键 移动光标
HJKL          移动光标    
移动到文件头和文件尾:
gg : 移动到文件头
G : 移动到文件尾
移动到行头行尾:
^ : 移动到行头
$ : 移动到行尾
移动到指定行:
:n : 移动到第n行 
删除或者剪切:
x : 删除单个字母
nx : 删除n个字母
删除整行或剪切
dd : 删除一行
ndd : 删除n行
:n1,n2d : 删除指定范围的行
dG : 删除从光标所在行到最下面
复制:
yy : 复制一行
nyy : 复制多行
粘贴:
p : 粘在光标行的下面
P(大) : 粘在光标行的上面
撤销:
u : 撤销一次
ctrl+r : 反撤销
替换:
r : 替换当前字符
R : 替换从当前光标开始替换,一直到esc结束

参数设置:
- :set number -> 显示行号 
- :ser nonumber -> 取消显示行号
- :syntax on -> 根据语法显示相关的颜色
- :syntax off -> 取消颜色高亮
- :set hlsearch -> 设置将查找的字符串高亮显示 默认就是这个
- :set nohlsearch -> 设置不将查找的字符串高亮显示 
- :set ruler -> 设置显示右下角的状态栏,模式是这个
- :set noruler -> 设置不显示右下角的状态栏
- :set showmode -> 显示左下角如 --INSTERT-- 之类的状态栏 默认是这个
- :set noshowmode -> 不显示左下角 状态栏
- :set list -> 设置显示隐藏字符(tap键用'^I'表示,回车符用'$'显示)
- :set nolist -> 设置不显示隐藏字符 默认是这个 win回车是^M$ 如果是脚本文件需要用dos2unix (dos to unix)
\ 反过来就是unix2dos (unix to dos)
- :set all -> 全部的设置参数

这些参数都是临时生效的,一旦关闭文件再打开,又需要重新输入,如果想要永久生效,需要手工建立vim的配置文件"~/.vimrc"把你需要的参数写入配置文件就可以永久生效了
vim .vimrc
:set number

查找
/查找内容 : 从光标所在向下找
?查找内容 : 从光标所在向上找
n : 下一个
N : 上一个

替换
:1,10s/old/new/g -> 替换1到10行所有的old为new
:%s/old/new/g -> 替换整个文件的old为new
例子
写注释 -> :1,10s/^/#/g   
取消注释 -> :1,10s/^#//g 
写c和php注释 -> :1,10s/^/\/\//g            # 转义符 \ 
取消c和php注释 -> :1,10s/^\/\///g

vim小技巧

vim卡死
习惯性按Ctrl+S之后卡住,什么都动不了,按Ctrl+Q即可恢复
Ctrl+S是暂停屏幕

导入其他文件内容
:r 文件名 : 把文件内容导入光标位置

执行系统命令
:!命令 : 在vim中执行系统命令

导入命令结果
:r !命令 : 在vim中执行徐通命令,并把命令结果导入光标所在行

设定快捷键
:map 快捷键 快捷键执行的命令 : 自定义快捷键
例子:
-> :map ^P I#<ESC> : 按"ctrl+p"时,在行首加入注释
-> :map ^B ^x : 按"ctrl+b"时,删除行首第一个字母(删除注释)
注意:^P 快捷键不能手工输入,需要执行ctrl+v+p来定义 ,同样是临时,永久还是.vimrc

字符替换
:ab 源字符 替换为字符 
例子:
:ab zyx  zyx@zyxweb.cn : 把所有的zyx改为zyx@zyxweb.cn,临时,永久.vimrc

多文件打开
vim -o 1.txt 2.txt : 小o会上下分屏打开文件
vim -O 1.txt 2.txt : 大O会左右分屏打开文件
在两个文件中切换 : ctrl+w按下后按上下左右键切换

压缩,解压及打包

zip [选项] 压缩包名 [源文件或源目录] // 压缩 windows最常用,linux也可以正确识别
- -r : 压缩目录 递归
unzip [选项] 压缩包名 // 解压缩 
- -d : 指定解压目录,如果不加-d则解压到当前目录

gzip [选项] 源文件 // linux常见 不能打包
- -c : 可以保留源文件,将压缩数据输出到标准输出中 gzip -c * > *.gz
- -d : 解压缩 或者用 gunzip *.gz
- -r : 压缩目录,但不是打包,是把目录中的文件单独压缩

bzip2 [选项] 源文件 // linux常见 不能压缩目录
- -d : 解压缩 或者用bunzip2 *.gz
- -k : 压缩时,保留源文件
- -v : 显示压缩的详细信息

tar [选项] [-f 压缩包名] 源文件或目录  // 打包命令
- -c : 打包
- -f : 指定压缩包的文件名,压缩包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名
- -v : 显示打包文件的过程
- -x : 解打包
- -t : 测试,也就是看包中有哪些文件
- -z : 压缩和解压缩".tar.gz"格式
- -j : 压缩和解压缩".tar.bz2"格式
- -C : 指定解压位置

tar常用:
打包-> tar -cvf 文件名.tar /文件货目录路径
解包-> tar -xvf 文件名.tar -C /文件货目录路径
gzip常用: 
压缩 -> tar -zcvf 文件名.tar.gz /文件或目录路径
解压 -> tar -zxvf 文件名.tar.gz [-C] /解压路径 [指定解压文件]
bzip2常用: 
压缩 -> tar -jcvf 文件名.tar.bz2 /文件或目录路径
解药 -> tar -jxvf 文件名.tar.bz2 [-C] /解压路径 [指定解压文件]

常用知识点

init级别
0 : 关机或停机
1 : 单用户模式,只root用户进行维护
2 : 多用户模式,不能使用NFS
3 : 完全多用户模式(标准的运行规则
4 : 安全模式
5 : 图形化
6 : 重启

目录:重要一级目录

/bin/ :存放系统命令目录,普通用户和root都可以执行,是/usr/bin/目录的软连接
/sbin/ :存放系统命令的目录,只有root可以执行,是/usr/sbin/的软连接
/usr/bin/ :存放系统命令目录,普通用户和root都可以执行
/usr/sbin/ :存放系统命令的目录,只有root可以执行
/boot/ :系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序[grub]
/dev/ :设备文件保存位置
/etc/ :配置文件保存位置,系统内所有采用默认安装方式[rpm安装]的服务配置文件全部保存在此目录,如用户信息,启动脚本,配置文件等
/home/: 普通用户的家目录,创建用户时默认的位置
/lib/ : 系统调用的函数库保存位置,是/usr/lib/的软连接
/lib64/ : 64位函数库保存位置,是/usr/lib64/的软连接
/lost+found/ : 当系统意外崩溃或机器意外关机,而产生的一些文件碎片放在这里,当系统启动的过程中fsck恐惧会检查这里,并修复已经损坏的文件系统,这个目录只在每个分区中出现
/media/ : 挂载目录,系统建议是用来挂载媒体设备的,软盘光盘
/misc/ : 挂载目录,系统建议用来挂载NFS服务的共享目录
/mnt/ : 挂载目录,早期linux只有这一个挂载目录,建议挂载额外的设备
/opt/ : 第三方安装的软件保存位置, 放置和安装其他软件的位置
/proc/ : 虚拟文件系统,该目录中的数据并不保存在硬盘上,而是直接保存在内存中,主要保存系统的内核,进程,外部设备状态和网络状态
/sys/ : 虚拟文件系统,跟proc差不多,主要保存与内核相关的信息
/root/ : root的宿主目录
/run/ : 系统运行时产生的数据,如ssid,pid等,/var/run/是此目录的软连接
/srv/ : 服务数据目录,一些系统服务启动之后,可以在这个目录中保存所需要的数据
/tmp/ : 临时目录,系统存放临时文件的目录,所有用户都可以访问和写入,建议此目录不保存重要文件,最好每次开机都清除

目录:重要二级目录

/usr/ : 系统软件资源目录,注意usr不是suer的缩写,而是[UNIX Software Resource]
/usr/lib/ : 应用程序调用的函数库保存位置
/usr/local/ : 手工安装的软件保存位置,一般建议源码包软件安装在这个位置
/usr/share/ : 应用程序的资源文件保存位置,如保住文档,说明文档和字体目录
/usr/src/ : 源码包保存位置
/usr/src/kernels/ : 内核源码保存位置
/var/ : 动态数据保存位置,主要保存缓存,日志以及软件运行所产生的文件
/var/www/html/ : RPM包安装的Apache的网页主目录
/var/lib/ : 程序运行中需要调用或改变的数据保存位置,如MySQL的数据库保存在/var/lib/mysql/中
/var/log/ : 系统日志保存位置
/var/run/ : 一些服务和程序运行后,他们的PID保存位置,是/run/目录的软连接
/var/spool/ : 防止队列数据的目录,就是排队等待其他程序使用的数据,比如邮件队列和打印队列
/var/spool/mail/ : 收到新邮件的保存位置
/var/spool/cron/ : 系统定时任务队列保存位置,系统的计划任务会保存在这里

权限位的含意

第1位代表文件类型
- - : 普通文件
- l : 软链接文件
- d : 目录文件
- b : 块设备文件
- c : 字符设备文件
- s : 套接字文件 socket 
- p : 管道符文件
第2-4位代表用户权限rwx
第5-7位代表组权限rwx
第8-10位代表其他人权限rwx

普通用户可以修改所有者是自己的文件的权限
普通用户不能修改文件的所有者(哪怕文件是属于这个普通用户的),只有超级用户才能修改所有者

通配符

// 匹配文件名 完全匹配
?:匹配一个任意字符
* : 匹配0个 或多个任意字符,也就是可以匹配任何内容
[] : 匹配中括号中任意一个字符,例[abc]代表一定匹配一个字符,或是a,或是b,或是c
[-] : 匹配中括号中任意一个字符,-代表一个范围.例如[a-z]代表匹配一个小写字母 [A-Za-z]代表任意字符
[^] : 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符

正则符

// 匹配字符串  包含匹配
? : 匹配前一个字符重复0次,或者1次   egrep
* : 匹配前一个字符重复0次,或者任意多次
[] : 匹配中括号中任意一个字符,例[abc]代表一定匹配一个字符,或是a,或是b,或是c
[-] : 匹配中括号中任意一个字符,-代表一个范围.例如[a-z]代表匹配一个小写字母 [A-Za-z]代表任意字符
[^] : 逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9]代表匹配一个不是数字的字符
^ : 匹配行首 限位符
$ : 匹配行尾 限位符

详细介绍 点这里 

修改提示符的样式颜色

[root@localhost ~]#
- [] : 提示符的分割符,没特殊意义
- root : 显示当期登陆的用户
- @ : 分隔符,没意义
- localhost : 当前系统的简写主机名
- ~ : 代表用户当前所在的目录
- # : 命令提示符,超级用户是# 普通用户是$


/etc/profile.d/env.sh文件下
PS1="[\e[1;34m][\u@\h \w]\$[\e[0m]"
which [文件名 ls] 查看文件来源
ldd [文件名绝对路径 /usr/bin/ls] 查看程序API库
file [文件]
lsof -i:[端口号] 查看端口被那个程序占用

常用软件

extundelete : 文件文件夹恢复数据,先装才能恢复,删了再装GG
yum install e2fsprogs e2fsprogs-libs e2fsprogs-devel

netstat : 查看网络状态, 7.5以上默认安装了 
yum -y install net-snmp.x86_64 net-tools.x86_64

快捷键

Tab键 命令或文件名补全
ctrl+A 把光标移动到命令行开头
ctrl+E 把光标移动到命令行结尾
ctrl+C 强制终止当前命令
ctrl+L 清屏,相当于clear命令
ctrl+U 删除或剪切光标之前的命令
ctrl+Y 粘贴ctrl+U剪切的内容

终端名称

终端类型 终端名称 切换终端方式
本地字符终端 tty1-6 ctrl+alt+f2-f7
本地图像终端 tty7 ctrl+alt+f1 需要安装启动图形终端
远程终端 pts/0-255

脚本语言Shell编程

创建 hello.sh文件:
vim hello.sh

hello.sh文件内容:
#!/bin/bash  #必须写!!!!
echo" hello world"  #可以直接使用命令

执行:
chmod 744 hello.sh  # 赋予执行权限
/绝对路径/hello.sh   # 使用绝对路径启动
./hello.sh          # 使用相对路径启动

RPM包(软件包安装)

只有两种软件包:
- 源码包 也叫编译安装
- 二进制包 在centos也叫rpm安装

编译安装:
优点
- 开源 有能力可以修改源码
- 可以自由选择所需的功能
- 软件是编译安装,所以更适合自己的系统,大概会提高5%
- 卸载方便
缺点
- 安装过程步骤比较多,尤其安装较大的软件集合(如lamp环境搭建),容易出现拼写错误
- 编译过程时间较长,安装比二进制安装时间长
- 安装过程中出现问题新手很难解决

二进制包:
分类:
- > DPKG包:由debian linux 所开发出来的包管理机制,主要应用在debian 和unbuntu
- > RPM包: 由red hat公司所开发的包管理系统,主要centos
RPM包优点:
-> 包管理简单,只通过几个命令就可以实现包的安装,升级,查询和卸载
-> 安装速度比源码包安装快的多
RPM包缺点:
-> 经过编译,不能看到源码
-> 功能选择不如源码包灵活
-> 依赖性

软件包选择建议:
源码包:如果服务是给大量客户端提供访问的,建议使用源码包,效率更高
RPM包:如果程序是给少量用户使用的,或者本地使用的,建议RPM包

查询RPM包依赖性网站:
http://www.rpmfind.net/

命名规则:
httpd-2.2.15-15.e16.centos.l.i686.rpm
httpd -> 软件包名
2.2.15 -> 软件版本
15 -> 软件发布的次数
el6 -> 软件发行商 el6是RedHat公司发布
i686 -> 适合的硬件平台  noarch : 没有平台限制
rpm -> rpm包的扩展名 
为啥Apache在linux叫httpd呢:Apache是程序名,httpd叫进程名

包全名 : 如果操作的是未安装软件包,则使用包全名,而且需要注意绝对路径
包名 : 如果操作的是已经安装的软件包,则使用包名即可,系统会生成RPM包的数据库(/var/lib/rpm/),而且可以在任意目录使用

RPM包手工命令安装

安装命令:
rpm -ivh 包全名
- i : install 安装
-v : 显示详细信息
-h : 打印#显示安装进度

/*
# rpm -ivh httpd-2.4.6-90.el7.centos.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:httpd-2.4.6-90.el7.centos        ################################# [100%]
*/
缺依赖就找依赖,缺函数去上面连接找"查询RPM包依赖性网站"然后再装包

启动:
systemctl start httpd
service httpd start
/etc/rc.d/init.d/httpd start   // 标准启动命令, 上面两个都是在/etc/rc.d/init.d/中直接启动 \
> 也有说/etc/init.d/httpd的,这是软链接 /etc/init.d -> rc.d/init.d

RPM包升卸查验证提

升级:
rpm -[UF]vh 包全名
-U : 升级安装,没装过,直接装,装的版本旧了就更新
-F : 升级安装,没装过就不装,必须有旧版本才能升级

卸载:
rpm -e 包名
--nodeps : 不检查依赖性
-e : 卸载    不推荐yum卸载 新手可能会导致系统文件丢失

查询:
rpm -q[ai] 包名   // 查询本机 ,只要是查询都带一个q
-q : 查询是否安装
-a : 全部全部已经安装 -qa *
-i  :  查询软件信息 -qi
-p : 查询没有安装的软件包 -qip 包'全'名(绝对路径)
-l   : 列出软件包中所有的文件列表和软件所安装的目录(list) -ql  * \   
      > 查询没有安装的软件包中的文件列表和打算安装的位置:rpm -qlp 包'全'名
-f : 查询系统文件属于那个软件包 -qf 系统文件名
-R :  查询软件包的依赖性, -qR \
      > 查询没有安装的包的依赖性
常用 : 
rpm -qa | grep httpd // 查询所有httpd的包

验证:
rpm -[参数] 包名 
-V : 校验指定RPM包中的文件
-Vf : 校验某个系统文件是否被修改 
-Va : 校验本机已经安装的所有软件包

数字证书:
/挂载后光盘绝对路径/RPM-GPG-KEY-CentOS-*  // 证书路径
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-*  // 添加证书
rpm -qa | grep gpg-pubkey  // 查询证书

包中文件提取:
cpio    // 原本是用来备份文件,但是实在太难用, 只用来提取RPM包
rpm2cpio 包全名  | cpio -idv .包中文件绝对路径   // 先复制到 . 也就是本地中,别忘了 . 

YUM-RPM包在线安装

yum源解析

yum源路径:
/etc/yum.repos.d/CentOS-Base.repo // 网络yum源
/etc/yum.repos.d/CentOS-Media.repo // 光盘yum源

文件内容:
- [base] : 容器名称,一定要放在[]
- name : 容器说明,可以自己随便写
- mirrorlist : 镜像站点, 这个可以注释掉
- baseurl : 我们yum源服务器的地址,默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的
- enabled : 此容器是否生效,如果不写或者携程enabled=1则表示此容器生效,携程enabled=0代表不生效
- gpgchaek : 如果为1则表示RPM数字证书生效,如果为0则表示RPM的数字证书不生效
- gpgkey : 数字证书的公钥文件保存位置,不用修改

搭建本地光盘yum源

第一步: 挂载,详情见 mount命令
第二部: 不使用CentOS-Base.repo,直接改名字 mv * *.bak
第三步: 修改media内文件:
- baseurl=file:///你光盘挂载路径 不用的行注释掉
enabled=1

yum命令

yum list // 查询yum源服务器上所有可安装的软件包列表
yum list 包名 // 查询单个软件包
yum search 关键字 // 使用关键字查询相关的软件包 可以搜索命令或文件在那个包里
yum info 包名 // 查询
yum -y install 包名 // 安装 ,无论安装还是未安装 都可以使用包名不必使用包全名
- y : 自动回答yes 
yum -y update 包名 // 升级,更新 不加包名会升级所有软件包甚至内核,
yum remove 包名 // 卸载, 不推荐使用yum 卸载 确定用yum卸载没问题再用,包依赖性很可怕

yum组管理命令

yum grouplist // 列出所有可用的软件组列表
yum groupinfo // 查询组里有哪些软件 6.3之前都不支持中文组包
yum groupinstall -y 软件组名 // 安装软件组
yum groupremove 软件组名 // 卸载软件组

源码包安装

应该选择哪种方式安装
如果软件包是给大量客户提供访问,建议使用源码包安装,如LAP环境搭建,因为源码包效率更高
如果软件包是给 Linux底层使用,或只给少量客户访问,建议使用rpm包安装,因为rpm包简单
源码包是从哪里来的?
rpm包是光盘中直接包含的,所以不需要用户单独下载。而源码包是通过官方网站下载的,如果需要使用,是需要单独下载的

rpm包默认
源码包自己制定的位置

80端口只有一个,启动两个会报错,而且会浪费资源
就算修改端口,如果服务是给大量客户端访问不建议更改端口,因为用户就找不到了
如果服务是给内部人员使用,建议更端口,因为更加安全(SSH 22)

安装过程

注意事项: 必须安装C GCC语言编译器 : yum -y install gcc
1. 下载源码包
2. 解压
3. 进入解压目录
4. 执行 ./configure 编译前准备
  这一步有三个作用
  - 1): 在安装之前需要检测系统环境是否符合安装要求
  - 2): 定义需要的功能选项
        若不知道内容可以执行./configure --help 
        安装路径使用./configure --prefix=安装路径
  - 3): 把系统环境的检测结果和定义好的功能选项写入Makefile文件,
        后续的编译和安装需要依赖这个文件的内容
5. make 编译
   make会调用gcc编译器,并读取Makefile 文件中的信息进行系统软件编译
   编译的目地就是把源码程序转变为能被Linux识别的可执行文件
   这些可执行文件保存在当前目录下
   编译过程较为还是,需要有足够的耐心
6. make clean  清空编译内容 (非必须步骤, 报错才需要使用)
7. make install 编译安装 
   这才是真正的安装过程,一般会写清楚程序的安装位置,如果忘记指定安装目录
   则可以把这个命令的执行过程保存下来,已被将来删除使用
启动方法:安装路径/bin/apachectl start

源码包报错:

1. 安装过程必须停止
2. 是否出现: no ,warning , error关键字

注意事项: 必须安装C GCC语言编译器 : yum -y install gcc

打补丁

diff 选项 绝对路径文件 绝对路径文件 > 补丁文件 // 比较两个文件的不同 并存到补丁文件
选项:
-a : 将任何文档当作文本文档处理
-b : 忽略空格造成的不同
-B : 忽略空白行造成的不同
-I : 忽略大小写造成的不同
-N : 当比较两个目录时,如果某个文件只在一个目录中,则另一个目录中视作空文件
-r : 当比较目录时,递归比较子目录
-u : 使用同一的输出格式

patch -pn < 补丁文件
-pn : n为数字, 代表按照补丁文件中的路径,指定跟新文件的位置

补丁文件很少见了,官方会有说明让你写p*

脚本安装包

一键安装脚本就是脚本安装包

用户

用户相关文件

1. /etc/passwd 用户信息文件  
root:x:0:0:root:/root:/bin/bash
第一列:用户名
第二列:密码位
第三列:用户ID ,  UID 0 超级用户 1-1000 系统用户 1001 -65535 普通用户UID
第四列:组ID  ,  GID 添加用户时,如果不指定用户所属初始组,那么会建立和用户名相同的组
第五列:用户说明
第六列:用户家目录 ~ 对系统用户无作用
第七列:登陆shell权限  /bin/bash 标准shell[登陆那个用户就有那个用户的权限] ,  /sbin/nologin 禁止登陆

如果把用户改为管理员权限把uid改为0  但是不建议


2. /etc/shadow
root:密码:17213:0:99999:7:::
第一列:用户名
第二列:加密后的密码 SHA512 加密 如果想让某个用户不能登录 在最前面加一个!
第三列:更新密码的时间,你在什么时候设置的密码 时间戳:1970年1月1号标准时间
       时间戳转日期:date -d "1970-01-01 15775 days"
       日期转时间戳:echo $(($(date --date="2013/03/11"+%s)/86400+1)) 
第四列:两次密码的修改间隔时间 默认0,在这个时间内不能让用户修改(和第三列比)
第五列:密码过期值(跟第三列比)
第六列:密码过期前提示日期(跟第五列比)
第七列:密码过期后的宽限时间(跟第五列比)没写是-1永远不失效,0是到期立即失效,10是到期十天后失效
第八列:密码失效时间 ,同样也要写时间戳,如果超过了失效时间,就算密码没有过期,
       用户也就失效无法使用,若到了失效时间,会在密码最前面加一个!
第九列:保留


3. /etc/group
root:x:0:root
第一列:组名
第二列:组密码位
第三列:GID
第四列:此组中支持的其他用户,也就是附加组是此组的用户

初始组:每个用户初始组只能有一个,初始组必须有一个,一般都是和用户名同名的组作为初始组,不要改初始组
附加组:每个用户可以属于多个附加组,要把用户加入组,都是加入附加组



4. 组密码文件:/etc/gshadow  
如果我给用户组设定了组管理员,并给该用户组设定了组密码,组密码就保存在这个文件中,组管理员就可以利用这个密码管理这个用户组


5. 用户的家目录:每新建一个用户默认会在/home/里面建立一个与用户名同名的家目录  ~

6. 用户的邮箱目录:这个邮箱在/var/spool/mail目录中,如zyx用户就是在/var/spool/mail/zyx中 

7. 用户模板目录: /etc/skel/   新建用户后,用户家目录会复制/etc/skel/中的内容

添加用户

手工添加用户:// 其实创建用户和删除用户就是往这几个文件里写入了删除了
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
/home/user1
/var/spool/mail/user1

useradd [-选项] user1 // 创建用户  一定要创建密码,不然无法登录 但例外mysql就是创建用户没密码
-s shell: /bin/bash or /sbin/nologin
-G 组名:  指定附加组,把用户加入组,使用附加组
-u 550 : 指定UID 指定后,之后默认变为从指定的UID开始
-d 目录:  手工指定家目录,目录不需要提前建立
-g 组名: 指定初始组,不要手动添加,容易乱
-c 说明:  添加说明 有空格就得用""包括起来
-M : 不建立用户主目录
默认值: useradd 添加用户时参考的默认值文件主要有两个,分别是:

- /etc/default/useradd
GROUP=100
// 这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是GID为100的这个组,未启用
HOME=/home
// 这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下
INACTIVE=-1
// 这个选项就是密码过期后的宽限天数,也就是/etc/shadow文件的"第七列",只对新用户生效
EXPIRE=
// 密码失效时间  也就是/etc/shadow文件的"第八列",只对新用户生效
SHELL=/bin/bash
// 定义用户默认shell
CREATE_MAIL_SPOOL=yes
// 这个选项定义是否给新建用户建立邮箱,默认是创建,也就是所有的新建用户系统都会新建一个邮箱

- /etc/login.defs
MALL_DIR  /var/spool/mail
// 指定新建用户的默认邮箱位置
PASS_MAX_DAYS  99999
// 密码有效期 /etc/shadow文件"第五列" 多少天后必须修改密码
PASS_MIN_DAYS  0
// 两次密码的修改间隔时间,也就是/etc/shadow文件的"第四列" 第一次修改后,多长时间才能再次修改
PASS_MIN_LEN  5
// 密码最小长度,默认不小于5位,但是现在用户登录验证被PAM模块取代,这个选项"并不生效"
PASS_WARN_AGE  7
// 密码修改到期前的警告天数,也就是/etc/shadow文件的"第六列" 
UID_MIN  500 
UID_MAX  60000
GID_MIN  500
GID_MAX  60000
// 用户和组ID最大和最小
CREATE_HOME  yes
// 指定建立用户时是否自动建立用户的家目录,默认是建立
UMASK  077
// 建立的用户家目录的默认权限,因为umask值是077,所以新建的家目录权限是700
USERGROUPS_ENAB  yes
// 使用命令userdel删除用户时,是否删除用户的初始组,默认删除
ENCRYPE_METHOD   SHA512
// 指定linux用户的密码是用SHA512散列模式加密,以前用MD5或者DES加密

创建密码

passwd [-选项] user1  // 创建用户密码  root可以创建简易密码
-l :  暂时锁定用户仅root用户可用
-u : 解锁用户,仅root用户可用
--stdin : 将通过管道符输出的数据左为用户的密码,主要在批量添加用户使用

普通用户修改自己的密码只需要使用 passwd 

echo "123" |passwd --stdin user1  // 使用字符串作为密码 批量添加使用 缺点:history可以看到 加-c清除

chage -d 0 user1 // 把密码修改日期归0 (shadow第三字段) 着用用户一登陆就要修改密码

修改用户信息

usermod [-选项] 用户名  // 修改已经添加的用户信息
-s shell: /bin/bash or /sbin/nologin
-G 组名:  指定附加组,把用户加入组,使用附加组
         最常用   usermod -G 组名 用户名
-u 550 : 指定UID 指定后,之后默认变为从指定的UID开始
-d 目录:  手工指定家目录,目录不需要提前建立
-g 组名: 指定初始组,不要手动添加,容易乱
 passwd第四列
-c 说明:  添加说明 有空格就得用""包括起来 passwd第五列
-e 日期:  修改用户的失效日期,格式为"yyyy-mm-dd"也就是shadow第八列
-l 改名:  新名 旧名   不建议用
-L 锁定:  锁定用户
-U 解锁:  解锁用户

删除用户与切换用户身份

userdel [-r]  用户民
-r : 在删除用户的同时删除用户的家目录

su [-选项] [用户名]
-- : 选项只带一个" - " 代表连带用户的环境变量一起切换
-c : 仅执行一次命令,而不切换用户身份
// 不带用户名默认是root

添删组,添附属组

添加用户组
groupadd  [-选项] testgroup
-g  GID : 指定用户组id

删除用户组
groupdel 组名

添加附属组:
gpasswd [-选项] 组名
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
 注意与usermod的区别:"gpasswd -a 用户名 组名 ",用户名和组名和usermod是反过来的

改变有效组

newgrp 用户组 
// 用处不大 用来修改用户创建文件时rwxrwxrwx中的第二个所属组,想使用这个命令,这个用户必须在这两个组里

权限划分

先分身份,在指定权限

权限管理

ACL权限

用于解决用户对文件身份不足的权限,跳出所有者所属组和其他人,额外附加权限

开启ACL,默认是开启
dumpe2fs -h /dev/你的根分区挂载文件
Default mount options: user_xattr cal  // 有这个证明开启了

mount -o remount,acl /
// 重新挂载根分区,并挂载加入acl权限  临时生效

vi /etc/fstab
UUID=硬盘id号 / ext4 defaults,cal 1 1
mount -o remount /   [or  重启系统]
// 永久生效


基本命令:
getfacl 文件名 // 查询文件的acl权限

setfacl [-选项] 文件名 // 设定acl权限
- m : 设定 acl权限 
        -> u:用户名:权限(7/rwx)  // 实例: setfacl -m u:user1:5 /www/ 给user1用户www目录5权限
        -> g:组名:权限 
        -> -R 递归赋予acl权限,放最后,只用用于目录 
              实例:setfacl -m u:user1:5 -R /www/ 给user1用户www目录递归5权限
              递归命令之对之前存在的文件生效,如果想对以后的文件生效需要用默认
        -> d: 默认权限,加在最前面 
              实例: setfacl -m d:u:user1:5 -R /www/ 给user1 用户www目录递归且以后的文件也给5权限 ! 主要用这个
        -> m: 设置最大有效权限mask,放在最前面
             实例: setfacl -m m:rx 文件名 // 也就是acl最大权限为rx 不太好用
- b  : 删除文件所有的acl权限
         实例:setfacl -b  /www/
- x  : 用户  : 删除单个用户的acl权限
         实例:setfacl -x u:user1  /www/
 
一旦递归之后不可避免的出现权限溢出,执行权限对于目录来说是必要的,但是对于文件来说是最大权限
所以只有基本权限解决不了在用acl权限

sudo授权

给普通用户赋予部分管理员权限
比如在/sbin/和/usr/sbin/下的命令只有root能用
赋予的权限越详细,普通用户得到的权限越小
赋予的权限越简单,普通用户得到的权限越大
授权要尽量细化到选项和参数,

root添加权限:
#visudo 
root ALL=(ALL) ALL
// 用户名 被管理主机的地址=(可使用的身份)  授权命令(绝对路径)
'#' %wheel ALL=(ALL) ALL // 因为 这个是被注释的命令'#'会让这一行变灰
// %组名  被管理主机的地址=(可使用的身份)  授权命令(绝对路径)
- 第一列:用户名/%组名: 代表root给那个用户或用户组赋予命令
- 第二列:用户可以用指定的命令管理制定IP地址的服务器
                如果写ALL,代表可以管理任何主机
                如果写固定ip,代表用户可以管理指定的服务器
- 第三列:把这个用户切换为什么身份,ALL代表任意身份,这个字段可以省略
- 第四列:授权命令,把什么命令授权给普通用户,写命令绝对路径,可以使用whereis 查询
                别用默认的all,那就成root了,危险

实例1:
user1 ALL= /sbin/shutdown -r now
// 第三列没输入, 是个空格 user1只能使用现在重启功能 

实例2:
需要普通用户
可以使用apache管理脚本,可以修改apache配置文件,可以更新网页内容

可以使用apache管理脚本
假设apache管理脚本程序为/etc/rc.d/init.d/httpd
写入命令:  user1 ALL=/etc/rc.d/init.d/httpd reload, \     
                   /etc/rc.d/init.d/httpd configtest
// 注意添加多个命令要加" , " 后面要跟个 空格 , \的意思是下一行
// reload意思是重新加载,restart的意思是关闭服务在开启,reload更温和

可以修改apache配置文件
user1 ALL=/usr/bin/vim /etc/httpd/conf/httpd.conf
// /usr/bin/vim注意这个命令,很危险,这会让普通用户使用root下的vim,也就是所有文件都可以修改

可以更新网页内容
假设网页存放目录为/var/www/html , 则只需要授权user1对此目录具有写权限或者更改所有者为user1

其他常用命令:
user1 ALL=/usr/sbin/useradd    
// 赋予添加用户的权限
user1 ALL=/usr/bin/passwd       
// 赋予改密码 ,这样很危险,能改root密码
user1 ALL=/usr/bin/passwd [A-Za-z]*,   !/usr/bin/passwd "",   !/usr/bin/passwd root
// 赋予改密码权限,取消对root的密码修改,不能加空,不能加root, 按顺序来



普通用户使用sudo
$ sudo [-选项] [绝对路径命令 ]
-l  : 查询可以使用的管理员命令

文件特殊权限

SetUID和SetGID不推荐设置

SetUID

ll  /usr/bin/passwd
// 可以看到-rwsr-xr-x. 所属用户中原本的x变为了s就是设置了SetUID
// 目的就是未来普通用户能修改自己的密码,也就是/etc/shadow

只有可以执行的二进制程序才能设定SUID权限(只要是执行文件都可以,非执行文件添加后会出现大写S,报错s=S+x,S=S)
命令执行者要对该程序拥有X权限
命令执行者在执行该程序时获得该程序文件属主身份(在执行程序的过程中灵魂附体为文件的属主)
SetUID权限只在该程序执行过程中有效,也就是说身份改变旨在程序执行过程中有效
给系统自带的命令suid一般没有风险,但是给自己写的脚本这个权限就很危险
使用数字赋予时不要填7

添加方法:
chmod u+s 文件名
数字方法:
chmod 4744 文件名


危险的SetUID
chmod u+s /usr/bin/vim   千万别这么干!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 这就是所有用vim的时候都会切换为root
SetUID不要自己写,自带的就很好 

检测SetUID的脚本:
学了shell脚本来写(2021.1.13)

SetGID

即可以针对执行文件,可以针对目录

在针对文件时,suid会让灵魂变成属主,sgid会让灵魂变成属组
只有可以执行的二进制程序才能设定SGID权限(只要是执行文件都可以,非执行文件添加后会出现大写S,报错s=S+x,S=S)
命令执行者要对该程序拥有X权限
命令执行者在执行该程序时获得该程序文件属组身份
SetGID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
如locate命令:
/usr/bin/locate  //   -rwx--s--x.   root slocate
/var/lib/mlocate/mlocate.db  //  -rw-r-----.  root slocate
用户虽然没有数据库的其他人读取权限,但是在执行localte命令时,普通用户灵魂组换成了slocate,也就有了r权限


针对目录的作用:
目录没有太大的风险,也没有太大的作用,还需要777权限
普通用户必须对此目录拥有rx权限,才能进入目录
普通用户在此目录中的有效组会变成此目录的属组
若普通用户对此目录拥有w权限时,新建的文件的默认属组时这个目录的属组
例子帮助理解: '#'指root用户  '$' 指普通用户
'#' mkdir /tmp/test  // 因为tmp目录是drwxrwxrwx. root root
'#' chmod 777 /tmp/test  //   test drwxrwxrwx. root root
user1'$' touch /tmp/test/1.txt  //   1.txt -rw-rw-r--. user1 user1
'#'chmod g+s /tmp/test/  // 加入sgid变为 test drwxrw"s"rwx. root root 
user1'$' touch /tmp/test/2.txt  //   1.txt -rw-rw-r--. user1 root
// 新建的文件属组变成了文件夹的属组,就这个功能

添加方法:
chmod g+s 文件/目录名
数字方法:
chmod 2744 文件/目录名

Sticky BIT

sticky bit 粘着位
只能针对目录,只对目录有效 ,缺点与sgid对目录操作一样,需要用777权限
普通用户对该目录拥有wx权限
如果没有sbit,普通用户拥有w权限后,可以删除此目录下所有文件,包括其他用户建立的文件,一旦赋予了sbit,除了root可以删除所有文件,普通用户就算拥有w权限也只能删除自己建立的文件,但是不能删除其他用户建立的文件

举例:
ll -d /tmp  // drwxrwxrwt.

添加方法:
chmod o+t 目录名
数字方法:
chmod 1744 目录名

chattr权限

不可改变位权限
能限制root用户,但只是假象,root可以删除限制root权限

chattr [+-=] [选项] 文件或目录名
-> + : 增加权限
-> - : 删除权限
-> + : 等于权限
-> i : 锁定 如果对文件设置i属性,那么不允许对文件进行删除,改名,也不能添加和修改数据;
      如果对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件
      白话文:对文件,锁定了嘛也干不了,对目录,只对目录和目录中的文件名锁定,文件里面的内容不管
      ps: 如果锁定目录之后,临时文件也不能建立,所以修改的时候记得保存
-> a : 追加 如果对文件设置a属性,那么只能在文件中增加数据,但是不能个删除也不能修改数据;
      如果对目录设置a属性,那么只能建立文件和修改目录下文件的数据,不能删除
      白话文:对文件,只能加内容,不能删不能改,对目录能建文件,能修改文件里面内容,不能删,不能改名
      ps:不能用vi写入,用echo 要写入的文本 >> 1.txt
-> e : Linux中绝大多数的文件都默认拥有e属性,表示该文件是使用ext文件系统进行存储,且不能使用chattr -e取消e属性

查看文件系统属性
lsattr [-选项] 文件名
->  -a : 显示所有文件和目录
->  -d : 若目标是目录,仅列出目录本身的属性,而不是子文件的

文件系统管理

磁盘的大小:磁头数*柱面数*扇区数*每个扇区的大小

Linux文件系统的特性

super block超级块:
记录整个文件系统的信息,播过block与inode的总量,已经使用的inode和block的数量,未使用的inode和block的数量,block与inode的大小,文件系统的挂在时间,最近一次的写入时间,最近一次的磁盘检验时间等
查看方法: dumpe2fs -h /dev/[分区]  // 不加-h 可以看分成了多少块组

data block 数据块也称block : 用来实际保存数据的,block的大小(1KB,2KB,4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化,每个block只能保存一个文件的数据,要是文件数据小于一个block块,那么这个blok的剩余空间不能被其他文件使用,如果文件数据大于一个block块,则会占用多个block块,  windows中的磁盘整理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读写速度

inode i节点: 用来记录文件的权限(rwx),文件的所有者和所属组,文件的大小,文件的状态改变时间(ctime) 文件的最近一次读取时间(atime),文件的最后一次修改时间(mtime),文件的数据真正保存的block编号,每个文件需要占用一个inode

文件系统

centos 6.*:
ext4 -> 向下兼容ext3,最大1EB的文件系统和16TB的文件,无限数量子目录,extents连续数据块概念,多块分配,延迟分配,持久预分配,快速FSCK,日志校验,无日志模式,在线碎片整理,inode增强,默认启用barrier等
centos 7.*:
xfs+lvm -> 高性能的日志型文件系统,能过在断电以及操作系统崩溃的情况下保证文件系统数据的一致性,他是一个64位的文件系统,xfs对于大文件的读写性能更好

swap:
swap是linxu中用于交换分区的文件系统(类似于windows中的虚拟内存)当内存不够用时,使用交换分区暂时替代内存,一般大小位内存的两倍,但是不要超过2gb,他是linux的必需分区

NFS:
是网络文件系统(Netwok File System)的缩写,是用来实现不同主机之间文件共享的一种网络服务,本地主机可以通过挂载的方式使用远程共享的资源

iso9660:
光盘的标准文件系统,linux想使用光盘,必须支持iso9660系统

fat:
win下的fat16系统,在linux中识别为fat

vfat :
win下的fat32系统,最大32g分区和4g文件

NTFS:
win下的ntfs文件系统,不过linux默认是不能识别ntfs文件系统的,如果需要识别,需要
 
ufs :
Sun公式的操作系统Solaris和SunOS所采用文件系统

proc:
Linux中基于内存的虚拟系统,用阿里管理内存存储目录/proc

sysfs :
和proc一样,也是基于内存的虚拟文件系统,用来管理内存存储目录/sysfs

tmpfs:
也是一种基于内存的虚拟文件系统,不过也可以使用swap交换分区

常用硬盘管理命令

df -hT   // 查看分区空间
-a : 显示特殊文件系统,特殊文件系统几乎都是保存在内存中的,/如/proc,因为是挂载在内存中,所以占用量为0
-h : 单位不再只用KB,而是换算成习惯单位
-T : 多出来文件系统类型一列

du [-选项] [目录或文件名]   // 查看目录文件空间
-a : 显示每个子文件的磁盘占用量,默认之统计子目录的磁盘占用量
-h : 使用习惯单位显示磁盘总量
-s : 统计占用量,而不列出子目录和子文件的占用量
du与df的区别: 
du使用于统计文件大小的,统计的文件大小是准确的;
df是用于统计空间大小的,统计的剩余空间是准确,因为临时文件没有删除或删除的文件没有释放,重启就好
lsof | grep deleted 查看被删除的文件,然后一个进程一个进程的手工kill也是可以的,不推荐手工,写脚本

fsck  // 文件系统修复
fsck -y /dev/shb1   // 自动修复 开机会自动运行

dump2fs // 显示 磁盘状态
dump2fs /dev/分区
-h : 只看超级快信息,只看简洁信息

stat 文件名  // 查看文件的详细时间

file 文件名  // 判断文件类型

type 命令 // 查看命令

fdisk手工分区

fdisk -l  // 查看所有分区
// 使用这个软件会分成 MBR 分区格式 单分区<=2T可以使用
fdisk /dev/sdb   // 分区
-> m : 获取帮助
-> n : 新建分区
-> p : 显示分区列表
-> q : 不保存退出
-> d : 删除一个分区
-> l : 显示已知的文件系统类型,82为linux swap分区,83为linux分区
-> v : 验证分区表
-> w : 保存退出
-> t : 改变一个分区的系统ID
-> a : 设置可引导标记
-> b : 编辑bsd磁盘标签
-> c : 设置DOS操作系统兼容标记
-> o : 建立空白DOS分区表
-> s : 新建空白SUN磁盘标签
-> u : 改变显示记录单位
-> x : 附加功能(仅专家)

n 新建分区:
e extended  // 扩展分区
l  logical(5-over) 逻辑分区  
p primary partition(1-4)  // 主分区 按顺序来
设置分区大小时,如果不加任何单位,默认按柱面来分
常用顺序:
n --> p主分 --> 1分区号 --> 1起始柱面 --> 分区大小+*G --> w保存退出
n --> e扩展 --> 2分区号 --> 默认 --> 最大,全部给扩展 --> w保存退出
n --> l逻辑 -->不用指定分区号 --> 默认 -> +*G --> w保存退出

gdisk手工分区

gdisk跟fdisk差不多
// 使用这个软件会分成 GPT 分区格式 支持单分区>=2T gdisk /dev/sd* [ b ]:将GPT数据备份到一个文件; [ c ]:更改分区名称; [ d ]:删除一个分区; [ l ]:列出已识别分区的类型。如:8300--Linux filesystem、8200--Linux swap、8e00--Linux LVM; [ i ]:显示分区详细信息; [ n ]:创建一个新的分区; [ o ]:创建一个新的空包的GPT分区表; [ p ]:显示当前磁盘的分区表; [ q ]:退出gdisk程序,不保存任何修改; [ s ]:排序; [ t ]:改变分区的类型; [ v ]:验证磁盘分区表; [ w ]:将分区表保存并退出; [ ? ]:获取帮助信息。

mkfs格式化

mkfs -t ext4 /dev/sd**

mkfs.格式 /dev/sd**
centos7中拥有的格式: mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
更高级: mke2fs [选项] 分区设备文件名 -t : 文件系统 -b 字节 : 指定block块的大小 -i 字节 : 指定"字节/inode"的比列,也就是多少个字节分配一个inode -j : 建立带有ext3 日志功能的文件系统 -L 卷标名 : 给文件系统设置卷标名,就不使用e2label 命令设置了

parted 命令分区

两种分区表

两种常见的分区表:
MBR分区表:
支持最大分区是2TB;最多支持4个主分区,或三个主分区1个扩展分区

GPT分区表:
支持最大18EB(1EB=1024PB=1024*1024TB);最多支持128个分区,其中1个系统保留分区,127个用户自定义分区
parted命令有个小问题:
命令自身分区的时候只能格式化成ext2文件兄系统,不支持ext3文件系统,那就更不支持ext4了,(截至至centos6.8还是这样)不过问题不大,可以先用这个命令分区在使用mkfs进行格式化

把/etc/fstab文件中和原有分区的内容删除掉,才能重新启动,要不系统启动会报错
parted /dev/sd*
help : 帮助
print : 打印列表  msdos分区表类型就是MBR分区
mklabel gpt : 修改为gpt格式的分区表,如果想修改为MBR就填msdos,下次重启生效
mkpart : 创建分区
mkfs : 这是parted的交互命令的mkfs 格式化
quit : 退出

调整分区大小
先卸载分区,在调整分区大小
需要先调整为ext2...... 好像没用阿
resize

swap分区手工扩容

free -h
查看内存容量以及swap分区

fdisk /dev/sd*
t->选择分区->82

格式化
mkswap /dev/sd**

挂载swap
swapon /dev/sd**  // 暂时挂载

[vi/vim] /etc/fstab
/dev/sd**              swap            swap          defaults         0        0

linux 分区挂载

分区小知识

设备名:
 - IDE:
   /dev/hda1  第一个硬盘的第一个主分区 a代表第一个硬盘,1代表第一个分区,以此类推
 - SATA,SCSI,USB等:
   /dev/sda1  第一个硬盘的第一个主分区 a代表第一个硬盘,1代表第一个分区,以此类推

挂载点:
[使用已经存在的空目录作为挂载点][所有的空目录,包括新建目录都可以左为挂载点,但是/bin/,/lib/,/etc/除外

必须分区:
/ [根分区]
swap分区 [交换分区]
 - 真实内存小于4G,swap分区大小为内存的两倍
 - 真实内存大于4G,swap分区大小和内存一致
/boot [启动分区,1GB]

常用分区:
/home [用于文件服务器]
/www  [用于Web服务器]

挂载命令

查询分区状况
lsblk

光盘挂载:
mount -l // 查询系统中已经挂载的设备,-l会显示卷标名称
// CentOS5.*以前的系统,光盘设备文件名是/dev/hdc,CentOS6.*以后的系统,光盘设备文件名是/dev/sr0
mount -t iso9660 /dev/sr0 /mnt/cdrom/   // -t ISO9660 可以不写会有默认 挂载光盘到/mnt/cdrom/

linux 必须卸载才能拿出光盘:
umount /dev/sr0 或者 umount /mnt/cdrom // 因为设备文件名和挂载点已经连接到一起,卸载哪一个都可以


U盘挂载:
fdisk -l // 查询硬盘 U盘会和硬盘共用设备文件名,所以U盘的设备文件名不是固定的,需要手工查询
mount -t vfat /dev/sdb1 /mnt/usb/  // 因为是windows分区,所以是vfat文件系统格式
mount -t vfat -o iocharset=utf8 /dev/sdb1/mnt/usb/
// Linux正常显示中文需要两个条件:安装了中文编码和中文字体,操作终端需要支持中文显示(纯字符不支持中文编码)
umount /dev/sdb1 或者 umount /mnt/usb/ // 因为设备文件名和挂载点已经连接到一起,卸载哪一个都可以

mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] /dev/设备文件名 /挂载点
- -a : 自动 根据配置文件/etc/fstab的内容,自动挂载 光盘和u盘不建议这样直接自动挂载 检测
- -l : 查询系统中已经挂载的设备,-l会显示卷标名称
- -o : 
  -> defaults : 定义默认值 相当于rw,suid,dev,exec,auto,nouser,async这七个  最常用,尽量不改
  -> rw/ro : 读写/只读 文件系统挂载时,是否具有读写权限,默认时rw读写
  -> suid/nosuid : 具有/不具有 SUID权限,设定文件系统是否具有SUID和SGID权限,默认SUID具有
  -> exec/noexec : 执行/不执行 ,设定是否允许在文件系统中执行可执行文件,默认exec允许 
  -> auto/noauto : 自动/手动 mount -a执行时,是否会自动安装/etc/fstab文件内容,默认auto自动
  -> user/nouser : 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂在,默认nouser不允许,只有root可以挂载
  -> async/syne : 异步/同步 默认async异步
  -> atime/noatime : 更新访问时间/不更新访问时间,访问分区文件时,是否更新文件的访问时间,默认atime更新
  -> remount : 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限
  -> usrquota : 写入代表文件系统支持用户磁盘配额,默认不支持
  -> grpquota : 写入代表文件系统支持组磁盘配额,默认不支持

卸载分区:
umount /dev/sd**

新盘挂载到WWW

// 使用sdb作为例子 挂载到/www
mkdir /www
fdisk 
n -> p -> w
mkfs.ext4 /dev/sdb1
vi /etc/fstab
// 加一行
/dev/sdb1 /www ext4 defaults 0 0
mount -a

 

自动挂载

[vi/vim] /etc/fstab

/dev/sdb1或者uuid          /disk1            ext3         defaults         1        2
第一列 : 设备文件名 或uuid 推荐使用uuid  查看uuid方法: 
       dumpe2fs /dev/分区名
       ls -l /dev/disk/by-uuid
第二列 : 挂载点
第三列 : 文件系统
第四列 : 挂载选项
第五列 : 默认1 是否可以被备份 0 不备份 1 每天备份  2 不定期备份
第六列 : 根1其他2 是否可以检测磁盘fsck  0 不检测 1 启动时检测 2 启动后检测

/etc/fstab 文件出错修复:
必须拿到本机,或者底层网络连接,对于云计算平台有一个救援性连接
直接 vim /etc/fstab是不行的 因为挂载错误,现在整个根分区都是只读
mount -o remount,rw /
重新挂载为读写权限

 

挂载NTFS分区

就算挂载NTFS也是只读的

linux驱动加载顺序:
- 驱动直接放入系统内核中,这种驱动主要是系统驱动加载必须的驱动,数量较少
- 驱动以模块的形式放入硬盘,大多数驱动都以这种方式保存,保存位置在/lib/modules/内核版本/kernel/中
- 驱动可以被Linux识别,但是系统认为这种驱动一般不常用,默认不加载,如果需要加载这种驱动,需要重新编译内核,而NTFS文件系统的驱动就属于这种情况
- 硬件不能被Linux内核识别,需要手工安装驱动.当然前提是厂商提供了该硬件针对于Linux的驱动,否则就需要自己开发?

安装插件:
tar -zxvf ntfs-3g_ntfsprogs-版本号.tgz #解压
cd ntfs-3g_ntfsprogs-版本号.tgz # 进入解压后的文件夹
./configure # 编译器准备,没有指定安装目录,安装到默认位置种
make install # 编译安装
然后就可以使用了:
mount -t ntfs-3g 分区设备名 挂载点

高级文件系统管理

磁盘配额

限制用户和用户组可以使用的空间大小文件个数
内核必须支持磁盘配额
查看方法:
grep CONFIG_QUOTA /boot/config-[tab补全]

查看是否安装了rpm包 linux默认装
rpm -qa | grep quota 

概念:
1.用户配额和组配额
2.磁盘容量限制和文件个数限制
3.软限制和硬限制 软限制警告 硬限制是真正的限制
4.宽限时间  占用在软限制和硬限制之间,多长时间后费升级为硬限制

在分区上开启磁盘配额功能
mount -o remount,usrquota,grpquota /disk // 临时
vi /etc/fstab 里面的defaults,usrquota,grpquota  // 永久
// 修改配置文件如果想要生效,必须奥重启系统,否则也需要把分区重新挂载一遍

建立磁盘配额配置文件
必须要关闭SELinux 否则会报错
getenforce  查看SELinux 状态
enforcing 已强制开启

setenforce 0 临时关闭SELinux 1就是开
Permissive 宽容,会报警,不会管

vi /etc/selinux/config
SELINUX=disabled   永久关闭 需要重启

quotacheck [选项] [分区名] 
quotacheck -avu  常用  
-a : 扫描/etc/mtab文件中所有启用磁盘配额功能的分区,如果加入此参数,命令后面就不用加入分区名了
-c : 不管原有的配置文件,重新扫描并建立新的配置文件
-u : 建立用户配额的配置文件,也就是生成aquota.user文件
-g : 建立组配额的配置文件,会生成aquota.group文件
-v : 显示扫描过程
-m : 强制以写入的方式扫描文件系统,一般扫描根分区时使用,和-M类似
-f : 强制扫描文件系统,并写入新的配置文件,一般扫描新添加的硬盘分区使用

设置用户和组的配额限制
edquota [选项] [用户名或组名]
# edquota 命令进入后,就是标准的vi操作方法 不用对齐,7列就行 blocks 和inodes时系统检查,不要动
-u 用户名: 设定用户配额
-g 组名: 设定组配额
-t: 设定宽限时间
-p : 复制配额限制,如果已经设定好某个用户的配额限制,其他用户的配额限制如果和这个用户相同,那么可以直接复制配额限制,而不用都手工绑定 edquota -p 源用户 -u 目标用户


启动配额
quotaon [选项] [分区名]
-a : 根据/etc/mtab文件启动所有的配额分区,如果不加-a 后面就一定要指定分区名
-u : 启动用户配额
-g : 启动组配额
-v : 显示启动过程的信息
quotaon -avug 常用

关闭配额 
quotaoff [选项] [分区名]
-a : 根据/etc/mtab文件关闭所有的配额分区,如果不加-a 后面就一定要指定分区名
-u : 关闭用户配额
-g : 关闭组配额

磁盘配额查询
quota [选项] [用户名或组名]
-u : 用户名 : 查询用户配额
-g : 组名  : 查询组配额
-v : 显示详细信息
-s : 已习惯单位显示容量大小

查询文件系统(分区)配额
repquota  [选项] [用户名或组名]
-a : 根据/etc/mtab文件查询配额,如果不加-a 后面就一定要指定分区名
-u : 用户名 : 查询用户配额
-g : 组名  : 查询组配额
-v : 显示详细信息
-s : 已习惯单位显示容量大小

创建一个指定大小的文件
dd if=/dev/zero of=/disk/testfile bs=1M count=60
// 建立testfile 文件 , 指定大小60M

非交互设定用户磁盘配额
setquota -u 用户名 容量软限制 容量硬限制 个数软限制 个数硬限制 分区名

 

LVM

生产服务器必须使用LVM

LVM是logical volume manager的简称, 中文就是逻辑卷管理 
可以动态调整分区大小
实际工作中使用LVM分区
- 物理卷 PV : 就是真正的物理硬盘或分区
- 卷组 VG : 将多个物理卷合起来就组成了卷组,组成同一个卷组的物理卷可以是同一个硬盘的不同分区,也可以是不同硬盘上的不同分区,我们可以把卷组想像成一个逻辑硬盘
- 逻辑卷 LV : 卷组是一个逻辑硬盘,硬盘必须分区之后才能使用,这个分区我们称作逻辑卷, 逻辑卷可以格式化和写入数据,我们可以把逻辑卷想象成分区
- 物理扩展 PE : pe是用来保存数据的最小单元,我们的数据实际上都是写入pe当中,PE的大小是可以配置的,默认是4MB

建立LVM的步骤
1. 选一个物理硬盘分成分区,当然也可以是整块物理硬盘
2. 把物理分区建立成为物理卷PV 也可以直接把整块硬盘都建立为物理卷
3. 接下来把物理卷整合成卷组VG ,卷组就可以动态的调整大小了,可以把物理分区加入卷组,也可以把物理分区从卷组中删除
4. 最后就是把卷组在划分为逻辑卷LV,当然逻辑卷也是可以直接调整大小的,我们说逻辑卷可以想象成分区,所以也需要格式化和挂载

 物理卷管理:
1. 硬盘分区
创建方式就是使用fisk交互命令,不过需要注意的是分区系统id需要改为8e

2.建立物理卷
pvcreate [设备文件名]  // 如果直接整个硬盘就写sda,如果要加分区号就多个命令添加 sda3,sda4....
pvcreate sda3
pvcreate sda4
查询 pvscan  , pvdisplay  简单/详细
删除 pvremove /dev/sda3

3.建立卷组
vgcreate [选项] 卷组名 物理卷名
-e PE大小 : 指定PE的大小,单位可以是MB,GB,TB等,如果不写PE大小是4MB
vgcreate zyxvg /dev/sda3 /dev/sda4
查询 vgscan  , vgdisplay  简单/详细
减小卷组容量 vgreduce [-a 删除全部,后面不用加了] zyxvg /dev/sda4    // 不建议使用,删除容易资料丢失
删除 vgremove zyxvg

4.建立逻辑卷
lvcreate [选项] [-n 逻辑卷名] 卷组名
-L 容量 : 指定逻辑卷的大小,单位MB,GB,TB等
-l **%free : 按剩余的百分比分配
-n 逻辑卷名 : 指定逻辑卷名
lvcreate -L 1.5G -n zyxlv zyxvg
查询 lvscan  , lvdisplay  简单/详细

5.调整逻辑卷大小
lvresize [选项] 逻辑卷设备文件名
-L 容量 : 安装容量调整大小,单位KB,MB,GB,TB等,使用+代表增加空间,-号代表减少空间,如果直接写容量,代表设定逻辑卷大小为指定大小
-l **%free : 按剩余的百分比分配
lvextend  [选项] 逻辑卷设备文件名
-L 容量 : 安装容量调整大小,单位KB,MB,GB,TB等,使用+代表增加空间,-号代表减少空间,如果直接写容量,代表设定逻辑卷大小为指定大小
-l **%free : 按剩余的百分比分配

6.删除逻辑卷
lvremove [选项] 逻辑卷设备文件名
-f : 强制删除

格式化并挂载逻辑卷
mkfs -t ext4 /dev/zyxvg/zyxlv
mount /dev/zyxvg/zyxlv /挂载点    // 永久挂载vi /etc/fstab
// 使用df -h 命令发现大小并没有变化 使用以下命令修改
resize2fs /dev/zyxvg/zyxlv

 

将 /home 目录与 / 根目录磁盘合并

// 查看当前磁盘分配情况 df -hT // 解除挂载
umount /home
// 移除分区
lvremove -f /dev/centos/home
// -L 指定容量扩容
lventend -L +100G /dev/centos/root
// -l 百分比扩容
lvextend -l +100%free /dev/centos/root
// 扩展xfs文件系统大小
xfs_growfs /

// 若提示:"umount: /home: target is busy."则说明有其他进程正在使用,确定主要程序已关闭的情况下还提示该信息,则执行下面步骤: fuser -m /dev/mapper/设备名-home
// 该命令会打印出正在使用该磁盘的进程ID,从前往后逐个KILL -9 ,kill几个应该就没了
// 如果还提示: Logical volume centos/home contains a filesystem in use.
// 就重新挂载
mount /dev/mapper/centos-home
// 使用lsof查看/home目录下占用的进程,找到进程号kill -9
lsof /home

 

新盘扩容到根

// 以sdb为例
fdisk /dev/sdb
d // 删除
n // 新建
p // 主分区
w // 写入保存
mkfs.xfs /dev/sdb1
// 创建pv
pvcreate /dev/sdb1hi
// 扩展vg
vgextend centos /dev/sdb1
// 扩展lv到根
lvextend -l +100%free /dev/centos/root


新盘在df里面看不到的解决办法:
xfs_growfs [挂载的位置]

新建VG分组并挂载到www

以/etc/sdc举例
// 先创建PV
pvcreate /dev/sdc
// 格式化PV
mkfs.xfs /dev/test/lv1
// 创建VG
vgcreate 名字 /dev/sdc
// 创建LV
lvcreate -l +100%free -n [LV名字] [VG名字]
// 挂载/etc/fastab
// 如果要挂载的话路径是/dev/mapper/[VG名字]-[LV名字] 例如 test-lv1
/dev/mapper/test-lv1 /newlv xfs defaults 0 0
mount -a 

防火墙

iptables

封单个IP的命令是:
iptables -I INPUT -s 211.1.0.0 -j DROP
封一个段的命令:
iptables -I INPUT -s 211.0.0.0/8 -j DROP。

 

firewall-cmd

开起80端口
firewall-cmd --zone=public --add-port=+80/tcp --permanent #防火墙添加80端口规则
firewall-cmd --reload #重新读取防火墙
firewall-cmd --zone=public --query-port=80/tcp  #查看80端口是否打开
关闭80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent  #防火墙删除80端口规则
firewall-cmd --reload #重新读取防火墙
firewall-cmd --zone=public --query-port=80/tcp  #查看80端口是否关闭

 

忘记密码

ubuntu 忘记密码:
开机狂按shift 选择recovery mode 按e
找到recovery nomodeset删掉 (10.4没有, 在linux boot ..... ro 后面加就行)
改成 quiet splash rw init=/bin/bash 
ctrl+x 进入 boot 
passwod  修改密码就完事了


centos 7 忘记密码:
开机时在启动菜单 按 "e"  进入编辑
用 ↓ 键找到 linux16 开头的行  把ro改为rw  行尾加上 init=/sysroot/bin/sh
按Ctrl+X进入单用户界面
chroot /sysroot
passwd 进行修改密码
touch /.autorelabel
exit
reboot

开机启动

ubuntu 10.4:

/etc/rc.local    // 修改这个文件
echo 100 > /proc/sys/vm/swappiness
[写要启动的程序 (如 : /home/test.sh [&(加&在后台运行)]) ]  
exit0

小技巧

Xshell下,在vim编辑下,鼠标不能复制和粘贴对应信息,解决办法:
:set mouse=c就可以实现对选中内容进行复制
vim下,粘贴带注释代码,会出现代码缩进错位,解决办法:
先设置vim为粘贴模式,即执行:set paste,然后在进入编辑状态,执行粘贴即可。
vim下查找到字符颜色设置
:hi Search term=standout ctermfg=0 ctermbg=3

 

END

2020.8.15-2021.4.1终于结束了(当然还有许多要补充的),新开一个shell编程->zyxweb.cn/shell

阅读剩余
THE END