Linux备忘录
文件目录
- /bin:命令目录
- /sbin:超级命令目录,只有admin可以执行
- /boot:系统目录,等同于C盘
- /dev:设备文件目录,SSD、光驱、U盘,/dev/sr0代表光驱,必须都要先挂载
- /etc:配置文件目录。软件安装完成后,配置文件存放在此目录(重要)
- /home:user的家目录
- /root:admin的家目录
- /media:挂载目录,挂载光盘以及软盘
- /mnt:挂载目录,挂载额外的设备,如U盘、SSD、移动硬盘
- /opt:第三方软件目录,放置和安装其他软件的位置,手工安装的源码包软件
- /usr/local:软件目录
- /proc:虚拟文件系统,保存在内存中,主要保存于内核、进程、外部设备状态和网络状态,如/proc/devices /proc/net
- /sys:虚拟文件系统,保存在内存中,主要保存于内核相关信息
- /tmp:临时文件目录,在这个目录下,所有用户都可以访问和写入
- /var:经常变化的文件目录,网页文件、数据文件、日志文件
路径
绝对路径:ls /home/username/desktop
相对路径:../:表示上级目录
./:表示当前目录
文件夹名称/ :表示下级目录(下一级)
命令
- stat 查看文件信息
- which 查看可执行文件的位置
- wheris 查看某个命令的位置
- alias 命令设置别名
- hostname-ctl 更改主机名字
- dmidecode 查看系统服务器信息
- dmesg 查看服务器硬件启动日志
- ip a 查看系统地址
- date 查看系统时间日期
- ethtool 查看网卡信息
- source 初始化文件
- locate 依据名字查找文件
- rz/sz 上传/下载文件
ls 查看文件及目录
- ls = list show
- ls / #根目录所有目录
- ls -l 或 ll #详细显示
- ls -lh #详细显示以及显示文件大小
- ls -a #显示所有文件及目录
mkdir 创建目录
- mkdir test
- mkdir -p test/test1
- mkdir -m 777 tset4
ln 链接
- -s:创建软链接。
- -f:强制创建链接文件,如果文件已经存在则覆盖。
- -i:交互式询问是否覆盖已存在的文件。
- -n:创建软链接时,如果原文件是一个目录,则创建一个新目录作为链接文件。
ln -sf ./test.txt 123
ln ./test123.txt test
cd 切换目录
change directory 切换当前目录
cd /usr/bin #跳转到/usr/bin
cd ~ #到/home
cd ../../ #到目前目录的上两层
rm 删除文件及目录
- -i:删除前进行确认提示;
- -r:递归删除目录及其子目录;
- -f:强制删除,不进行确认提示。
删除文件file1:
rm file1
删除目录dir1及其子目录和文件:
rm -r dir1
删除当前目录下所有以“.txt”结尾的文件,且不进行确认提示:
rm -f *.txt
在删除文件时,可以使用通配符(如“*”、“?”等)匹配多个文件,例如删除以“.log”结尾的所有文件:
rm *.log
删除所有以“.bak”结尾的文件,并自动备份被删除的文件:
rm --backup=numbered *.bak
删除目录及其子目录下某个类型的所有文件,可以使用“find”命令和“rm”命令的组合,例如删除所有以“.log”结尾的文件:
find dir1 -name "*.log" -type f -exec rm {} \;
“dir1”为要删除的目录,“-name”选项指定文件名模式,“-type f”选项指定要删除的类型为文件,
“-exec”选项执行“rm”命令并删除符合条件的文件。
kill/pkill 结束进程
- -s signal:指定要发送的信号类型,例如kill -s SIGTERM PID表示发送SIGTERM信号终止进程。
- -l:列出所有可用的信号类型。
- -n signum:指定信号类型的数字编号。
- -f:强制终止进程,不给进程发送信号。
通常,使用kill命令终止进程的流程如下:
1. 使用ps命令或top命令查看进程的PID。
2. 使用kill命令发送信号终止进程。
kill 12345
kill -9 12345
pkill -9 nginx
wc 计数
word count
- -c:计算文件中的字节数 bytes;
- -w:计算文件中的字数 word;
- -l:计算文件中的行数 lines;
- -m:计算文件中的字符数(不包括换行符);
- -L:计算文件中最长行的长度;
wc example.txt
计算一个名为“example.txt”的文件中的行数、字节数和字数
wc -l example.txt
只输出文件中的行数。
cat example.txt | wc
计算一个名为“example.txt”的文件中的行数、字节数和字数
grep -v "^$" file.txt | wc -l
使用grep命令将空行过滤掉后再进行统计
count=$(wc -l file.txt | awk '{print $1}')
在Shell脚本中使用,将wc命令的输出保存到变量中
使用wc命令统计文件中的行数,并使用awk命令提取结果中的第一个字段(即行数),最后将结果保存到变量count中。
find 查找文件及目录
- -name PATTERN:按文件名匹配,PATTERN为文件名的通配符,可以使用*、?等;
- -type TYPE:按类型匹配,TYPE为f表示文件,d表示目录,l表示符号链接等;
- -size [+-]SIZE:按文件大小匹配,SIZE为文件大小,可使用k、M等单位表示,+表示大于SIZE,-表示小于SIZE;
- -mtime [+-]DAYS:按文件修改时间匹配,DAYS为天数,+表示在DAYS天之前修改过,-表示在DAYS天之内修改过;
- -maxdepth N:设置查找的目录深度,只查找N级目录;
- -mindepth N:设置查找的目录深度,从第N级目录开始查找。
- -print:将匹配的文件名输出到标准输出流中;
- -delete:删除匹配的文件或目录;
- -exec command {} \;:对匹配的文件或目录执行特定的命令,{}表示匹配的文件名或目录名。
要查找当前目录及其子目录中所有扩展名为txt的文件:
find . -name "*.txt" -print
要查找当前目录及其子目录中所有大小大于1MB的文件,并将它们删除:
find . -type f -size +1M -delete
要查找当前目录及其子目录中所有修改时间在7天之前的文件,并将它们移动到另一个目录中,可以使用以下命令:
find . -type f -mtime +7 -exec mv {} /path/to/destination \;
要查找当前目录及其子目录中所有以数字开头的txt文件,可以使用正则表达式匹配文件名:
find . -regex './[0-9]+.*\.txt' -print
要查找当前目录及其子目录中所有大小大于1MB且修改时间在7天之前的文件:
find . -type f -size +1M -mtime +7 -print
要查找当前目录及其子目录中所有路径名中包含logs的文件或目录,可以使用通配符匹配文件路径:
find . -path '*logs*' -print
xargs 传参
- -n:指定每次传递给command的参数个数,默认为全部参数。
- -I:指定替换字符串,xargs会将替换字符串替换为从标准输入中读取的参数。
- -t:输出command执行的命令行。
- -p:在执行command之前提示用户确认。
- -r:当从标准输入中读取不到参数时,不执行command。
- -s:指定从标准输入中读取的参数总大小的上限。
grep 查找文件、目录、文件中的字段
- -i:忽略大小写;
- -v:输出不包含匹配字符串的行;
- -n:输出行号;
- -c:输出匹配字符串的行数;
- -r:递归查找指定目录及其子目录中的文件。
假设我们有一个名为test.txt的文本文件,包含以下内容:
hello world
this is a test file
hello grep
grep command is useful
查找包含字符串grep的行
grep grep test.txt
该命令将输出以下结果:
hello grep
grep command is useful
查找包含字符串hello或world的行
grep 'hello\|world' test.txt
该命令将输出以下结果:
hello world
hello grep
查找所有包含字符串hello的行,并输出行号
grep -n hello test.txt
该命令将输出以下结果:
1:hello world
3:hello grep
递归查找当前目录及其子目录中所有txt文件中包含字符串hello的行,并输出文件名和行号
grep -r -n hello *.txt
该命令将输出所有包含字符串hello的行,并在每行前面加上文件名和行号,例如:
test.txt:1:hello world
test.txt:3:hello grep
subdir/test2.txt:2:hello there
wget 下载
- -O:指定下载文件的保存路径和文件名,如-O /path/to/file指定将文件下载到/path/to/file;
- -c:支持断点续传,如果下载过程中中断了,可以使用-c选项继续下载;
- -r:递归下载整个目录,可以使用-r选项指定下载深度;
- -np:不下载父级目录,如果下载目录时需要限制下载深度,可以使用-np选项;
- -P:指定下载文件的保存目录,如-P /path/to/dir指定将文件下载到/path/to/dir目录下;
- -T:设置下载超时时间,单位为秒,如-T 60表示下载超过60秒就超时;
- -q:静默模式,不输出下载进度信息,只显示错误信息;
- -U:设置User-Agent请求头,可以伪装浏览器或其他工具进行下载。
例如,下载一个文件:
wget https://example.com/file.zip
下载整个目录:
wget -r -np https://example.com/dir/
其中,-r选项表示递归下载,-np选项表示不下载父级目录,https://example.com/dir/表示要下载的目录URL。
curl http访问
- -o:指定下载文件的保存路径和文件名,如-o /path/to/file指定将文件下载到/path/to/file;
- -O:将下载文件保存到当前目录下,文件名与URL的最后一段相同;
- -C:支持断点续传,如果下载过程中中断了,可以使用-C选项继续下载;
- -I:只显示HTTP响应头信息,不下载文件;
- -H:设置HTTP请求头,如-H "Content-Type: application/json"表示设置Content-Type请求头;
- -d:发送POST请求的数据,如-d "key=value"表示发送key=value的POST数据;
- -u:设置HTTP认证信息,如-u username:password表示使用Basic认证方式进行认证;
- -k:跳过SSL证书验证,可以在HTTPS请求时使用-k选项;
- -s:静默模式,不输出请求和响应信息,只显示错误信息。
例如,下载一个文件:
curl -o file.zip https://example.com/file.zip
下载整个目录:
curl -O -J -L -R -r 0-9 https://example.com/dir/*
其中,-O选项表示将下载文件保存到当前目录下,-J选项表示保存文件名与URL的最后一段相同,
-L选项表示跟随重定向,-R选项表示支持远程时间戳,-r选项表示支持断点续传。
watch 实时查看
- -n:指定执行命令的时间间隔,单位为秒,如-n 10表示每10秒执行一次命令;
- -d:高亮显示命令输出中的变化部分,方便观察变化;
- -t:不显示watch命令的标题行,只显示命令输出;
- -c:清空终端屏幕,每次执行命令前先清空终端屏幕;
- -x:使用命令的输出作为终端窗口标题,方便识别不同的watch命令。
例如,使用watch命令监控系统的负载情况:
watch -n 1 uptime
其中,-n 1选项表示每秒执行一次uptime命令,输出系统的负载情况。
例如,结合tail命令实时观察日志文件的变化:
watch -n 1 tail -n 10 /var/log/syslog
其中,-n 1选项表示每秒执行一次tail命令,输出日志文件的最后10行。
输出重定向
- >:将标准输出流重定向到指定文件中,如果文件不存在则创建,如果文件已存在则覆盖原内容。
- >>:将标准输出流重定向到指定文件中,如果文件不存在则创建,如果文件已存在则在文件末尾追加内容。
- 2>:将标准错误输出流重定向到指定文件中。
- &>:将标准输出流和标准错误输出流都重定向到指定文件中。
- |:将前一个命令的输出作为后一个命令的输入。
下面,我们通过一些示例来演示输出重定向的使用。
1.将程序输出保存到文件中
假设我们有一个名为test.txt的文本文件,包含以下内容:
hello world
this is a test file
现在,我们要将ls命令的输出保存到test.txt文件中,可以使用以下命令:
ls > test.txt
该命令将ls命令的输出保存到test.txt文件中。如果test.txt文件不存在,则创建该文件;如果文件已存在,则覆盖原内容。
2.将程序输出追加到文件末尾
如果我们想把ls命令的输出追加到test.txt文件的末尾,而不是覆盖原内容,可以使用以下命令:
ls >> test.txt
该命令将ls命令的输出追加到test.txt文件的末尾。
3.将程序错误输出保存到文件中
有时候,程序的错误输出可能比较重要,我们也需要将其保存到文件中。例如,如果我们执行一个不存在的命令,系统会输出错误信息:
bash: abc: command not found
如果我们要将该错误信息保存到error.log文件中,可以使用以下命令:
abc 2> error.log
该命令将执行abc命令,由于该命令不存在,系统会输出错误信息,而该错误信息将被重定向到error.log文件中。
4.将标准输出流和标准错误输出流都重定向到文件中
有时候,我们既需要将标准输出流重定向到文件中,又需要将标准错误输出流重定向到文件中,可以使用以下命令:
ls &> output.log
该命令将ls命令的标准输出流和标准错误输出流都重定向到output.log文件中。
5.将一个命令的输出作为另一个命令的输入
查找当前目录及其子目录中所有txt文件中包含字符串hello的行,可以使用以下命令:
grep hello *.txt
将结果保存到文件中,可以使用输出重定向符号,例如:
grep hello *.txt > result.txt
该命令将查找当前目录中所有txt文件中包含字符串hello的行,并将结果保存到result.txt文件中。
VIM
命令模式
1. 移动光标
在命令模式下,可以使用以下命令来移动光标:
- h:向左移动一个字符。
- j:向下移动一行。
- k:向上移动一行。
- l:向右移动一个字符。
- w:向右移动一个单词。
- b:向左移动一个单词。
- 0:移动到当前行的开头。
- $:移动到当前行的结尾。
- gg:移动到文本的第一行。
- G:移动到文本的最后一行。
2. 插入文本
在命令模式下,可以使用以下命令来插入文本:
- i:在当前光标位置前插入文本。
- I:在当前行的开头插入文本。
- a:在当前光标位置后插入文本。
- A:在当前行的结尾插入文本。
- o:在当前行的下方插入一行。
- O:在当前行的上方插入一行。
3. 删除文本
在命令模式下,可以使用以下命令来删除文本:
- x:删除当前光标所在位置的字符。
- dw:删除当前光标位置到单词结尾的文本。
- d0:删除当前光标位置到行开头的文本。
- d$:删除当前光标位置到行结尾的文本。
- dd:删除整行文本。
4. 复制和粘贴文本
在命令模式下,可以使用以下命令来复制和粘贴文本:
- yy:复制当前行。
- yw:复制当前光标位置到单词结尾的文本。
- p:将复制的文本粘贴到当前光标位置的下方。
- P:将复制的文本粘贴到当前光标位置的上方。
5. 撤销和恢复操作
在命令模式下,可以使用以下命令来撤销和恢复操作:
- u:撤销上一次操作。
- Ctrl+r:恢复上一次撤销的操作。
6. 查找和替换文本
在命令模式下,可以使用以下命令来查找和替换文本:
- /pattern:搜索文本中的模式。
- n:在查找模式时,移动到下一个匹配项。
- N:在查找模式时,移动到上一个匹配项。
- :s/old/new/g:将当前行中的所有“old”替换为“new”。
- :%s/old/new/g:将文本中所有的“old”替换为“new”。
7. 块操作
在命令模式下,可以使用以下命令来执行块操作:
- Ctrl+v:进入可视块模式,可以选择一个矩形块。
- Shift+i:在可视块模式下,进入插入模式,可以在选择的矩形块中插入文本。
- d:在可视块模式下,删除选择的矩形块中的所有文本。
末行模式
1. 保存文件
- :w:保存文件。
- :w filename:将文件保存为指定的文件名。
2. 退出VIM
- :q:退出VIM。
- :q!:强制退出VIM,不保存修改。
- :wq:保存并退出VIM。
3. 查找和替换文本
- /pattern:搜索文本中的模式。
- :s/old/new/g:将当前行中的所有“old”替换为“new”。
- :%s/old/new/g:将文本中所有的“old”替换为“new”。
4. 移动光标
- :n:将光标移动到第n行。
- :$:将光标移动到文本的最后一行。
- :1:将光标移动到文本的第一行。
5. 显示和隐藏行号
- :set number:显示行号。
- :set nonumber:隐藏行号。
6. 执行外部命令
- :!command:执行外部命令,例如:!ls。
7. 插入文本
- :a:在当前行的后面插入文本。
- :i:在当前行的前面插入文本。
- :o:在当前行下面插入一行并插入文本。
8. 删除文本
- :d:删除当前行。
- :%d:删除整个文本。
9. 执行宏
- :@x:执行名称为x的宏。
10.代码着色
- :syntax on/off
可视化模式
VIM中的可视化模式用于选择文本块,用户可以使用以下命令来执行各种操作:
1. 进入可视化模式
- v:进入可视化模式。
- V:进入行可视化模式。
- Ctrl+v:进入块可视化模式。
2. 选择文本块
- j:向下选择一行。
- k:向上选择一行。
- h:向左选择一个字符。
- l:向右选择一个字符。
- w:选择下一个单词。
- e:选择下一个单词的结尾。
- b:选择上一个单词的开头。
3. 操作文本块
- d:删除选择的文本块。
- y:复制选择的文本块。
- p:将复制的文本块粘贴到当前光标位置下面。
- P:将复制的文本块粘贴到当前光标位置上面。
- I:在选择的文本块的开头插入文本。
- A:在选择的文本块的末尾插入文本。
4. 取消选择
- Esc:退出可视化模式。
管道符
0:标准输入。进程需要外部的某些程序传递相应的参数,才能正常运行
1:标准输出,程序或命令正确的执行结果,称为标准输出
2:标准错误,程序或命令错误的执行结果,称为标准错误
用户管理
用户组
储存在/etc/group
groupadd
-g 指定新建工作组的 id
groupmod
-g 设置使用的群组识别码。
-n 设置使用的群组名称。
1. 查看用户组信息
在进行用户组添加操作之前,我们需要先了解当前系统中已经存在的用户组。我们可以使用以下命令来查看当前系统中已经存在的用户组:
cat /etc/group
2. 创建用户组
如果我们需要创建一个新的用户组,可以使用以下命令:
sudo groupadd <group_name>
3. 验证用户组添加操作
添加用户到用户组之后,我们可以使用以下命令来验证用户组添加操作是否成功:
groups <username>
4. 修改用户组信息
如果需要修改已经存在的用户组信息,可以使用以下命令进行修改:
sudo groupmod <group_name>
5. 删除用户组
如果我们需要删除一个已经存在的用户组,可以使用以下命令进行删除:
sudo groupdel <group_name>
用户
useradd [OPTIONS] USERNAME
其中,OPTIONS是可选参数,用于设置新用户的属性和特征,USERNAME是新用户的用户名。下面是一些常用的OPTIONS选项:
- -c COMMENT:设置用户的注释信息。
- -d HOME_DIR:设置用户的主目录路径。
- -e EXPIRE_DATE:设置用户的过期日期。
- -f INACTIVE_DAYS:设置用户的账户失效时间。
- -g PRIMARY_GROUP:设置用户的主组名称或GID。
- -G SECONDARY_GROUP:设置用户的附加组名称或GID。
- -m:自动创建用户的主目录。
- -s SHELL:设置用户的默认Shell程序。
/bin/bash => 给人使用
/sbin/nologin => 给软件使用
- -u UID:设置用户的UID。
- -p PASSWORD:设置用户的密码,需要使用加密后的密码。
- -r:创建系统账户,该账户的UID和GID值大于等于500。
- -Z:设置用户的SELinux安全上下文。
查看系统默认值,可以使用以下命令:
grep UID_MIN /etc/login.defs
grep UID_MAX /etc/login.defs
grep GID_MIN /etc/login.defs
grep GID_MAX /etc/login.defs
1. 打开终端,并以root用户身份登录。
2. 使用以下命令创建新的用户:
sudo adduser <username>
3. 如果需要为新用户设置密码,可以使用以下命令进行密码设置:
sudo passwd <username>
4. 如果需要将新用户添加到某个特定的用户组中,可以使用以下命令进行用户组添加操作:
sudo usermod -aG <group_name> <username>
5. 验证新用户是否添加成功,可以使用以下命令查看系统中已经存在的用户:
cat /etc/passwd
6. 退出root用户身份。
exit
/etc/passwd
root:x:0:0:root:/root:/bin/bash
- root:用户名。
- x:密码加密方式,x表示密码已经加密并存储在/etc/shadow文件中。
- 0:UID值,表示用户的唯一标识符。
- 0:GID值,表示用户所属的主组。
- root:注释信息,通常包括用户的姓名、电话号码、电子邮箱等信息。useradd -c "信息" 用户名称
- /root:主目录路径,表示用户的主目录所在的路径。用户默认在/home
- /bin/bash:默认Shell程序,表示用户登录后默认使用的Shell程序。
/bin/bash => 给人使用
/sbin/nologin => 给软件使用
文件权限
三种基本权限:读取、写入和执行。这三种权限分别用r、w和x表示,对应于文件的读取、写入和执行权限。
在文件名前面,还有一些符号用于表示文件的类型和权限,它们包括:
- `-`:表示文件类型为普通文件。
- `d`:表示文件类型为目录。
- `l`:表示文件类型为链接文件。
- `b`:表示文件类型为块设备文件。
- `c`:表示文件类型为字符设备文件。
- `s`:表示文件类型为套接字文件。
- `p`:表示文件类型为命名管道文件。
文件的权限可以分为三类:所有者权限、组权限和其他用户权限。
数字表示方法:rwx表示111,r-x表示101,r--表示100,以此类推。
rwxr-xr--表示文件所有者具有读取、写入和执行权限,用户组具有读取和执行权限,其他用户只有读取权限。
符号表示方法:每种权限位组都可以使用符号表示,r表示读取权限,w表示写入权限,x表示执行权限。
u表示文件所有者,g表示用户组,o表示其他用户,a表示所有用户。
使用符号表示文件的权限,可以使用如下格式:
[user|group|other][+|-|=][rwx]
其中,user表示文件所有者,group表示用户组,other表示其他用户;
+表示增加权限,-表示去除权限,=表示设置权限;
rwx表示读取、写入、执行权限。
要将文件的所有者权限设置为读取和执行,可以使用命令:
chmod u+rx filename
文件权限的设置可以使用`chmod`命令,例如:
chmod 777 filename
这个命令将文件的所有者、用户组和其他用户的权限都设置为读取、写入和执行。
除了基本的文件权限之外,Linux系统还提供了其他一些高级的文件权限设置方式,例如:
1. SUID权限:当一个文件被设置了SUID权限时,任何用户都可以以该文件所有者的身份运行它。
这种权限通常用于一些需要特殊权限才能执行的程序,例如passwd命令。
2. SGID权限:当一个文件被设置了SGID权限时,任何用户都可以以该文件所属用户组的身份运行它。
这种权限通常用于共享文件夹和共享文件的管理。
3. Sticky权限:当一个目录被设置了Sticky权限时,只有目录所有者和文件所有者才能删除其中的文件。
这种权限通常用于共享目录和公共计算机上的临时文件夹。
这些高级权限可以使用chmod命令设置,例如:
chmod u+s filename # 设置SUID权限
chmod g+s dirname # 设置SGID权限
chmod +t dirname # 设置Sticky权限
除了chmod命令之外,还可以使用chown和chgrp命令来改变文件的所有者和用户组,例如:
chown user filename # 将文件所有者设置为user
chgrp group filename # 将文件用户组设置为group
getfacl/setfacl 文件访问权限
getfacl [选项] 文件或目录
- -R:递归查看目录下所有文件和子目录的ACL信息。
- -p:以可重现的格式输出ACL信息。
- -s:只显示基本ACL信息。
setfacl [选项] 权限规则 文件或目录
- -R:递归设置目录下所有文件和子目录的ACL信息。
- -m:修改ACL信息。
- -x:删除ACL信息。
- -d:设置默认ACL信息。
查看CPU
1. `lscpu`:该命令可以列出CPU的详细信息,包括CPU型号、架构、核心数、线程数、缓存大小等等。例如:
$ lscpu
2. `cat /proc/cpuinfo`:该命令可以列出CPU的详细信息,包括CPU型号、缓存大小、时钟频率等等。例如:
$ cat /proc/cpuinfo
3. `top`:该命令可以实时监视系统的CPU占用情况。
在命令行中输入top,然后按下Shift+P键,显示CPU占用率的高低对进程进行排序,并显示每个进程所占用的CPU时间和CPU占用率。
$ top
top - 10:51:06 up 1 day, 2:11, 1 user, load average: 0.23, 0.22, 0.25
Tasks: 210
uname -a 查看内核信息
系统服务
1. 启动服务
systemctl start 服务名
例如,启动Apache服务:
systemctl start httpd.service
2. 停止服务
systemctl stop 服务名
例如,停止Apache服务:
systemctl stop httpd.service
3. 重启服务
systemctl restart 服务名
例如,重启Apache服务:
systemctl restart httpd.service
4. 查看服务状态
systemctl status 服务名
例如,查看Apache服务状态:
systemctl status httpd.service
5. 激活服务
systemctl enable 服务名
例如,激活Apache服务:
systemctl enable httpd.service
6. 禁用服务
systemctl disable 服务名
例如,禁用Apache服务:
systemctl disable httpd.service
需要注意的是,systemctl命令需要root权限才能执行。
systemctl(systemd)
- 启动服务:systemctl start service_name
- 停止服务:systemctl stop service_name
- 重启服务:systemctl restart service_name
- 查看服务状态:systemctl status service_name
- 设置服务开机启动:systemctl enable service_name
- 取消服务开机启动:systemctl disable service_name
- 查看服务日志:systemctl status -n 50 service_name (显示最近50行日志)
- 查看服务配置文件:systemctl cat service_name
- 查看服务依赖关系:systemctl list-dependencies service_name
- 查看所有已启动的服务:systemctl list-units --type=service
service/chkconfig
service 服务名 start|stop|restart|status
- start:启动服务。
- stop:停止服务。
- restart:重启服务。
- status:查看服务状态。
chkconfig --level 运行级别 服务名 on|off|reset
- on:设置服务在指定运行级别下开机自启动。
- off:关闭服务在指定运行级别下的开机自启动。
- reset:重置服务在指定运行级别下的开机自启动状态。
进程优先级调整
1.top
top -r pid
2.renice
renice -5 pid
3.nice
kill pid
systemctl stop command
nice -n -5 command
sshd ssh服务
- /etc/ssh/sshd_config:sshd服务的主配置文件,包含了sshd服务的各种参数和选项。
- Port:sshd服务监听的端口号,默认为22。
- PermitRootLogin:是否允许root用户通过ssh登录,默认为yes。
- PasswordAuthentication:是否允许使用密码进行ssh登录,默认为yes。
- PubkeyAuthentication:是否允许使用公钥进行ssh登录,默认为yes。
- UsePAM:是否启用PAM(Pluggable Authentication Modules)认证,默认为yes。
- AllowUsers:允许哪些用户通过ssh登录。
- AllowGroups:允许哪些用户组的成员通过ssh登录。
- DenyUsers:禁止哪些用户通过ssh登录。
- DenyGroups:禁止哪些用户组的成员通过ssh登录。
- LogLevel:sshd服务的日志级别,默认为INFO。
- /var/log/auth.log:sshd服务的日志文件,记录了sshd服务的各种操作和事件。
ntp 时间同步
ntp.org.cn
ntpdate domain
crontab 任务规划
crontab [-u 用户名] [-l|-e|-r] [文件名]
- -u:指定要操作的用户。
- -l:列出指定用户的cron任务。
- -e:编辑指定用户的cron任务。
- -r:删除指定用户的cron任务。
- @reboot:在系统启动时执行任务。
- @yearly、@annually:每年执行一次任务。
- @monthly:每月执行一次任务。
- @weekly:每周执行一次任务。
- @daily、@midnight:每天执行一次任务。
- @hourly:每小时执行一次任务。
/etc/crontab.deny #黑名单
/etc/crontab.allow #白名单
/var/spool/cron/username #任务存放路径
/var/log/cron #日志
分 时 日 月 周 命令(绝对路径)
* * * * * /usr/bin/......
30 4 1 * * /usr/bin/systemctl restart network
at 一次性任务
$ at 15:30
at> /usr/bin/command
at> ^D
- -f:指定要执行的脚本文件。
- -l:列出当前用户的所有待执行的任务。
- -d:删除指定的任务。
- -c:显示指定任务的详细信息。
监控命令
ps 静态查找进程
1. 基本用法:在命令行中输入ps即可列出当前用户下的所有进程。例如:
$ ps
PID TTY TIME CMD
153 pts/0 00:00:00 bash
1074 pts/0 00:00:00 ps
其中,PID表示进程ID,TTY表示进程所在的终端设备,TIME表示进程已经运行的时间,CMD表示进程的命令名称。
2. 选项-a:该选项用于显示所有用户的所有进程。例如:
$ ps -a
PID TTY TIME CMD
153 pts/0 00:00:00 bash
1075 pts/0 00:00:00 ps
3. 选项-u:该选项用于显示进程的详细信息,包括进程所属用户、CPU占用率、内存占用率等等。例如:
$ ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
ubuntu 153 0.0 0.1 13972 3564 pts/0 Ss 10:52 0:00 bash
ubuntu 1085 0.0 0.0 17464 2496 pts/0 R+ 10:58 0:00 ps -u
4. 选项-f:该选项用于显示完整的进程信息,包括进程的PPID(父进程ID)、进程状态、启动时间等等。例如:
$ ps -f
UID PID PPID C STIME TTY TIME CMD
ubuntu 153 151 0 10:52 pts/0 00:00:00 bash
ubuntu 1094 153 0 11:00 pts/0 00:00:00 ps -f
5. 选项-e:该选项用于显示所有进程,而不仅仅是当前用户的进程。例如:
$ ps -e
6. 选项-l:该选项用于显示进程的长格式信息,包括进程的UID、PID、PPID、CPU占用率、内存占用率、启动时间等等。例如:
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 1291 1243 0 80 0 - 2839 wait tty2 00:00:00 bash
0 R 1000 1557 1291 0 80 0 - 3088 - tty2 00:00:00 ps
其中,F表示进程的标志位,S表示进程的状态,
UID表示进程所属用户的ID,PID表示进程ID,PPID表示父进程ID,
C表示CPU占用率,PRI表示进程的优先级,NI表示进程的优先级数值,
ADDR表示进程在内存中的地址,SZ表示进程占用的内存大小,
WCHAN表示进程正在等待的事件,TTY表示进程所在的终端设备,
TIME表示进程已经运行的时间,CMD表示进程的命令名称。
7. 选项-x:该选项用于显示所有进程,不仅仅是与当前终端设备相关的进程。例如:
$ ps -x
PID TTY STAT TIME COMMAND
1 ? Ss 0:02 /sbin/init splash
2 ? S 0:00 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
6 ? I< 0:00 [kworker/0:0H-kblockd]
8 ? I< 0:00 [mm_percpu_wq]
...
8. 选项-C:该选项用于按照命令名称进行排序,并显示进程的详细信息。例如:
$ ps -C sshd -f
UID PID PPID C STIME TTY TIME CMD
root 902 1 0 10:50 ? 00:00:00 /usr/sbin/sshd -D
其中,选项-C后面的参数为进程的命令名称,-f表示显示进程的详细信息。
9. 选项-H:该选项用于显示进程树。例如:
$ ps -H
PID TTY TIME CMD
153 pts/0 00:00:00 bash
164 pts/0 00:00:00 less
168 pts/0 00:00:00 sh
169 pts/0 00:00:00 ps
其中,PID表示进程ID,TTY表示进程所在的终端设备,TIME表示进程已经运行的时间,CMD表示进程的命令名称。
进程树的结构由缩进表示。
例如,进程164是进程153的子进程,进程168是进程164的子进程,进程169是进程168的子进程。
ps -df | grep test
ps -aux
ps -u test
top 动态查找进程
交互界面中的各列数据含义如下:
- PID:进程ID;
- USER:进程所属用户;
- PR:进程优先级;
- NI:进程的nice值;
- VIRT:进程使用的虚拟内存大小;
- RES:进程占用的物理内存大小;
- SHR:进程共享的内存大小;
- S:进程状态,如R表示正在运行,S表示睡眠,Z表示僵死,D表示不可中断等;
- %CPU:进程占用CPU的百分比;
- %MEM:进程占用内存的百分比;
- TIME+:进程运行的累计CPU时间;
- COMMAND:进程所执行的命令。
- -d:指定刷新间隔时间,即多长时间更新一次进程信息,单位是秒,默认是3秒;
- -p:指定要监视的进程ID;
- -u:指定要监视的用户;
- -H:以线程的形式显示进程信息;
- -s:指定按照进程的哪个属性进行排序,如-s %CPU表示按照CPU使用率进行排序;
- -b:以批处理模式运行top命令,将结果输出到文件中。
vmstat 内存、swap
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 842252 15920 81692 0 0 25 36 78 109 6 1 93 0 0
“procs”表示进程的情况,“r”表示正在运行的进程数,“b”表示处于等待状态的进程数;
“memory”表示内存的情况,“swpd”表示虚拟内存使用情况,“free”表示空闲内存大小,“buff”表示用作缓冲区的内存大小,“cache”表示用作缓存的内存大小;
“swap”表示交换空间的情况,“si”表示从磁盘读入交换空间的速度,“so”表示写出到磁盘的交换空间的速度;
“io”表示磁盘I/O的情况,“bi”表示从块设备读入的速度,“bo”表示写出到块设备的速度;“system”表示系统调用的情况,“in”表示每秒中断数,“cs”表示每秒上下文切换次数;
“cpu”表示CPU的情况,“us”表示用户进程使用CPU的时间占比,“sy”表示内核进程使用CPU的时间占比,“id”表示CPU空闲时间占比,“wa”表示等待I/O的CPU时间占比,“st”表示虚拟机被剥夺CPU的时间占比。
- -a:显示所有信息;
- -d:显示磁盘I/O信息;
- -m:显示内存使用情况信息;
- -s:指定时间间隔,单位为秒,默认为2秒;
- -n:指定输出的次数;
- -V:显示vmstat命令的版本信息。
例如,运行vmstat命令:
vmstat 1 10
mpstat CPU监控
在mpstat命令输出的结果中,第一行表示平均值,后面的行表示每个CPU的统计信息。
mpstat命令的输出格式如下:
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 06/22/2017 _x86_64_ (2 CPU)
12:31:12 PM CPU %user %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
12:31:12 PM all 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 0.00 99.99
12:31:12 PM 0 0.00 0.00 0.01 0.00 0.00 0.00 0.00 0.00 0.00 99.99
12:31:12 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
“CPU”表示CPU的编号;
“%user”表示用户进程使用CPU的时间占比,“%nice”表示用户进程使用CPU的时间占比,优先级高于普通用户进程;
“%sys”表示内核进程使用CPU的时间占比,“%iowait”表示CPU等待I/O的时间占比,“%irq”表示中断处理程序使用CPU的时间占比,
“%soft”表示软中断处理程序使用CPU的时间占比,“%steal”表示虚拟机被剥夺CPU的时间占比,“%guest”表示虚拟机使用CPU的时间占比,
“%gnice”表示虚拟机中优先级较高的进程使用CPU的时间占比,“%idle”表示CPU空闲时间占比。(*重要)
- -A:显示所有信息;
- -P:指定要监视的CPU或CPU组,可以使用CPU或CPU组的编号或名称;
- -u:显示CPU使用情况信息;
- -I:指定要监视的中断类型,可以是“SUM”、“CPU”、“DEVICE”等;
- -h:显示帮助信息。
例如,运行mpstat命令:
mpstat 1 10
iostat 磁盘读写
在iostat命令输出的结果中,第一行表示平均值,后面的行表示每个磁盘的统计信息。iostat命令的输出格式如下:
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 06/22/2017 _x86_64_ (2 CPU)
12:31:12 PM CPU %user %nice %system %iowait %steal %idle
12:31:12 PM all 0.02 0.00 0.01 0.00 0.00 99.97
12:31:12 PM 0 0.01 0.00 0.01 0.00 0.00 99.98
12:31:12 PM 1 0.03 0.00 0.01 0.00 0.00 99.96
12:31:12 PM Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %util
12:31:12 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:31:12 PM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00
“Device”表示磁盘名称;
“r/s”表示每秒读取的次数,
“w/s”表示每秒写入的次数,
“rkB/s”表示每秒读取的数据量(单位为KB),
“wkB/s”表示每秒写入的数据量(单位为KB),
“rrqm/s”表示每秒合并的读取请求量,
“wrqm/s”表示每秒合并的写入请求量,
“%util”表示磁盘的使用率。(*重要,磁盘是否繁忙,90%就是繁忙)
- -c:输出CPU使用情况信息;
- -d:输出磁盘使用情况信息;
- -h:显示帮助信息。
- -x:显示扩展信息
- -k:以KB为单位显示数据量
例如,运行iostat命令:
iostat -d -x -k 1 10
sar 性能分析
- -u:输出CPU使用率相关信息,包括每个CPU核心的使用率、用户态和系统态的CPU使用率、中断和上下文切换等信息。
- -r:输出内存使用率相关信息,包括内存的空闲、缓存、缓冲、使用和交换区等信息。
- -b:输出磁盘I/O相关信息,包括磁盘读写速度、I/O请求队列长度等信息。
- -n:输出网络相关信息,包括网络接口的流量、错误包、丢包等信息。
- -p:输出进程相关信息,包括进程的CPU和内存使用情况、网络活动、I/O操作等信息。
- -f:指定sar数据文件的路径,可以用于查看历史数据。
- -q:表示输出平均负载相关信息
sar -q 1 10
- ldavg-1:过去1分钟内的平均负载。
- ldavg-5:过去5分钟内的平均负载。
- ldavg-15:过去15分钟内的平均负载。
pidstat 进程磁盘读写
- -u:输出CPU使用率相关信息,包括用户态、系统态和等待CPU时间的CPU使用率等。
- -r:输出内存使用率相关信息,包括进程的虚拟内存、物理内存、共享内存等情况。
- -d:输出磁盘I/O相关信息,包括进程的读写速度、I/O请求队列长度等情况。
- -w:输出上下文切换和进程等待的CPU时间相关信息。
- -t:指定输出进程的时间间隔。
- -h:以易于读取的格式输出结果。
- -p:指定要监测的进程号,多个进程号可以使用逗号分隔。
- -C:指定要监测的进程名,多个进程名可以使用逗号分隔。
- -u:指定输出所有进程的使用情况,而不是只输出指定的进程。
pidstat -d 1 10
查看进程
uptime 查看负载均衡
uptime命令的输出格式如下:
22:16:47 up 1:21, 2 users, load average: 0.00, 0.01, 0.05
“load average”后面的三个数依次表示系统1分钟、5分钟、15分钟的平均负载。
如果系统平均负载超过了CPU核心数的2倍,就说明系统负荷过重,需要进一步优化。
- -p:显示系统启动时间;
- -s:显示系统运行的时长,以紧凑格式输出;
- -h:以人性化方式输出系统运行时间,如2天3小时20分钟;
- -V:显示uptime命令的版本信息。
free
1. total(总内存):系统中总共的物理内存。
2. used(已使用内存):当前已经被占用的内存数量。
3. free(空闲内存):当前没有被占用的内存数量。
4. shared(共享内存):被多个进程共享的内存数量。
5. buffers/cached(缓存区):系统为了加快磁盘访问而预留的内存。
6. available(可用内存):当前系统中可用的内存数量。
`free`命令的输出结果默认以字节为单位,但是也可以使用参数来指定输出结果的单位,例如使用“-m”参数可以将结果以MB为单位显示。
使用管道符(|)将`free`的输出结果传递给`grep`命令,可以查找特定的内存使用信息。
例如,以下命令可以查找“buffers”和“cached”行中包含“Swap”的信息:
free -h | grep -i swap
例如,以下命令可以每隔5秒自动刷新一次内存使用情况:
free -h -s 5
监听命令
ipconfig 网卡信息
/etc/sysconfig/network-scripts/...
strace
- -p:指定要跟踪的进程号。
- -o:指定输出结果的文件名。
- -c:统计系统调用的次数、时间和错误等信息。
- -t:输出每个系统调用的时间戳。
- -e:指定要跟踪的系统调用,多个系统调用可以使用逗号分隔。
- -s:指定输出结果的最大长度。
- -f:跟踪进程的所有子进程。
- -v:输出更详细的调试信息。
strace命令的输出结果包括以下内容:
- 系统调用的名称和参数。
- 系统调用的返回值。
- 进程的信号传递和处理等信息。
strace -c ls
查看ls命令调用
netstat 网络状态
- -a:显示所有网络连接,包括监听和非监听状态的。
- -t:显示TCP协议的连接信息。
- -u:显示UDP协议的连接信息。
- -p:显示进程名和进程ID号。
- -n:不解析主机名和服务名,以IP地址和端口号代替。
- -l:仅显示监听状态的网络连接。
- -r:显示路由表信息。
- -i:显示网络接口信息。
- -s:显示网络统计信息,包括网络流量、网络错误等情况。
- 协议:TCP或UDP。
- 本地地址和端口号:本地计算机的IP地址和端口号。
- 远程地址和端口号:远程计算机的IP地址和端口号。
- 状态:网络连接的状态,如ESTABLISHED、LISTEN、CLOSED等。
- 进程名和进程ID号:占用该端口的进程的名称和ID号。
netstat -anptu
显示所有TCP和UDP的网络连接信息,并显示占用该端口的进程的名称和进程ID号,以IP地址和端口号代替主机名和服务名。
ss 网络状态
- -t:显示TCP协议的套接字信息。
- -u:显示UDP协议的套接字信息。
- -d:显示DCCP协议的套接字信息。
- -r:显示RAW协议的套接字信息。
- -a:显示所有连接和监听套接字信息。
- -n:以数字格式显示IP地址和端口号。
- -p:显示套接字对应的进程信息。
- -s:显示套接字的统计信息,如接收和发送的包数量、传输速率等。
- -o:显示TCP协议的计时器信息。
- -i:显示套接字的时间戳信息。
- -h:显示ss命令的帮助信息。
- -l:表示显示所有监听套接字信息。
ss命令的输出结果包括以下内容:
- 协议类型和状态。
- 本地IP地址和端口号。
- 远程IP地址和端口号。
- 套接字对应的进程ID和进程名称。
- 套接字的时间戳信息和计时器信息。
- 套接字的统计信息,如传输的字节数、包数量、传输速率等。
ss -ntl
查看tcp端口
ss -s
tcpdump 抓包
- -i:指定网络接口,如eth0。
- -n:以数字格式显示IP地址和端口号。
- -X:以ASCII码和十六进制编码显示数据包的原始内容。
- -w:将抓取的数据包保存到文件中。
- -r:从文件中读取数据包并进行分析。
- -c:指定抓取数据包的数量。
- -s:指定抓取数据包的大小。
- -v:显示详细的抓包信息。
- -A:以ASCII码显示数据包的原始内容。
tcpdump -i eth1
lsblk
- -a:显示所有块设备,包括未挂载的设备。
- -p:显示块设备的完整路径。
- -f:显示块设备的文件系统类型。
- -m:使用简化的输出格式。
- -o:指定要显示的列,如NAME、MAJ:MIN、SIZE、FSTYPE等。
- -t:显示块设备的树形结构。
- -u:显示块设备的容量单位,如字节、千字节、兆字节等。
history
文件管理
sync/rsync
sync [option]
- -f:禁止使用异步写入磁盘的方式。
- -n:执行同步操作,但不将缓存数据写入磁盘。
- -q:禁止输出同步操作的结果。
rsync [option] source_file target_file
- -a:使用归档模式同步文件,包括文件的权限、时间、属主等属性。
- -r:递归同步目录及其子目录。
- -v:显示同步过程中的详细信息。
- -z:使用压缩算法进行传输,可以节省带宽。
- -n:执行模拟同步操作,不执行真正的同步操作。
- --delete:删除目标目录中不存在于源目录中的文件。
将本地目录/dir1同步到远程主机的目录/dir2中,可以使用以下命令
rsync -avz /dir1/ user@remote_host:/dir2/
tar 压缩文件
- c:创建新的归档文件;
- r:向归档文件中追加文件;
- u:更新归档文件中的文件;
- x:从归档文件中解压文件;
- t:列出归档文件中的文件列表;
- v:归档进度
- z:使用gzip压缩归档文件;
- j:使用bzip2压缩归档文件;
- f:指定归档文件名。
1. 创建归档文件
tar -cf archive.tar file1 file2 dir1
将文件file1、file2和目录dir1打包到归档文件archive.tar中。
2. 解压归档文件
tar -xf archive.tar
将归档文件archive.tar中的所有文件和目录解压到当前目录中。
3. 列出归档文件中的文件列表
tar -tf archive.tar
将列出归档文件archive.tar中的所有文件和目录列表。
4. 向归档文件中追加文件
tar -rf archive.tar file3
将文件file3追加到归档文件archive.tar中。
5. 更新归档文件中的文件
tar -uf archive.tar file1
将更新归档文件archive.tar中的文件file1,如果归档文件中不存在该文件,则会将该文件追加到归档文件中。
6. 使用gzip或bzip2压缩归档文件
tar -czf archive.tar.gz file1 file2 dir1
tar -cjf archive.tar.bz2 file1 file2 dir1
将使用gzip或bzip2压缩归档文件,并将文件file1、file2和目录dir1打包到归档文件中。
1. 排除文件或目录
tar -cf archive.tar --exclude=dir1 file1 file2 dir1
将排除目录dir1,并将文件file1、file2和目录dir1打包到归档文件archive.tar中。
2. 指定归档文件名和路径
tar -cf /tmp/archive.tar /home/user1
将目录/home/user1打包到归档文件/tmp/archive.tar中。
3. 指定归档文件名和压缩格式
tar -czf archive.tar.gz file1 file2 dir1
将使用gzip压缩归档文件,并将文件file1、file2和目录dir1打包到归档文件中。
4. 从网络上下载并解压归档文件
curl https://example.com/archive.tar.gz | tar -xz
将从网址https://example.com/archive.tar.gz下载归档文件并解压到当前目录中。
5. 将归档文件传输到远程主机
tar -czf - file1 file2 dir1 | ssh user@remote_host "cat > /tmp/archive.tar.gz"
将打包、压缩文件和目录,并将归档文件通过ssh传输到远程主机,并保存到/tmp/archive.tar.gz文件中。
rpm 管理包
- -i:安装一个新的软件包。
- -U:升级已有的软件包。
- -e:卸载一个软件包。
- -q:查询已安装的软件包信息。
- -V:验证已安装的软件包是否完整和正确。
- -h:显示rpm命令的帮助信息。
- -a:表示查询所有已安装的软件包
- --nodeps:忽略软件包之间的依赖关系。
- --test:模拟软件包安装或升级过程,以检查是否存在问题。
- --force:强制执行软件包的安装、升级或卸载操作。
rpm命令的输出结果包括以下内容:
- 软件包名称和版本号。
- 软件包的安装路径和文件列表。
- 软件包的依赖关系和冲突关系。
- 软件包的安装状态和信息。
rpm -qa | gerp xxx #查询软件包
rpm -e --nodeps xxx #卸载
rpm -ivh xxx #安装
rpm -qf #查询那个软件包
rpm -ql #安装后生成那些文件
du 详细查看文件大小
- -h:以易读的方式显示文件大小,例如“1K”、“2M”等;
- -s:仅显示总大小,不显示每个子目录或文件的大小;
- -c:在每个子目录或文件大小的下方显示总大小;
- -a:显示所有文件和目录的大小,包括隐藏文件和目录;
- -L:对符号链接指向的文件或目录进行计算,而不是计算符号链接本身的大小;
- --exclude=PATTERN:排除符合特定模式的文件或目录;
- --max-depth=N:设置目录的深度,只计算N级子目录的大小。
du -sh *
diff 比较文件差异
- -q:只显示文件是否有差异,不显示具体差异的内容。
- -r:递归比较目录下的所有文件。
- -u:使用Unified格式显示差异,可以显示更加详细的差异信息。
- -c:使用Context格式显示差异,与Unified格式类似,但是多显示一些上下文信息。
- -i:忽略大小写进行比较。
- -w:忽略空格和制表符的差异。
diff file1 file2
scp
Secure Copy
基于SSH协议的安全文件传输工具,用于在不同的计算机之间进行文件传输。
- -r:递归复制目录。
- -P:指定SSH端口号。
- -p:保留文件的权限、时间戳等属性。
- -C:启用数据压缩。
- -v:显示详细的传输信息。
- -q:静默模式,不显示传输信息。
- -i:指定私钥文件。
- -l:限制传输带宽。
- -B:后台运行scp命令。
安全策略
本文不描述详细策略
端口使用规范
端口号 0 不使用
端口号 1 - 1023,称之为特权端口,系统默认只给root使用
端口号 1024 - 4999 由客户端程序自由分配
端口号 5000 - 65535 由服务器端程序自由分配
netfilter
netfilter是iptables的核心机制,netfilter允许用户通过hook的方式,让Linux内核执行注册的回调函数并完成一系列功能。
1:NF_IP_PRE_ROUTING,位于数据包被路由之前,数据包一致性检查完成后,进入该hook位置。
2:NF_IP_LOCAL_IN,位于数据包被路由后,并且数据包的目的地是本机时。
3:NF_IP_FORWARD,位于数据包被路由后,但数据包目的地址不是本机时。
4:NF_IP_LOCAL_OUT:由本机发出的数据包,在被路由之前,进入该hook处理。
5:NF_IP_POST_ROUTING:即将离开本机的数据包,在该hook被处理。
当Linux内核模块被注册后,注册的函数由可以有5种返回值,不同的返回值,内核会进行不同的处理。
1:NF_ACCEPT,报文被正常处理,允许报文通过。
2:NF_DROP,报文被丢弃。
3:NF_STOLEN,取走这个报文,不在进行后续处理。
4:NF_QUEUE,报文进行重新排队,可以被送到用户程序。
5:NF_REPEAT,对该报文重新调用hook函数。
md5sum md5校验值
查看文件是否修改过
md5sum test.txt
ssh-keygen 生成ssh密钥
ssh-keygen
ssh-copy-id -i id_rsa.pub test@host
firewalld 动态防火墙
阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。
firewall-config 图形化配置
用图形化界面设置更快更省事
firewall-cmd 命令行配置:
firewall-cmd --state && echo "Running" || echo "Not running"
1、域zone相关的命令
--get-default-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域
--get-active-zones 显示当前正在使用的区域与网卡名称
--get-zones 显示总共可用的区域
--new-zone= 新增区域
2、services管理的命令
--get-services 显示预先定义的服务
--add-service=<服务名> 设置默认区域允许该服务的流量
--remove-service=<服务名> 设置默认区域不再允许该服务的流量
3、Port相关命令
--add-port=<端口号/协议> 设置默认区域允许该端口的流量
--remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
4、网卡相关的命令
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
5、查看所有规则的命令
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--permanent 查看永久生效的配置参数、资源、端口以及服务等信息(加上后规则永久生效,需要reload)
6、重载防火墙的策略
--reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
iptables 静态防火墙
RAW表:主要确定是否对数据包进行状态跟踪。
Mangle表:用于修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形等。
NAT表:修改数据包的IP地址,端口等信息。
Filter表:对数据包进行过滤,根据特定规则确定对数据包如何处理。
优先级:mangle > nat > filter
input
匹配目标IP是本机的数据包
output
出口数据包 , 一般不在此链上做配置
forward
匹配流经本机的数据包
prerouting
修改目的地址,用来做 DNAT 。如:把内网中的 80 端口映射到互联网端口
postrouting
修改源地址,用来做 SNAT。如:局域网共享一个公网IP接入Internet。
当一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转送出去。
如果数据包就是进入本机的,它就会到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达POSTROUTING 链输出。
如果数据包是要转发出去的,且内核允许转发,数据包就会经过 FORWARD 链,然后到达 POSTROUTING 链输出。
整体数据包分两类:
1、发给防火墙本身的数据包 ;
2、需要经过防火墙的数据包
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
--sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
iptables支持的过滤条件包括:
- IP地址(源地址、目标地址)
- 端口号(源端口、目标端口)
- 协议类型(TCP、UDP、ICMP等)
- 网络接口(输入接口、输出接口)
- 标记(标记数据包,以便后续处理)
iptables支持的动作包括:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包。
- REJECT:拒绝数据包,并向发送端发送一个拒绝报文。
- LOG:将数据包记录到系统日志中。
- MASQUERADE:网络地址转换,用于将内部IP地址转换为公网IP地址进行访问。
- SNAT:源地址转换,用于修改数据包的源IP地址。
- DNAT:目标地址转换,用于修改数据包的目标IP地址。
- REDIRECT:数据包重定向,用于将数据包重定向到指定的端口号或IP地址。
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I 在规则链的头部加入新规则
-D 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号
-t, --table table 对指定的表 table 进行操作.
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;
selinux 安全上下文
SELinux配置文件位于 /etc/selinux/config
SELINUX=enforcing 此项定义selinux状态。
enforcing—强制模式,系统受selinux保护。就是你违反了策略,你就无法继续操作下去
permissive—提示模式,系统不会受到selinux保护,只是收到警告信息。
提示模式时Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来(警告信息)
disabled—禁用selinux。
SELINUXTYPE=targeted
此项定义selinux使用哪个策略模块保护系统。
targeted只对apache ,sendmail,bind,postgresql,nfs,cifs等网络服务保护。
setenforce 0
临时关闭SELinux
setenforce 1
临时打开SELinux
getenforce
查看SELinux状态
sestatus
查看SELinux工作模式
lsattr 显示文件属性
chattr 防止文件修改
磁盘管理
system ID:
- 83:Linux文件系统分区
- 82:Linux swap分区
- 7:Windows NTFS分区
- 1:FAT16分区
- 8e:Linux LVM分区
df 查询磁盘情况
可以显示文件系统的总容量、已用空间、可用空间和使用率等信息
- `-h`:以人类可读的方式显示磁盘使用情况,例如以GB、MB或KB为单位。
- `-T`:显示文件系统类型。
- `-t`:只显示指定类型的文件系统,例如只显示ext4类型的文件系统。
- `-i`:显示文件系统的inode使用情况,而不是磁盘空间使用情况。
- `-x`:不显示指定类型的文件系统,例如不显示tmpfs类型的文件系统。
- 显示所有已挂载的文件系统的磁盘使用情况:
df
- 以人类可读的方式显示所有已挂载的文件系统的磁盘使用情况:
df -h
- 显示指定文件系统的磁盘使用情况:
df /dev/sda1
- 显示指定类型的文件系统的磁盘使用情况:
df -t ext4
- 显示文件系统的inode使用情况:
df -i
`df`命令可以帮助系统管理员或用户了解当前文件系统的空间使用情况,以便他们及时采取措施来管理和优化文件系统的存储资源。
dd 复制转换文件设备
input_file和output_file表示输入文件和输出文件的路径,if表示输入文件,of表示输出文件。
- iflag:用于指定输入文件的属性,例如iflag=direct表示使用直接IO方式读取文件。
- oflag:用于指定输出文件的属性,例如oflag=direct表示使用直接IO方式写入文件。
- bs:用于指定每次读取或写入的数据块大小,默认为512字节。
- count:用于指定读取或写入的数据块数量。
- skip:用于指定输入文件中跳过的数据块数量。
- seek:用于指定输出文件中跳过的数据块数量。
复制文件或设备
dd if=/dev/sda of=/dev/sdb bs=4096
创建指定大小的文件
dd if=/dev/zero of=file.txt bs=1M count=10
将ISO镜像写入U盘
dd if=image.iso of=/dev/sdb bs=4M
fsck 修复磁盘数据
- -a:自动修复文件系统错误。
- -c:检查设备的坏道,需要较长时间。
- -f:强制检查文件系统,即使文件系统看起来正常。
- -V:显示详细的检查和修复过程。
通常,使用fsck命令检查和修复文件系统的流程如下:
1. 卸载要检查和修复的文件系统,例如umount /dev/sda1。
2. 使用fsck命令检查和修复文件系统,例如fsck /dev/sda1。
3. 等待fsck命令完成检查和修复操作。
4. 重新挂载文件系统,例如mount /dev/sda1 /mnt。
fsck -a /dev/sda1
mkfs 创建或格式化磁盘
mkfs -t ext4 /dev/sda1
将/dev/sda1磁盘创建为ext4格式
mkfs.xfs -f test.rar
test.rar为ext4格式,强制改为xfs格式
fdisk 磁盘分区(MBR)
fdisk /dev/sda
1. p:查看当前分区表的信息。
2. n:创建一个新分区。
3. d:删除一个分区。
4. t:设置一个分区的类型。
5. w:将修改后的分区表写入磁盘。
LVM 逻辑卷
PV(physical volume):物理卷在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区。
它只是在物理分区中划出了一个特殊的区域,用于记载与LVM相关的管理参数。
VG(volume group):卷组建立在物理卷上,一卷组中至少要包括一物理卷,
卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。
LV(logical volume):逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,
逻辑卷建立后可以动态扩展和缩小空间。
PE(physical extent):物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,
同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。
LE(logical extent):逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
由于受内核限制的原因,一个逻辑卷(Logic Volume)最多只能包含65536个PE(Physical Extent),
所以一个PE的大小就决定了逻辑卷的最大容量,4 MB(默认) 的PE决定了单个逻辑卷最大容量为 256 GB,
若希望使用大于256G的逻辑卷,则创建卷组时需要指定更大的PE。
将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。
管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。
管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。
将现有的食材(磁盘)放到锅里弄成一锅炖菜(逻辑卷组),炖煮好后(设定好后)分配给每一个碗(逻辑卷)
线性模式
写完一个设备后再写另一个设备
条带模式
数据是被分散写入到LVM各设备上
因为条带模式的数据不具有安全性,且LVM并不强调读写性能,故LVM默认为线性模式。
物理卷(pv)
pvcreate:创建物理卷。
- 语法:pvcreate [选项] 物理卷
- 示例:pvcreate /dev/sdb1
pvdisplay:显示物理卷信息。
- 语法:pvdisplay [选项] [物理卷路径]
- 示例:pvdisplay /dev/sdb1
pvmove:将物理卷上的数据移动到其他物理卷。
- 语法:pvmove [选项] 源物理卷路径 目标物理卷路径
- 示例:pvmove /dev/sdb1 /dev/sdd1
pvremove:删除物理卷。
- 语法:pvremove [选项] 物理卷路径
- 示例:pvremove /dev/sdb1
pvscan:扫描物理卷信息。
- 语法:pvscan [选项]
- 示例:pvscan
pvresize:调整物理卷大小。
- 语法:pvresize [选项] 物理卷路径
- 示例:pvresize /dev/sdb1
------------
卷组(vg)
vgcreate:创建卷组。
- 语法:vgcreate [选项] 卷组 物理卷...
- 示例:vgcreate vg1 /dev/sdb1 /dev/sdc1
vgdisplay:显示卷组信息。
- 语法:vgdisplay [选项] [卷组名称]
- 示例:vgdisplay vg1
vgremove:删除卷组。
- 语法:vgremove [选项] 卷组名称
- 示例:vgremove vg1
vgextend:添加物理卷到卷组中。
- 语法:vgextend [选项] 卷组名称 物理卷...
- 示例:vgextend vg1 /dev/sdd1
vgreduce:从卷组中删除物理卷。
- 语法:vgreduce [选项] 卷组名称 物理卷...
- 示例:vgreduce vg1 /dev/sdd1
vgscan:扫描卷组信息。
- 语法:vgscan [选项]
- 示例:vgscan
vgchange:修改卷组属性。
- 语法:vgchange [选项] 卷组名称
- 示例:vgchange -a n vg1
------------
逻辑卷(lv)
lvcreate:创建逻辑卷。
- 语法:lvcreate [选项] [-l|--extents 逻辑区块数] [-L|--size 逻辑卷大小] [-n|--name 逻辑卷名称] 卷组
- 示例:lvcreate -n lv1 -L 10G vg1
lvextend:扩展逻辑卷。
- 语法:lvextend [选项] 逻辑卷物理路径
- 示例:lvextend -L +5G /dev/mapper/vg1-lv1
lvreduce:缩小逻辑卷。
- 语法:lvreduce [选项] 逻辑卷物理路径
- 示例:lvreduce -L -5G /dev/mapper/vg1-lv1
lvdisplay:显示逻辑卷信息。
- 语法:lvdisplay [选项] [逻辑卷物理路径]
- 示例:lvdisplay /dev/mapper/vg1-lv1
lvmove:移动逻辑卷数据到其他物理卷。
- 语法:lvmove [选项] 逻辑卷物理路径 目标物理卷路径
- 示例:lvmove /dev/mapper/vg1-lv1 /dev/sdd1
lvremove:删除逻辑卷。
- 语法:lvremove [选项] 逻辑卷物理路径
- 示例:lvremove /dev/mapper/vg1-lv1
lvrename:重命名逻辑卷。
- 语法:lvrename [选项] 原逻辑卷名称 新逻辑卷名称
- 示例:lvrename /dev/vg1/lv1 /dev/vg1/lvnew
lvresize:调整逻辑卷大小。
- 语法:lvresize [选项] 逻辑卷物理路径
- 示例:lvresize -L 20G /dev/mapper/vg1-lv1
lvmove:移动逻辑卷数据到其他物理卷。
- 语法:lvmove [选项] 逻辑卷物理路径 目标物理卷路径
- 示例:lvmove /dev/mapper/vg1-lv1 /dev/sdd1
lvconvert:将逻辑卷转换为其他类型的逻辑卷。
- 语法:lvconvert [选项] 目标类型 逻辑卷物理路径
- 示例:lvconvert --type raid1 /dev/mapper/vg1-lv1
lvscan:扫描逻辑卷信息。
- 语法:lvscan [选项]
- 示例:lvscan
lvchange:修改逻辑卷属性。
- 语法:lvchange [选项] 逻辑卷物理路径
- 示例:lvchange -a y /dev/mapper/vg1-lv1
#1.将各物理磁盘或分区的系统类型设为Linux LVM,其system ID为8e,通过fdisk工具中的t命令设置
[root@localhost ~]# fdisk /dev/sda
...
Command (m for help): n
First cylinder (1593-3916, default 1593):
Using default value 1593
Last cylinder, +cylinders or +size{K,M,G} (1593-3916, default 3916): +5G
...
Command (m for help): t
Partition number (1-6): 5
Hex code (type L to list codes): 8e # 指定system ID为8e
Changed system type of partition 5 to 8e (Linux LVM)
...
Command (m for help): p
...
/dev/sda5 1593 2246 5252227+ 8e Linux LVM
/dev/sda6 2247 2900 5253223+ 8e Linux LVM
/dev/sda7 2901 3554 5253223+ 8e Linux LVM
Command (m for help): w
...
#将/dev/sda重新进行分区映射
[root@localhost ~]# partx -a /dev/sda
...
[root@localhost ~]# kpartx -af /dev/sda
...
------------
#2.将各物理磁盘或分区初始化为PV(physical volume,物理卷),这一阶段可使用的命令为pvcreate、pvremove、pvscan、pvdisplay(pvs)
[root@localhost ~]# pvcreate /dev/sda{5,6,7} # 将三个分区初始化为物理卷
Physical volume "/dev/sda5" successfully created
Physical volume "/dev/sda6" successfully created
Physical volume "/dev/sda7" successfully created
[root@localhost ~]# pvscan
PV /dev/sda5 lvm2 [5.01 GiB]
PV /dev/sda6 lvm2 [5.01 GiB]
PV /dev/sda7 lvm2 [5.01 GiB]
Total: 3 [15.03 GiB] / in use: 0 [0 ] / in no VG: 3 [15.03 GiB]
[root@localhost ~]# pvdisplay /dev/sda5 # 显示物理卷sda5的详细信息
"/dev/sda5" is a new physical volume of "5.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sda5
VG Name
PV Size 5.01 GiB
Allocatable NO
PE Size 0 # 由于PE是在VG阶段才划分的,所以此处看到的都是0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID lrNOS3-8U21-ZS8o-eyKH-HqPn-DLhX-W1ppl4
[root@localhost ~]# pvremove /dev/sda7 # 删除sda7的物理卷信息
Labels on physical volume "/dev/sda7" successfully wiped
[root@localhost ~]# pvscan # 可以看到PV列表中已无sda7
PV /dev/sda5 VG testvg lvm2 [5.01 GiB / 5.01 GiB free]
PV /dev/sda6 VG testvg lvm2 [5.01 GiB / 5.01 GiB free]
[root@localhost ~]# pvcreate /dev/sda7
Physical volume "/dev/sda7" successfully created
------------
#3.创建VG(volume group,卷组)。卷组将多个物理卷整合起来(屏蔽了底层细节),并划分PE(physical extend)。PE是物理卷中的最小存储单元,有点类似于文件系统中的block,PE大小可指定,默认为4M。这一阶段用到的命令有vgcreate、vgscan、vgdisplay、vgextend、vgreduce
[root@localhost ~]# vgcreate -s 8M testvg /dev/sda{5,6} # 使用sda5、sda6创建卷组,指定PE大小为8M
Volume group "testvg" successfully created
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "testvg" using metadata type lvm2
[root@localhost ~]# vgdisplay # 查看卷组详细信息
--- Volume group ---
VG Name testvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write # 可读写
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 10.02 GiB # 卷组容量
PE Size 8.00 MiB
Total PE 1282 # PE总数
Alloc PE / Size 0 / 0 # 分配的容量
Free PE / Size 1282 / 10.02 GiB # 空闲的容量
VG UUID 5zBY8e-5Cgc-HqSo-BOiZ-02NX-77ON-NJSCbN
------------
#4.在卷组上创建LV(logical volume,逻辑卷)。为了便于管理,逻辑卷对应的设备文件保存在卷组目录下,为/dev/VG_NAME/LV_NAME。LV中可以分配的最小存储单元称为LE(logical extend),在同一个卷组中,LE的大小和PE是一样的,且一一对应。这一阶段用到的命令有lvcreate、lvscan、lvdisplay、lvextend、lvreduce、lvresize
[root@localhost ~]# lvcreate -L 500M -n testlv testvg # 创建大小为500M、名为testlv的逻辑卷
Rounding up size to full physical extent 504.00 MiB
Logical volume "testlv" created
[root@localhost ~]# lvscan
ACTIVE '/dev/testvg/testlv' [504.00 MiB] inherit
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/testvg/testlv
LV Name testlv
VG Name testvg
LV UUID 0fPpO3-gVaI-ZKqi-xHnc-uaHk-u6of-i5wds7
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2015-10-18 22:05:18 +0800
LV Status available
# open 0
LV Size 504.00 MiB
Current LE 63
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
------------
#格式化逻辑卷并挂载
[root@localhost ~]# mke2fs -t ext4 /dev/testvg/testlv
...
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
...
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/testvg/testlv /data
[root@localhost ~]# cp /etc/inittab /data
[root@localhost ~]# ls /data
inittab lost+found
------------
#扩展文件系统
[root@localhost ~]# vgextend testvg /dev/sda7 # 假如卷组容量不够,扩展文件系统之前先扩展卷组
Volume group "testvg" successfully extended
[root@localhost ~]# lvextend -L +300M /dev/testvg/testlv
Rounding size to boundary between physical extents: 304.00 MiB
Snapshot origin volumes can be resized only while inactive: try lvchange -an
Run `lvextend --help` for more information.
[root@localhost ~]# umount /dev/testvg/testlv_snap
[root@localhost ~]# lvremove /dev/testvg/testlv_snap # 要增减逻辑卷,需要先删除对对应的快照卷
Do you really want to remove active logical volume testlv_snap? [y/n]: y
Logical volume "testlv_snap" successfully removed
[root@localhost ~]# lvextend -L +300M /dev/testvg/testlv # 逻辑卷扩大300M
Rounding size to boundary between physical extents: 304.00 MiB
Extending logical volume testlv to 808.00 MiB
Logical volume testlv successfully resized
[root@localhost ~]# resize2fs /dev/testvg/testlv # 扩展文件系统
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/testvg/testlv is mounted on /data; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 4
Performing an on-line resize of /dev/testvg/testlv to 827392 (1k) blocks.
The filesystem on /dev/testvg/testlv is now 827392 blocks long.
[root@localhost ~]# df -h # 显示容量确实已扩大
...
/dev/mapper/testvg-testlv 783M 11M 732M 2% /data
------------
#缩减文件系统(离线操作)
[root@localhost ~]# umount /dev/testvg/testlv # 缩减文件系统之前要先卸载
[root@localhost ~]# e2fsck -f /dev/testvg/testlv # 检测文件系统
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/testvg/testlv: 12/206848 files (0.0% non-contiguous), 36856/827392 blocks
[root@localhost ~]# resize2fs /dev/testvg/testlv 500M # 缩减文件系统至500M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/testvg/testlv to 512000 (1k) blocks.
The filesystem on /dev/testvg/testlv is now 512000 blocks long.
[root@localhost ~]# lvreduce -L 500M /dev/testvg/testlv # 缩减逻辑卷至500M
Rounding size to boundary between physical extents: 504.00 MiB
WARNING: Reducing active and open logical volume to 504.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce testlv? [y/n]: y
Reducing logical volume testlv to 504.00 MiB
Logical volume testlv successfully resized
[root@localhost ~]# mount /dev/testvg/testlv /data # 重新挂载
[root@localhost ~]# df -h # 显示容量确实已减小
...
/dev/mapper/testvg-testlv 485M 11M 449M 3% /data
[root@localhost ~]# vgchange -an testvg # 当我们一段时间内不再使用卷组时,可将其休眠
Logical volume testvg/testlv contains a filesystem in use.
Can\'t deactivate volume group "testvg" with 1 open logical volume(s)
[root@localhost ~]# umount /data # 休眠之前先卸载逻辑卷
[root@localhost ~]# umount /mnt
[root@localhost ~]# vgchange -an testvg
0 logical volume(s) in volume group "testvg" now active
[root@localhost ~]# vgchange -ay testvg # 重新激活卷组
1 logical volume(s) in volume group "testvg" now active
[root@localhost ~]# vgremove testvg # 若打算以后都不再使用,可删除卷组
Do you really want to remove volume group "testvg" containing 1 logical volumes? [y/n]: y
Do you really want to remove active logical volume testlv? [y/n]: y
Logical volume "testlv" successfully removed
Volume group "testvg" successfully removed
------------
#创建快照卷
[root@localhost ~]# mount -o remount,ro /dev/testvg/testlv /data # 创建快照卷之前先将对应的逻辑卷改为只读
[root@localhost ~]# lvcreate -s -L 512M -n testlv_snap /dev/testvg/testlv # 创建大小为512M的快照
Logical volume "testlv_snap" created
[root@localhost ~]# mount -o remount,rw /dev/testvg/testlv /data # 将逻辑卷改回为读写
[root@localhost ~]# mount /dev/testvg/testlv_snap /mnt
[root@localhost ~]# df -h # 可以看到快照和其对应的逻辑卷显示的参数值一样
...
/dev/mapper/testvg-testlv 489M 11M 453M 3% /data
/dev/mapper/testvg-testlv_snap 489M 11M 453M 3% /mnt
[root@localhost ~]# ls /mnt
inittab lost+found
[root@localhost ~]# cp /etc/passwd /data # 向原始卷中新增一些数据
[root@localhost ~]# ls /data
inittab lost+found passwd
[root@localhost ~]# ls /mnt # 快照所显示的文件系统状态仍是创建那一刻的
inittab lost+found
标签:文件,命令,指定,dev,备忘录,Linux,进程,root
From: https://www.cnblogs.com/mugetsukun/p/17303267.html