Linux基础知识

一、概述
用户使用操作系统来调度硬件进行工作。实际是内核调度硬件,内核能识别计算机语言,解释器将高级语言翻译成机器语言。
Linux系统由Linux系统内核和系统级应用程序组成,Linux系统内核有调度硬件的能力。
内核无法被用户直接使用,需要配合应用程序才能被用户使用。在内核之上,封装系统级应用程序,称之为Linux发行版。
linux内核版本和linux系统版本是两个东西。linux内核版本通过 # uname -a 获取全部的系统信息。
二、目录树
1、在Linux系统中,一切皆文件。2、Linux严格区分大小写的。3、Linux文件"扩展名"只是为了方便运维人员区分,Linux系统是通过“权限位标识符”来确定文件类型。(黑色或白色为普通文件,蓝色为目录文件夹,绿色为可执行文件)4、Linux中存储设备都必须先挂载之后才能使用,临时挂载# mount /dev/sr0 /mnt/file

/bin:系统命令目录
/sbin:超级命令目录,只能超级管理员可以执行的命令
/home:普通用户的家目录,用户登录后会自动切换到此目录(每创建一个用户,其在/home下就会生成一个与用户同名文件夹作为家目录)
/root:超级管理员的家目录,超级管理员登录后会自动切换到此目录
/etc :很重要,系统的配置文件目录。大部分软件安装完成后,其配置文件都存放在此目录,如用户信息、服务的启动脚本、常用服务的配置文件等。
/boot:系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等。类似于Windows中的C盘。
/dev :设备文件目录,硬盘、光驱、U盘都属于设备文件,/dev/sr0代表光驱设备。注意,此目录下的文件没有办法直接使用,必须先挂载。存储设备必须先挂载后使用。
/media:挂载目录,用来挂载媒体设备,如软盘和光盘。
/mnt:挂载目录,用来挂载额外的设备,如 U 盘、移动硬盘和其他操作系统的分区。
/opt :第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/ 目录中,也就是说,/usr/local/ 目录也可以用来安装软件
/usr :系统程序目录,类似Windows中的Program Files
/run:正在运行软件的程序目录,mysql => mysql*.pid进程文件,mysql.sock套接字文件(用来连数据库的)。 
/tmp :临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。
/var :经常变化的文件目录,网页文件、数据文件、日志文件。
/srv:服务数据目录。一些系统服务启动后,在这个目录中保存所需要的数据。
/lib:系统调用的函数库保存位置(核心类库)
/proc:虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存设备驱动的列表的,/proc/filesystems 是保存文件系统列表的,/proc/net 是保存网络协议信息的。
/sys:虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息。

三、基础命令

# 是root命令环境,$是普通用户命令环境
Tab键补全命令,记住命令的前几个字母,按Tab键,系统会自动进行补全操作。
有些命令可能都以某几个字母开头,此时只需要按两次Tab键,其就会显示所有命令,供你查询所需命令。
man 加命令或命令加  --help 求帮助
# man tar  或 # tar --help
command    options        arguments
命令        选项           参数
[root@cloud ~]# ls   -l   test.txt
command: ls
options: -l
arguments: test.txt
…  列表
[ ] 可选项
命令、选项、参数,每个部分用空格隔开
- 后面的参数是字符形式,-- 后面的参数是单词形式
su命令,切换用户;# su - root
-横杠代表切换用户的同时,切换用户的家目录。
注意:-横杠前后都要有空格隔开。
uname命令,查看操作系统相关信息;# uname -a
-a :all缩写,显示全部的系统信息(类型、全部主机名、内核版本、发布时间、开源计划)
pwd命令,查看当前所在目录位置;# pwd
clear命令,清屏;# clear(清屏快捷键ctrl + l)
type命令,判断命令的类型(内部命令或外部命令);# type 命令
内部命令:命令 is a shell builtin,外部命令:没有显示以上信息的就是外部命令
history命令,查看历史输入命令;# history  
显示系统以前输入的前1000条命令,右键copy复制,paste粘贴
reboot命令,立即重启计算机;# reboot
shutdown加-r参数重启计算机
# shutdown -r 60,含义:延迟重启,60分之后重启
# shutdown -r now,含义:立即重启
说明:重启等待期间,可shutdown -c取消操作(先按Ctrl + C中断程序,再按# shutdown -c取消)
shutdown命令,立即关机或延迟关机
# shutdown   含义:不加参数默认使系统在1分钟后关机
立即关机写法:
# shutdown now  # shutdown -h 0   # shutdown -h now    # halt -p
延迟关机写法:
# shutdown -h 分钟数  代表多少分钟后,自动关机
等待期间后悔了,想取消关机(快捷键ctrl + c,是中断程序运行)
# 按Ctrl + C(CentOS6,中断关机。CentOS7中还需要使用shutdown -c命令,# shutdown -c)
ls命令,以平铺的形式显示指定目录下的文件信息;# ls
# ls 指定目录的绝对路径或相对路径,以平铺的形式显示指定目录下的文件信息
# ls -l,以详细列表的形式显示指定目录下的文件信息(简写=># ll)
# ls -lh,-h通常与-l结合使用,以较高的可读性显示文件的大小(带单位)(kb/mb/gb)1KB= 1024B(字节,byte)
# ls -a,显示所有文件(包含隐藏文件,大部分以.开头)
# ls -d /tmp     查看指定目录名
# ls -ld /tmp   或  # ll -d /tmp   查看目录详细信息
绝对路径:不管当前工作路径是在哪,目标路径都会从“/”磁盘根下开始
/根目录/路径/路径,绝对路径必须以左斜杠开头,一级一级向下访问,不能越级。
相对路径:除绝对路径之外的路径称之为相对路径,相对路径得有一个相对物(当前工作路径)。
只要看到路径以“/”开头则表示该路径是绝对路径,除了以“/”开头的路径称之为相对路径。
当前位置:/home目录下
../:表示上级目录(上一级)   (根目录/)
./ :表示当前目录(同级),    (ls ./ 和ls一样效果)
文件夹名称/:表示下级目录(下一级),注意最好目录后面加个斜杠/  (ls mpp 和 ls mpp/一样)
cd命令,切换目录;# cd [路径],路径既可以是绝对路径,也可以是相对路径
快速回到自己的家目录,(波浪线~,代表家目录)# cd  或  # cd ~ 
返回上一级目录 # cd ..
hostnamectl命令,查看或设置计算机的主机名称。
永久设置计算机的主机名称,# hostnamectl set-hostname yunwei.baidu.com
# su   立即生效
CentOS 7中和主机名有关的文件为/etc/hostname,它是在系统初始化的时候被读取的,并且内核根据它的内容设置瞬态主机名。
设置计算机永久的主机名称:
1、使用静态的 2、改/etc/hostname文件
linux系统分区时至少分三个分区:
/boot分区(系统分区,装linux系统内核的)
swap交换分区,一般情况下为内存的1~2倍,但是尽量不要超过2G。实际内存不够了,linux系统会从硬盘中划分一部分空间充当内存使用。
swap交换分区会在实际内存不够使用情况下当临时内存来使用,交换分区一般等同于实际内存的大小。
/根分区,所有文件都是放在此目录中。
清屏快捷键ctrl + l
快捷键ctrl + c 中断程序
快捷键:ctrl + d,退出、等价exit,注销用户用exit或logout命令或快捷键ctrl加d
退出当前账户的登录,返回上一个登录的账号,相当于logout命令注销当前用户。
方向键上下查看历史输入命令
ctrl + z,将当前程序放到后台挂起
# stat /etc/passwd    查看文件的具体信息(文件修改时间等)
# file /etc/passwd   查看文件类型

四、文件管理

mkdir创建目录,# mkdir 目录名称
多级目录一起创建,# mkdir -p 目录名称1/目录名称2/...
-p:递归创建,从左边的路径开始一级一级创建目录,直到路径结束
同时创建多个目录,# mkdir 目录名称1 目录名称2 目录名称3
rmdir删除空目录(只能删除空目录),# rmdir 目录名称
删除某个空目录,# rmdir 目录名称
-p: 同时删除多级空目录(从右向左一级一级删除)
# rmdir -p 目录名称1/目录名称2/...
同时删除多个空目录,# rmdir 目录名称1 目录名称2 目录名称3
 
touch创建文件,# touch 文件名称
在指定目录下创建一个文件,# touch 文件名称
同时创建多个文件,# touch 文件名称1 文件名称2 文件名称3 
{1..5}根据序号同时创建多个文件,# touch 文件名称{开始序号..结束序号}
根据开始序号~结束序号,一个一个创建文件,中间只有两个..表示连续的
#touch file{1..5}.txt   在当前路径下创建file1.txt file2.txt file3.txt file4.txt file5.txt五个文件

rm删除文件,# rm 文件名称
# rm 文件名称
# rm 文件名称1 文件名称2 文件名称3
# rm -f 文件名称 => 强制删除,不提示
# rm -rf 文件夹名称 => 强制递归删除文件夹,不提示
-r :递归删除(无论文件夹是否为空)针对文件夹,代表递归删除,先把目录下的所有文件删除,然后在删除文件夹
-f :强制删除不提示

cp复制,cp复制并重命名文件
复制文件,# cp 源文件名称 指定路径
复制文件并重命名,# cp 源文件名称 指定路径/新文件名称
复制文件夹,# cp -r 源文件夹 指定路径
复制文件夹并重命名,# cp -r 源文件夹名称 指定路径/新文件夹名称

mv剪切,mv 重命名
剪切文件,# mv 源文件名称 目标路径/
剪切文件夹,# mv 源文件夹名称 目标路径/
文件或文件夹重命名,# mv 源文件或文件夹名称 新文件或文件夹名称
mv只能重命名单个文件,不能重命名多个文件
# mv file[1-3].jpg test[1-3].jpg  不行会有问题
rename 批量重命名文件
# rename file test file?.jpg

打包,指一个文件或目录的集合,占用的空间是所有文件和目录的总和。
在Linux操作系统中,其拥有很多压缩工具,如gzip、bzip2、xz等等,但是其有一个缺点:一次只能压缩一个文件(而且无法压缩文件夹),所以要先集中打包到一个文件集合再压缩。
打包,把一个或多个文件打成tar包,并不是压缩,只是把文件合并在一个tar文件中。为什么要打包,就是为了后期的压缩操作。
Linux打包操作,# tar [选项] 打包后的名称.tar 多个文件或文件夹
-c :打包
-f :filename,打包后的文件名称,-f 必须放到所有参数的最后一位
-v :显示打包的进度
-u :update缩写,更新追加原打包文件中的文件(了解)
-t :查看打包的文件内容(了解)
把a.txt、b.txt、c.txt文件打包到abc.tar文件中,# tar -cvf abc.tar a.txt b.txt c.txt
查看abc.tar包中的文件信息,# tar -tf abc.tar
# tar -uf 打包后的文件名称   追加文件
向abc.tar包中添加一个d.txt文件
# touch d.txt
# tar -uf abc.tar d.txt
查看是否添加成功,# tar -tf abc.tar
Linux释放操作,把tar包中的文件释放出来,释放(-c 变成 -x)
# tar -cf abc.tar a.txt b.txt c.txt  打包
# tar -xf abc.tar  释放

压缩,也是一个文件和目录的集合,但压缩文件所占用的磁盘空间比集合中所有文件大小的总和要小。
打包并压缩,# tar [选项] 压缩后的压缩包名称 要压缩的文件或文件夹
-cf :对文件或文件夹进行打包
-v :显示压缩进度
-z :用gzip压缩工具把打包后的文件压缩为.tar.gz        这个用的多
-j  :用bzip2压缩工具把打包后的文件压缩为.tar.bz2
-J :用xz压缩工具把打包后的文件压缩为.tar.xz
压缩速度:gzip > bzip2 > xz
压缩率:gzip < bzip2 < xz
文件和大小为100M   不同工具压缩后大小依次为:90M  80M   70M
把a.txt、b.txt、c.txt文件打包并压缩为abc.tar.gz
# tar -zcf abc.tar.gz a.txt b.txt c.txt
把wechat文件夹压缩为wechat.tar.gz格式的压缩包
# tar -zcf wechat.tar.gz wechat
# tar -zcf 压缩包名称.tar.gz 文件或文件夹名称
# tar -jcf 压缩包名称.tar.bz2 文件或文件夹名称
# tar -Jcf 压缩包名称.tar.xz 文件或文件夹名称
对压缩包进行解压,解压,把压缩的参数中的c换成x
*.tar.gz格式的压缩包
# tar -zxf 名称.tar.gz
*.tar.bz2格式的压缩包
# tar -jxf 名称.tar.bz2
*.tar.xz格式的压缩包
# tar -Jxf 名称.tar.xz
通用解压,自动识别压缩格式,并自动选择相应工具,解压缩
# tar -xf 压缩包名称
# tar -xf abc.tar.xz
解压到指定路径,-C 指定路径
# tar -zxf 压缩包名称.tar.gz -C 指定路径

zip压缩与解压缩
问题:Linux下已经有gzip、bzip2以及xz压缩命令了,为什么还需要使用zip压缩呢?
答:zip格式在Windows以及Linux中都是可以正常使用的。
既可以在Windows中使用的,也可以在Linux中使用的通用的压缩格式。
zip压缩,# zip [选项] 压缩后的文件名称.zip  要压缩的文件或文件夹
-r :递归压缩,针对文件夹
把a.txt、b.txt、c.txt进行压缩为abc.zip
# zip abc.zip a.txt b.txt c.txt
把wechat文件夹压缩为wechat.zip
# zip -r wechat.zip wechat
unzip解压缩
解压到当前目录,# unzip 压缩包名称
解压到指定路径下,# unzip 压缩包名称 -d 指定路径  
对abc.zip文件进行解压缩,# unzip abc.zip
把wechat.zip解压到/usr/local/nginx目录下,# unzip wechat.zip -d /usr/local/nginx/

五、vim文件编辑器
vim 中存在3种模式:
命令模式​ 编辑模式(输入/插入模式) 末行模式(尾行模式)
1、命令模式:使用vim编辑器时,默认处于命令模式。在该模式下可以移动光标位置,可以对文件内容进行复制、粘贴、删除等操作。
2、编辑模式:在该模式下可以对文件的内容进行编辑。(按ESC退回命令模式)在命令模式下输入小写字母a或小写字母i或小写字母o,即可进入编辑模式。
3、末行模式:可以在末行输入命令来对文件内容进行查找、替换、保存、退出等操作。(按两下ESC退回命令模式)在命令模式下输入冒号:或斜杠/即可进入末行模式。

使用vim打开文件,# vim 文件名称
1、如果文件已存在,则直接打开
2、如果文件不存在,则vim编辑器会自动在内存中创建一个新文件
用vim命令打开readme.txt文件,# vim readme.txt
vim编辑器保存文件并退出:在任何模式下,连续按两次Esc键,即可返回到命令模式。然后按冒号:进入到末行模式,输入wq,回车,代表保存并退出。
vim编辑器强制退出(不保存):在任何模式下,连续按两次Esc键,即可返回到命令模式。然后按冒号:进入到末行模式,输入q!,回车,代表强制退出但是不保存文件。

命令模式下的相关操作
问:如何进入命令模式?
答:在Linux操作系统中,使用vim命令直接打开某个文件时,默认进入的就是命令模式。如果我们处于其他模式(编辑模式、末行模式)可以连续按两次Esc键也可以返回命令模式。
命令模式能做什么?
移动光标、复制/粘贴、剪切/删除、撤销与恢复
移动光标位置,首行 => gg,末行 => G,快速定位指定行,行号G,如150G
移动光标到首行 => gg
移动光标到末行 => G
也可通过上下左右按键移动光标。
行号 + G,如150G代表快速移动光标到第150行。
复制/粘贴,yy p 5yy p
1、复制当前行(光标所在那一行)
按键:yy
粘贴:在想要粘贴的地方按下小p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用大P键
2、从当前行开始复制指定的行数,如复制5行,5yy
粘贴:在想要粘贴的地方按下小p 键【将粘贴在光标所在行的下一行】,如果想粘贴在光标所在行之前,则使用大P键
剪切/删除,dd p 5dd p
在VIM编辑器中,剪切与删除都是dd
如果剪切了文件,但是没有使用p进行粘贴,就是删除操作
如果剪切了文件,然后使用p进行粘贴,这就是剪切操作
1、剪切/删除当前光标所在行
按键:dd (删除之后下一行上移)
粘贴:p
注意:dd 严格意义上说是剪切命令,但是如果剪切了不粘贴就是删除的效果。
2、剪切/删除多行(从当前光标所在行开始计算)
按键:数字dd
粘贴:p
3、特殊用法:剪切/删除光标所在的当前行,但是删除之后下一行内容不上移
按键:D (删除之后当前行会变成空白行,下一行内容不上移)
撤销/恢复,u/ctrl + r
撤销:u     (windows 撤销的ctrl + z)
恢复:ctrl + r(取消撤销)   (windows 取消撤销的ctrl + y)

末行模式下的相关操作
在命令模式下输入冒号:或斜杠/即可进入末行模式。
末行模式下能做什么?
文件保存、退出、查找与替换、显示行号、paste模式等
文件保存/退出,:wq/:q!/:q
:wq,文件先保存后退出(保存并退出)
:q!,强制退出但是文件未保存(不建议使用)
:q,退出当前正在编辑的文件,但要注意,文件必须先保存再退出
直接vim 空白进入,没有vim进入指定文件。如果一个文件在编辑时没有名字,则可以使用:wq 文件名称,代表把当前正在编辑的文件保存到指定的文件名称中,然后退出。
文件内容的查找,在命令模式输入斜杠/,进入末行模式,输入要查找的关键词,然后回车,关键词(高亮显示),末行模式:noh(取消高亮)
如果在一个文件中,存在多个满足条件的结果。在搜索结果中切换上/下一个结果:N/n (大写N代表上一个结果,小写n代表next)关键词(高亮显示)
如果需要取消高亮,则需要在末行模式中输入:noh【no hlight】
文件内容的替换,在命令模式下输入冒号: 进入末行模式,
:s/要替换的关键词/替换后的关键词   替换光标所在行首个
:s/要替换的关键词/替换后的关键词/g    替换光标所在行所有
:%s/要替换的关键词/替换后的关键词     替换文档的每行首个
:%s/要替换的关键词/替换后的关键词/g    替换文档所有
1、只替换光标所在这一行的第一个满足条件的结果(只能替换1次)
:s/要替换的关键词/替换后的关键词 + 回车
案例:把hello centos中的centos替换为centos7.6
切换光标到hello centos这一行
:s/centos/centos7.6
2、替换光标所在这一行中的所有满足条件的结果(替换多次,只能替换一行)
:s/要替换的关键词/替换后的关键词/g       g=global全局替换
案例:把hello centos中的所有centos都替换为centos7.6
切换光标到hello centos这一行
:s/centos/centos7.6/g
3、针对整个文档中的所有行进行替换,只替换每一行中满足条件的第一个结果
:%s/要替换的关键词/替换后的关键词
案例:把每一行中的第一个hello关键词都替换为hi
:%s/hello/hi
4、针对整个文档中的所有关键词进行替换(只要满足条件就进行替换操作)
:%s/要替换的关键词/替换后的关键词/g
案例:替换整个文档中的hello关键词为hi
:%s/hello/hi/g
显示行号,在命令模式下输入冒号: 进入末行模式,:set nu      取消行号  :set nonu
末行模式按两下ESC退回命令模式

编辑模式,对文件的内容进行编辑,i/a/o
在命令模式,输入小写字母a或小写字母i或小写字母o,进入编辑模式。
命令模式 + o,在光标下一行插入内容
命令模式 + i : insert缩写,在光标之前插入内容
命令模式 + a : append缩写,在光标之后插入内容
在编辑模式中,直接按Esc,即可从编辑模式退出到命令模式

六、查看文件的内容

cat命令,正序输出文件的内容  (查看文件内容)
输出文件内容,# cat 文件名称
cat查看文件内容时,不论文件内容有多少,都会一次性加载显示,容易卡住。
cat适合查看内容较少的文件。 加-n参数显示行号。
合并多个文件内容,一个>覆盖,两个>>追加
# cat 文件名称1 文件名称2 > 合并后的文件名称
把文件名称1、文件名称2中的内容合并到一个文件中(换行合并内容)
# cat 1.txt 2.txt > 3.txt
tac命令,倒序输出文件的内容,# tac 文件名称

head命令,# head -n 数字 文件名称,查看一个文件的前n 行,如果不指定n,则默认显示前10 行
tail命令,# tail -n 数字 文件名称,查看一个文件的最后n 行,如果不指定n,则默认显示最后10 行
tail -f命令,# tail  -f  文件名称,动态查看一个文件内容的变化。
动态查看一个文件内容的输出信息(查询日志文件的变化)
动态查询系统的/var/log/messages文件的日志信息,# tail -f /var/log/messages

more分屏显示文件内容(了解),# more 文件名称 (按q退出)
more命令在加载文件时并不是一点一点进行加载,而是打开文件时就已经把文件的全部内容加载到内存中了。如果打开文件较大,则可能会出现卡顿情况。
less分屏显示文件内容(重点),# less 文件名称 (按q退出)
less命令不是加载整个文件到内存,而是一点一点进行加载显示,读取大文件时,效率比较高。
less还可以通过上下方向键显示上下内容。

通配符:星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配 0~9 之间的单个数字的字符, 而中括号内加上字母[abc]则是代表匹配 a、b、c 三个字符中的任意一个字符。
管道符,“|”,竖线,管道是一种通信机制,通常用于进程间的通信。它表现出来的形式是,将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
0 :标准输入,程序或命令需要外部的某些程序传递相应的参数,才能正常运行
1 :标准输出,程序或命令正确的执行结果,我们就称之为标准输出
2 :标准错误,程序或命令错误的执行结果,我们就称之为标准错误
非交互式设置密码,# echo “123” | passwd --stdin mpp
/dev/null黑洞、垃圾回收站,不显示过程。&>/dev/null 不在终端输出任何信息。
2>/dev/null忽略错误消息,将命令执行过程中的错误信息重定向到黑洞/dev/null。

非交互式设置密码,# echo "123" | passwd --stdin mpp
过滤(筛选)功能,# 前一个命令 | 后一个命令
获取/根目录下包含关键字"y"的文件信息
# ls / | grep y
| :管道符号,作用,把ls /的正确的执行结果作为参数传递给grep命令
ls / :管道左边的命令
grep y :管道右边的命令
检索系统中的已安装文件,只筛选mariadb软件信息
# rpm -qa | grep mariadb
-q :query,查询
-a :all,所有
在系统的进程中进行查找,查找与itheima相关的进程信息
# ps -ef | grep itheima
ps命令:查看进程,# ps -ef(类似# ps -aux 查看系统中所有进程)
-ef :查看系统的所有进程
grep itheima:搜索包含了itheima关键词的所有进程
实现less 的等价效果(了解)
源指令是"less xxx.txt",使用管道命令:cat xxx.txt | less
# less initial-setup-ks.cfg
使用管道命令,# cat initial-setup-ks.cfg | less

文件统计命令,wc命令,-l:统计行数、-w:统计单词数、-c:统计字节数
# wc [选项] 文件名称
-l:表示lines,行数(以回车/换行符为标准)
-w:表示words,单词数 依照空格来判断单词数量
-c:表示bytes,字节数(空格,回车,换行)
统计linux.txt文件的行数
# wc -l linux.txt
统计linux.txt文件的单词数
# wc -w linux.txt
统计文件的字节数(数字、字母一般1个字符=1个字节,中文和编码格式有关,如utf-8编码格式,1个汉字占用3个字节)
# wc -c linux.txt
统计一个文件的总行数、总单词数及总字节数
# wc -lwc linux.txt
统计/根目录下一共有多少个文件
# ls / | wc -l
用户在计算机中有一个配置文件(/etc/passwd),一个用户会占用一行配置,使用管道统计当前计算机中一共有多少个用户(一个用户一行)
# cat /etc/passwd | wc -l
# grep /sbin/nologin /etc/passwd |wc -l
xargs命令,为什么需要xargs命令?
xargs命令,让不支持管道的命令也支持管道,如| 管道后不支持rm、ls命令,要在| 管道后加xargs命令。
搜索/etc目录下的所有".conf"结尾的文件信息,然后以详细列表形式显示
# find /etc -name *.conf | ls -l
上述命令执行失败,解决方案在ls命令之前添加一个xargs命令
# find /etc -name *.conf | xargs ls -l
du命令,# du [选项] 文件或文件夹,目录会递归显示子目录占用磁盘空间大小
# du /var/log/ 
统计/var/log/目录的大小,包含目录下每一个单独文件的大小
-s :只显示汇总的大小,统计文件夹的大小,不递归显示下面子目录。
-h :以较高的可读性显示文件或文件夹的大小,显示单位(KB/MB/GB)
统计/etc目录的大小,# du -sh /etc

du -sh 路径 查看该路径下所有文件容量之和(不加路径默认为当前路径)
du -sh 某个文件或目录  查看某个文件或目录大小
du -sh 路径/* 查看该路径下每个文件或目录的容量

dd命令,创建指定大小的测试文件,# dd if=/dev/zero of=文件名称 bs=1M count=1 
# dd if=/dev/zero of=文件名称 bs=1M count=1
if代表输入文件(源文件)
of代表输出文件(目标文件)
bs代表字节为单位的块文件大小
count代表块文件个数
其中/dev/zero是一个字符设备,会不断返回0值字节,/dev/zero 这个设备文件不会占用系统存储空间,但却可以提供无穷无尽的数据。
使用dd创建一个5M大小的a.txt文件
# dd if=/dev/zero of=a.txt bs=1M count=5

scp命令,实现Linux与Linux系统之间的文件传输
要两个Linux系统,使用克隆操作(先关机后克隆)快速复制一个Linux系统。
scp传输要求:两台计算机所使用的操作系统都必须是Linux操作系统。
ssh: connect to host 10.1.1.17 port 22: Connection refusedlost connection
出现以上问题的主要原因在于scp命令是基于SSH协议,所以两台服务器的sshd服务必须处于开启状态,否则无法完成上传与下载操作。

下载文件或目录,# scp -r root@10.1.1.17:/root/shop /root
# scp [选项] 用户名@linux主机ip地址:资源路径 linux本地文件路径
-r :代表递归操作,针对文件夹
从10.1.1.17服务器下载/root路径的a.txt文件到本地的/root目录下
# scp root@10.1.1.17:/root/a.txt /root
根据提示输入 yes   最后输入密码
root@10.1.1.17's password:123456
从10.1.1.17服务器下载/root路径的shop文件夹到本地的/root目录下
# scp -r root@10.1.1.17:/root/shop ./   当前操作目录为家目录下
root@10.1.1.17's password:123456

上传文件或目录,# scp -r /root/shop root@10.1.1.17:/root/
# scp [选项] linux本地文件路径 用户名@linux主机ip地址:远程路径
-r :代表递归操作,针对文件夹
把本机服务器上的/root/a.txt上传到10.1.1.17服务器的/root目录下
# scp /root/a.txt root@10.1.1.17:/root/
把本机服务器上的/root/shop文件夹上传到10.1.1.17服务器的/root目录下     
# scp -r /root/shop root@10.1.1.17:/root/

find命令

# find 搜索路径 [选项]  文件名,搜索指定路径下的文件或文件夹,
# find / -name toolfile  查找根路径下名字为toolfile的文件
-name:搜索文件的名称,支持*通配符
-type:搜索的文件类型,f普通文件,d文件夹=>加快检索速度
搜索/var目录中boot.log文件(普通文件)
# find /var -name boot.log -type f
*通配符模糊查找:
# find /etc -name "*.conf" -type f
# find /etc -name "httpd*" -type f
-exec选项(-exec和两个花括号{}和反斜杠\和分号;)删除find搜索的文件
-exec选项,删除find搜索的文件
删除/var/log目录下10天以前的日志信息(日志文件格式*.log结尾)
# find /var/log -name "*.log" -mtime +10
第一种解决方案:使用管道命令|
# find /var/log -name "*.log" -mtime +10 |rm -rf
以上命令删除失败,rm命令和ls命令一样,都不支持管道,需加xargs。
# find /var/log -name "*.log" -mtime +10 |xargs rm -rf
第二种解决方案:使用find命令加 -exec选项
# find /var/log -name "*.log" -mtime +10 -exec rm -rf {} \;  
-exec和两个花括号{}和反斜杠\和分号; ,语句最后的分号不能少。
# find 搜索路径 -size [文件大小,常用单位:小k,大M,大G],根据文件的大小搜索文件,搜索/root目录下大小为5M以内的文件信息
# find ./ -type f -size -5M
根据文件的大小搜索文件
# find 搜索路径 -size [文件大小,常用单位:小k,大M,大G]
size值 : 搜索等于size值大小的文件
-size值 : 小于
+size值 : 大于
搜索/root目录下大小为5M的文件信息
# find ./ -type f -size 5M
搜索/root目录下大小为5M以内的文件信息
# find ./ -type f -size -5M

# find 搜索路径 -mtime +days/-days,根据文件最后修改时间搜索文件
使用stat命令获取文件的最后修改时间
# stat 文件名称
Modify: 2020-03-31 10:25:20.609010605 +0800
创建文件时设置修改时间(-m -d的顺序不能乱)
# touch -m -d "日期时间格式" 文件名称
① 如果文件不存在,则自动创建该文件,然后设置其最后的修改时间
② 如果文件存在,只是修改文件的最后修改时间
# touch -m -d "2020-03-30 00:00" a.txt
根据文件最后修改时间搜索文件:
# find 搜索路径 -mtime +days/-days
-mtime :根据文件的最后修改时间搜索文件
+ :加号,代表搜索几天之前的文件信息
- :减号,代表搜索几天以内的文件信息
搜索3天以前的文件信息(不包含第3天的,只搜索.txt格式)
# find ./ -name "*.txt" -mtime +3
案例:搜索3天以内的文件信息(只搜索.txt格式)
# find ./ -name "*.txt" -mtime -3

# find / -name 名字 -type f/d
-iname  忽略大小写  -maxdepth 数字   设置查找的目录深度
按照目录层级进行查找数据:# find /etc -maxdepth 1 -type d|wc -l
大小  -size kMG  小k大M大G
搜索大小超过10M的文件,find -size +10M
搜索大小小于10M的文件,find -size -10M
-mmin 分钟数   根据修改时间搜索文件  
find / -mmin +120 120分钟以前修改的文件 
find / -mmin -120 过去120分钟内修改的文件
搜索u为root、g为mail的文件并复制到/root目录
# find / -user root -group mail  -exec cp -r {} /root/ \; 
找到带有suid文件并复制到/root目录,
# find / -perm /4000 -exec cp -r {} /root/ \;
grep命令,搜索文件中指定内容并高亮显示出来,-n显示行号
# grep [选项] 要搜索的关键词 搜索的文件名称,-n显示行号
# grep network initial-setup-ks.cfg
# grep -n network initial-setup-ks.cfg
在多个文件中查找指定关键词
# grep 要搜索的关键词 文件1 文件2
# grep network /var/log/*
grep是行过滤工具,根据关键字进行行过滤。
搜索文件中指定关键字,显示关键字所在行所有内容并高亮显示关键字。
# grep [选项] '关键字' 文件名    
-n: 显示行号
-i: 不区分大小写
^key: 以关键字开头
key$: 以关键字结尾
-v: 查找不包含指定内容的行,反向选择
^$:匹配空行

echo命令,# echo 文本内容,在终端中输出指定的文本内容,
# echo “hello world”,输出内容有空格用单或双引号括起来
echo输出重定向,将命令的执行结果保存到文件中:
> :标准输出重定向 : 覆盖输出,会覆盖掉原先的文件内容
>>:追加重定向 : 追加输出,不会覆盖原始文件内容,
换行追加内容,没有此文件会新建文件来保存内容
# echo hello > readme.txt
# echo linux >> readme.txt
# ls >> a.txt(>覆盖写入文件,>>追加写入文件,换行追加内容)

<< 输⼊重定向
cat <<EOF > /tmp/abc.txt
hehehe
EOF
这个 EOF 可以替换成任何字符,但必须是⼤写。⽐如:
cat <<MEMEDA > a.txt
memeda
MEMEDA

七、权限
Linux是多用户多任务系统。在多用户计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权利。
计算机资源分为两部分:
硬件:硬盘、CPU、内存、网卡等物理硬件资源。
软件:操作系统(特殊的软件)、应用程序。只要不启动,这些软件就是一堆静态的文件,并且静静的躺在计算机的磁盘中,启动程序产生进程消耗内存资源。

普通权限rwx(读写执行):注意:权限是设置在文件上的,而不是用户。
读r(4),权限针对文件,可查看文件内容(cat/head/tail/less/more),权限针对目录,可查看目录里的内容(ls)
写w(2),权限针对文件,可更改文件内容(vim),权限针对目录,可在该目录里创建、删除、重命名等操作(mkdir/touch/rm/mv等)
执行x(1),权限针对文件,说明可以执行该文件(一般程序文件、脚本文件、命令都需要执行权限,linux中可执行文件是绿色的),权限针对目录可进入或切换到该目录里(cd)
没有任何权限用横杠-表示,数字表示是0
用户是否能删除目录里的文件,看的是目录的权限。在Linux系统中删除某个文件,不是看这个文件有什么权限,而是要看这个文件所处的上级目录是否具有w权限。
注:一般给予目录读权限时,也将会给其执行权限,属于“套餐”组合。

高级权限st:用户对某个文件操作有特殊需求,而普通权限不能满足,要给文件设置高级权限。
冒险位(u + s)
冒险位,指文件操作者(用户)临时拥有文件拥有者的权限
冒险位,一般针对的是命令或者脚本文件
冒险位,用字母表示是s或S,数字表示是4
冒险位的设置:chmod u+s 文件名或chmod 4xxx 文件名
冒险位的去除:chmod u-s 文件名或chmod 0xxx 文件名
注:which命令,查看二进制命令的绝对路径,whereis命令,查看命令的绝对路径
强制位(g + s)
强制位,一般针对的是目录
如果一个目录拥有强制位,那么任何用户在该目录里所创建的任何文件的属组都会继承该目录的属组。
强制位,用字母表示是s或S,数字表示是2
强制位的设置:chmod g+s 文件名或者chmod 2xxx 文件名
强制位的去除:chmod g-s 文件名或者chmod 0xxx 文件名
主要针对目录进行设置g+s,比如shop目录,文件拥有者root,所属组itheima
以后在shop目录下创建的所有文件的所属组都会继承shop文件夹的itheima
粘滞位(o + t) 
粘滞位t,一般针对的是公共目录
如果一个公共目录拥有粘滞位,那么该目录下的文件,只允许文件的创建者和root用户删除文件(防止误删除)(A用户不能删除B用户创建的文件)
粘滞位,用字母表示是t或T,数字表示是1
粘滞位的设置:chmod o+t 文件名或chmod 1xxx 文件名
粘滞位的去除:chmod o-t 文件名或chmod 0xxx 文件名

默认权限umask(了解,不要更改),文件默认权限由umask控制
目录最高权限0777,简写777
文件最高权限0666,简写666
默认目录权限 = 0777 - umask
默认文件权限 = 0666 - umask
获取umask值,# umask
# umask
0022
注:0022中第一位0代表特殊权限位可以不设置。
默认umask值,root账号0022,普通账户0002
默认实际文件权限 = 最高权限 - umask值
root用户下,touch a ,文件a的默认权限是644
普通用户下,touch b ,文件b的默认权限是664
root : 666 - 022 = 644
mpp:666 - 002 = 664
临时设置umask值,umask+数值,
修改当前用户的umask
# umask 0002
永久修改
# vim ~/.bashrc 
① 在文件末尾添加umask 0002
② 保存退出 
③ source ~/.bashrc 重新读取配置文件立即生效

删除文件看文件所在目录有无w权限,文件有x危险,目录有w危险。
chmod u\g\o\a +\-\=权限  文件  (+R 目录) 
=是重新授予权限(赋值权限),会覆盖之前的权限的,chmod 421 文件
chmod +x file   给文件ugo即a所有人加了x权限
修改文件拥有者、所属组
chown 拥有人:拥有组  文件名 或chown 拥有人.拥有组  文件名 同时修改文件拥有者和所属组
chgrp 拥有组  文件名   只修改文件所属组
suid(u+s)4777	有文件拥有者权限(命令用)
guid(g+s)2777	新子文件继承目录的拥有组(目录用)
o+t 1777	防止别人误删除公共目录(目录用)
原来有x,是小写s\t
原来无x,是大写S\T

文件权限涉及到具体用户名、具体组名(文件权限颗粒化),用文件acl设置,chmod 针对ugo设置。
# setfact -m u:mpp:rw 文件名     # setfact -m g:test:r 文件名# getfacl 文件名  查看文件acl设置权限,而不是用ls查看,通过ls查看有+(加号),则此文件被设置了acl
-b  删除此文件设置的所有的acl
-x  删除此文件设置的具体某条acl   # setfacl -x u:mpp 文件名
# ls -l (简写:# ll)以详细列表的形式显示当前或其他目录下的文件信息。
备注:ll命令是红帽及CentOS系统特有的一个命令,在其他操作系统中可能并不支持。
linux区分文件类型,通过权限位标识符来区分
Linux一共有7种文件类型,分别如下:
-:普通文件(黑色)(背景是黑色就为白色)
d:目录文件夹(蓝色)
l: 软链接(类似Wins的快捷方式)(soft link软链接)
b:block块设备文件(硬盘、光驱等,ls -l /dev/sr0),用来存放数据的都是块设备文件。
p:管道文件
c:字符设备文件(输入输出设备)
s:套接口文件/数据接口文件socket(例如启动一个MySql服务器时会产生一个mysql.sock文件)

 # ll 查看文件详情
 .后的数字,那个数字代表硬链接数,文件默认硬链接数是1,目录默认硬链接数是2
 目录的数字2表示当前目录的子目录个数
 任何一个目录中都有两个隐藏的目录一个.和两个..
 再在这个目录里创建个目录,这里数字就会变成3
 普通文件的数字1表示这个文件的硬链接个数
 
软链接(l)类似wins快捷方式
创建软链接,# ln -s 源文件 链接文件
源文件改变链接文件也改变,链接文件改变源文件也改变
删除源文件,链接文件依然存在,但是个无效链接文件
源文件和链接文件是两个不同文件
用# ll -i 查看文件的inode号
第一列数字为文件的inode号,inode号不同表示是不同文件。 系统找到一个文件是通过inode号查找的
也可以对目录设置软链接
# ln -s 源目录 链接目录
  删除软链接
# unlink 软链接名称

创建硬链接,# ln  源文件 链接文件
删除硬链接:直接删除硬链接文件就好了
不能人为创建目录硬链接,但系统有些特殊目录互为硬链接(这些特殊目录硬链接不能删除)
用# ll -i 查看文件的inode号
第一列数字为文件的inode号,inode号不同表示是不同文件。系统找到一个文件是通过inode号查找的
硬链接特点:
  1、文件内容相同
  2、一个文件改变另一个文件跟着改变
  3、删除一个文件不会影响其他硬链接文件
  4、inode号相同
  5、Linux中,不能直接对目录创建硬链接
# df -ih 查看inodes使用率
磁盘还有空间,但inode号用完了也不能创建文件(面试题)
通过软链接解决(百度详情)
文件或文件夹权限设置,# chmod [选项] 字母形式或数字形式 文件名称
选项说明:
-R :递归设置,针对文件夹(目录)
1、确认给谁设置权限,u、g、o、ugo(a)
2、怎么设置权限(+, -, =3、授予什么样的权限(r,w,x)
案例:给readme.txt设置权限,要求文件拥有者rwx权限,所属组内用户rw,其他用户r权限
# chmod u=rwx,g=rw,o=r readme.txt
# chmod 764 readme.txt
案例:设置shop文件夹权限为777(所有人都拥有rwx)
# chmod -R 777 shop

文件拥有者及文件所属组设置
有些软件或程序要求比较特殊,如果想正常运行,拥有者与所属组必须是某个值。
如mysql数据库,其要求系统中必须有一个mysql的系统账号,而且要求其安装目录的文件拥有者以及所属组都必须是mysql
文件拥有者设置,# chown [选项] 新文件拥有者 文件名称
选项说明:-R :代表递归修改,主要针对文件夹
文件所属组设置,# chgrp [选项] 新文件所属组 文件名称
选项说明:-R : 代表递归修改,主要针对文件夹
chown同时修改属主与属组
# chown [选项] 新的文件拥有者:新的文件所属组 文件名称
# chown [选项] 新的文件拥有者.新的文件所属组 文件名称
选项说明:-R :递归设置,主要针对文件夹

ACL访问权限控制
# getfacl 文件或目录名,获取某个文件的ACL权限,getfacl = get + file + acl 
案例:获取readme.txt文件的ACL权限,# getfacl readme.txt
给某个文件设置ACL权限,# setfacl [选项] 文件或目录名
选项说明:
-m,修改或设置ACL策略
-x,去掉某个用户或某个组的权限
-b,删除所有的acl策略
-R,递归,对目录下已存在的目录或文件有acl策略,但新建的文件没有
-d 默认ACL策略,只针对目录,该目录下新建的目录和文件都会继承acl策略
案例:修改readme.txt文件的ACL权限(给itheima用户开通rw权限)
# setfacl -m u:itheima:rw readme.txt
案例:修改shop文件夹的ACL权限(给itheima组开通rwx权限)
# setfacl -R -m g:itheima:rwx shop
案例:删除某个用户权限(删除某个组权限,把u换成g)
# setfacl -x u:itheima readme.txt
案例:删除所有的ACL权限
# setfacl -b readme.txt

八、用户

用户组操作,/etc/group 存储用户组信息
添加用户组:# groupadd [选项]  用户组组名
-g :用户组的组ID编号,自定义组ID编号必须从1000开始,不能重复
0代表超级管理员root组,1-999代表系统用户组,1000以后代表普通用户组
修改用户组:# groupmod [选项 选项的值] 原来组的组名称
-g :gid缩写,设置一个自定义的用户组ID编号,1000以后
-n :name缩写,设置新的用户组的名称
删除用户组:# groupdel 用户组名称
注意:如果想删除某个用户组,必须要保证这个组不能是某个用户的主组。
# groupdel stu2
groupdel: cannot remove the primary group of user 'stu2'
注意:以上信息说明不能删除属于其他用户的主组
不能删除一个用户的主组,除非将该用户从这个主组中删除。
userdel删除用户同时会删除与用户同名的用户主组。
在/etc/group文件中,有三个冒号,共四列。
第一列:用户组组名
第二列:用户组组密码,使用一个x占位符
第三列:用户组组编号,1-999代表系统用户组的组编号,1000以后的代表自定义组(普通用户组)的组编号CentOS6 => 1-499,500以后。CentOS7 => 1-999,1000以后。
第四列:组内用户信息(这个组必须是这个用户的附属组)
组成员管理(附属组)
# gpasswd [选项 选项的值] 用户组名称
-a :添加用户到组,append追加
-d :从组中删除用户,delete移除

用户操作,/etc/passwd 存储用户信息
用户的类别:
① root超级管理员,用户编号0。
② 系统用户,也叫程序用户。一般都是由程序创建,用于程序或服务运行时的身份。
CentOS6=> 1 ~ 499,CentOS7=> 1 ~ 999,系统账号默认不允许登录。     
# useradd -s /sbin/nologin 添加系统用户
③ 普通用户,大部分是由root管理员创建的,
用户编号范围:CentOS6=> 500 ~ 60000,CentOS7=> 1000 ~ 60000
添加用户:# useradd [选项 选项的值] 新用户名称
-g :指定用户的用户主(主要)组,选项值可以是用户组ID,也可以是组名
-G:指定用户的用户附加(附属)组,选项值可以是用户组ID,也可以是组名
可以指定多个,用逗号隔开即可(了解)
-u :添加用户时指定用户ID编号,默认是自动生成的,CentOS6从500开始,CentOS7中从1000开始
-s :指定用户可以使用的Shell类型,默认为/bin/bash(拥有大部分权限)
还可以是/sbin/nologin,代表账号创建成功,但是不能用于登录操作系统。
/bin/bash => 给人使用的(运维工程师)
/sbin/nologin => 给软件使用的,比如mysql
-c :代表用户的备注信息
-d :指定用户家目录,默认为/home/用户名称。可以使用-d进行更改。
-r  指定用户为系统用户,如创建一个系统账号mysql

# useradd zhangsan 
不用任何参数,创建用户,系统会默认执行以下操作: 
1)在 /etc/passwd 文件中创建一行关于zhangsan用户的数据 
2)在 /etc/shadow 文件中新增了一行关于zhangsan 密码的数据
3)在 /etc/group 文件中创建一行与用户名同名的主组,例如zhangsan(主组) 
4)在 /etc/gshadow 文件中新增一行与新增组相关的组密码信息
5)自动创建用户的家目录,默认在/home下,与用户名同名。最后拷贝相应的文件到用户的家里

查看系统支持的shell(命令解释器)
# cat /etc/shells 
/bin/sh bash的软链接(bash的快捷方式)
/bin/bash 系统默认的解释器
/sbin/nologin	不能登录操作系统,也称为非交互式shell
/bin/dash	兼容shell脚本
/bin/tcsh	其他shell
/bin/csh 其他shell
问题1:没有为zhangsan账号指定所属的主组,可以成功创建账号吗?
答:可以,因为在创建账号时,如果没有明确指定用户所属的主组,默认情况下,系统会自动在用户组中创建一个与用户zhangsan同名的用户组,这个组就是这个用户的主组。
问题2:刚才创建的zhangsan账号能不能用于登录操作系统?
答:不行,因为Linux的登录账号必须要求有密码,如果一个账号没有密码是无法登录操作系统的。
问题:一个用户创建成功后,如何判断是否添加到系统?
1、通过tail命令查看/etc/passwd文件
2、用id命令查看zhangsan信息
查询某个指定的用户信息,# id 用户名称
案例:查询linuxuser用户的信息,# id linuxuser
uid=1002(linuxuser) gid=1005(linuxuser) groups=1005(linuxuser)
uid:用户编号
gid:用户所属的主组的编号
groups:用户的主组以及附属组信息,第一个是主组,后面的都是附属组或附加组信息

验证用户信息通过文件/etc/passwd,验证用户组信息通过文件/etc/group 
/etc/passwd用户文件,每创建一个用户会在此文件中追加一行用户信息。
# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
由上图可知,一共拥有7列
第1列:用户名称
第2列:用户的密码,使用一个x占位符,真实密码存储在/etc/shadow
第3列:数字,用户的ID编号
第4列:数字,用户的主组ID编号
第5列:代表备注信息,useradd -c "备注信息" 用户名称
第6列:用户的家目录,默认在/home/用户名称
第7列:用户可使用的Shell类型,useradd -s /bin/bash或/sbin/nologin 用户名称

修改用户:# usermod [选项 选项的值] 用户名称
选项说明:
-g :指定用户的用户主组,选项的值可以是用户组的ID,也可以是组名
-G: 指定用户的用户附加组,选项的值可以是用户组的ID,也可以是组名
可以指定多个,用逗号隔开即可(了解)
-u :指定的用户ID编号,默认是自动生成的,CentOS6从500开始,CentOS7中从1000开始
-s :修改用户可以使用的Shell类型,如/bin/bash和/sbin/nologin
-d :修改用户的家目录
-c :修改用户的备注信息
-l :login name修改用户的名称
扩展:
-L:锁定用户,锁定后用户无法登陆系统lock
-U:解锁用户unlock
问题:账号已经解锁,但是无法登录
① 当前账号没有设置密码,因为Linux操作系统不允许没有密码的就进行登录
② 当前用户的Shell类型为/sbin/nologin,所以其无法登录
案例:修改用户zhangsan的家目录为/rhome/zhangsan(默认/home/zhangsan)
# mkdir /rhome/zhangsan -p
# usermod -d /rhome/zhangsan zhangsan
# su - zhangsan
-bash-4.2$
出现以上问题的主要原因在于:我们迁移用户的家目录时,没有迁移家目录中的配置文件"家具"
解决方案:
① 家目录已经迁移,我们把/etc/skel中的文件,copy到新家中
# cp -a /etc/skel/. /rhome/zhangsan/
选项说明:
-a :all所有,复制时,保留文件的原有属性
② 家目录还没迁移,准备迁移时,使用usermod -md /rhome/zhangsan 用户名
-m :move,迁移家目录时,把"家具"一起迁移到新的家目录
# usermod -md /rhome/zhangsan zhangsan
注:要求/rhome/zhangsan必须是真实存在的。

与用户密码相关的文件:/etc/shadow
# passwd 用户名称      修改用户密码
为某个用户设置密码(添加或修改),可给自己也可以给别人设置(root)
1.管理员root可以给任何用户修改密码,# passwd itheima
2.普通用户只可以自己给自己修改密码,$ passwd
注意:在Linux操作系统中,若一个账号没有密码,则无法登录操作系统。
--stdin 非交互式修改用户密码,--stdin 获取键盘输⼊
# echo 123 | passwd --stdin itheima

chage更改用户的账号密码等信息
chage -l user01 查看用户密码情况   求帮助:man chage 或chage --help
chage -d 0 user01 用户首次登入后强制修改密码
密码最短期限设为10天,chage -m 10 user01
密码最长期限设为30天,chage -M 30 user01
案例1:新创建一个账号lamp,设置初始化密码为123456。要求用户第一次登陆后必须强制修改用户的密码。
解决思路:把密码的最后修改时间重置为0(回到1970年1月1日)
# useradd lamp
# echo 123456 | passwd --stdin lamp
# chage -d 0 lamp
案例2:设置lamp账号的过期时间为2010-04-10
# chage -E "2020-04-10" lamp
案例:设置lamp账号的10天后过期(延伸)
# chage -E $(date +%F -d '+10 days') lamp
%F:YYYY-mm-dd,格式2020-04-01
-d:多少天以后的日期
案例3:设置mysql用户60天后密码过期,至少7天后才能修改密码,密码过期前7天开始收到告警信息
# useradd mysql
# echo 123456 |passwd --stdin mysql
# chage -M 60 -m 7 -W 7 mysql

删除用户:# userdel [选项] 用户名称
选项说明:
-r :删除用户的同时,删除用户的家目录(默认不删除)
-f :强制删除用户(即使用户处于登录状态)
删除账号流程:删除账号=>确认是否删除用户家目录=>删除用户主组 
所有跟用户操作的命令只有root账号有权限执行(除passwd 外,普通用户只能修改自己的密码,即不指定用户名)。
删除用户同时会删除与用户同名的用户主组。
扩展:当我们想要删除某个账号时,系统提示当前账号正在被某个进程所使用。
解决方案:
第一种方案:注销登录用户。
在登录需要删除的用户之后,按下快捷键“ctrl+d”进行对当前用户的注销,或者输入logout注销指令,随后会退回到上一个登录的用户(root)此时就可以对需要删除的用户进行删除操作。
第二种方案:结束进程,再次使用userdel删除即可
# kill [-9] 进程的ID编号
选项说明:-9代表强制结束某个进程
# kill 11565 结束11565进程
# ps -ef | grep linux   或# ps -aux | grep linux

九、网络管理

# ifconfig  获取网卡的相关网络信息,Windows是ipconfig,Linux是ifconfig
# ifconfig ens33 查看指定网卡,# ifconfig -a 查看所有网卡 (ip  a)
# systemctl  status  network
# systemctl start network
# systemctl restart network
# systemctl stop network
Linux的网卡配置文件,存放在/etc/sysconfig/network-scripts/目录下,文件名格式为ifcfg-网卡名称,centos6是eth0,centos7是ens33
此文件中只有这下面六行参数有效果:
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
UUID="6c809893-d12c-46af-9987-4c05b2773c91"
DEVICE="ens33"
ONBOOT="yes"
参数解析:
TYPE :网络类型,Ethernet以太网
BOOTPROTO:IP的获取方式,dhcp代表自动获取,static/none代表手工设置
NAME :网卡的名称
UUID :网卡的UUID编号(必须是唯一的)
DEVICE :设备名称
ONBOOT :代表网卡是否随计算机开启启动,yes随计算机开机启动,no代表不启动。
ip设置static/none代表手工设置,就要加下面这些内容
   IPADDR=10.0.0.10
   NETMASK=255.255.255.0
   GATEWAY=10.0.0.2
   DNS1=114.114.114.114
   DNS2=8.8.8.8

参数	说明
TYPE	配置文件接口类型
BOOTPROTO	系统启动地址协议
ONBOOT	系统启动时是否激活
IPADDR	IP地址
NETMASK	子网掩码
GATEWAY	网关地址
BROADCAST	广播地址
HWADDR/MACADDR	MAC地址,只需设置其中一个,同时设置时不能相互冲突
PEERDNS	是否指定DNS,如果使用DHCP协议,默认为yes
DNS{1, 2}	DNS地址
USERCTL	用户权限控制
NAME	网络连接名称
DEVICE	物理接口名称
ip地址绑定长短主机名,绑定后可ping主机名,/etc/hosts 主机名和ip地址映射配置文件,
ip地址  长主机名   短主机名
如  192.168.10.1    servera.example.com  servera
在DNS域名解析配置文件/etc/resolv.conf中配置dns服务器的ip地址,
如  nameserver    192.168.10.10  iburst
# route -n 查看默认网关,UG的为默认网关

系统自动挂载文件,/etc/fstab
文件内容:
UUID=e92b731d-bd8e-4406-98c9-940bc4cf1696  /       xfs     defaults        0   0
UUID=2ebae62b-a201-42a5-8d09-216253622aa2  /boot   xfs     defaults        0   0
UUID=48ab2d46-a56e-4839-8bb8-a76ac5127f66  swap    swap    defaults        0   0
存储设备文件信息(设备路径或设备UUID信息) 挂载点  文件系统类型  挂载选项   是否具有数据自动保存机制,不开启,容易造成磁盘空间浪费。  是否开启磁盘自检机制,不开启,扫描检查磁盘过程也会对磁盘有损坏。
文件系统类型(数据存储到磁盘方式)  Linux xfs(推荐-效率较高)  ext3/ext4(保证数据安全性)
NTFS: 可以存储任意容量数据。FAT32:可以存储小于4G单个文件可以存储。

开机启动文件/etc/rc.local文件是操作系统开机最后读取的一个文件
echo "mount -o ro /dev/sr0 /mnt" >> /etc/rc.local
# chmod +x /etc/rc.local
系统启动后,会自动加载并执行这个文件/etc/rc.local

系统显示输出文件(用户登入后系统欢迎界面)
/etc/motd :可以在用户登录系统之后,显示输出的信息
/etc/issue:可以在用户登录系统之前,显示输出的信息

十、进程管理

进程是正在执行中的程序。程序不运行放在硬盘中,运行程序产生进程消耗内存资源。
服务器性能三大指标,CPU,内存和磁盘。
linux系统分区时至少分三个分区:
/boot分区(系统分区,装linux系统内核的)
swap交换分区,一般情况下为内存的1~2倍,但是尽量不要超过2G。实际内存不够了,linux系统会从硬盘中划分一部分空间充当内存使用。
swap交换分区会在实际内存不够使用情况下当临时内存来使用,交换分区一般等同于实际内存的大小。
/根分区,所有文件都是放在此目录中。

# top    动态显示服务器各项指标
M(大写),将内存使用率(%MEM)降序排列
P(大写),将CPU使用率(%CPU)降序排列
1(数字1),当服务器有多核CPU时,可用数字1来切换展示每核CPU详情
q,退出

上面系统整体情况的第1行,这行是以top开头的信息,load average: 0.12, 0.19, 0.18表示系统在之前1分钟、5分钟、15分钟的平均负载。
如果CPU是单核的,则这个数值超过1就是高负载;如果CPU是4核的,则这个数值超过4就是高负载。
上面系统整体情况的第2行,这行是以Tasks:开头的信息,系统中的进程数情况。
上面系统整体情况的第3行,这行是以%Cpu(s):开头的信息,系统中的CPU情况。
上面系统整体情况的第4行,这行是以KiB Mem :开头的信息,系统中的内存情况,看free空闲的物理内存数量。
上面系统整体情况的第5行,这行是以KiB Swap: 开头的信息,系统中的swap交换分区(虚拟内存)情况。
swap交换分区会在实际内存不够使用情况下当临时内存来使用,交换分区一般等同于实际内存的大小。

下面是进程信息。PID(进程的ID),NI(进程优先级,可以人为更改NI,数值越小优先级越高,NI值范围 -20 ~ 19),PR(进程优先级,跟着NI改变,不能人为更改)
调整正在运行的进程的优先级,使用# top     
进入top界面后,按"r" ,输入想要修改优先级的进程PID,输入进程PID后回车,
输入想要修改的数字(数值越小优先级越高,NI值范围 -20 ~ 19),输入数字后回车就好了。
# top -p PID编号,只查询某个进程的信息。
优先级的范围:-20 ~ 19  数字越低,优先级越高,系统会给更多的cpu时间给该进程。注意:只能够修改 NI 的优先级,而不能修改 PR 的优先级。
nice只能修改不在运行的进程的优先级,# nice -n [NI优先级设置的数字] 想调整的进程名       
启动进程时通常会继承父进程的nice级别,默认为0
步骤1:将程序停止,# ps -ef |grep crond
# kill PID    不行就强制杀掉进程# kill -9 PID    或 # systemctl stop crond
步骤2:启动并制定优先级(使用nice),# nice -n -10 crond
nice命令包含两个功能:① 启动进程 ② 调整进程的优先级
步骤3:确认优先级(查看优先级)
# ps -ef |grep crond     获取服务的进程PID
# top -p PID编号       只查询某个进程的信息

通过 top 命令的整体信息部分,就可以判断服务器的健康状态。
如果 1 分钟、5 分钟、15 分钟的平均负载高于CPU核数(第一行),说明系统压力较大。
如果物理内存的空闲内存过小(第四行),则也证明系统压力较大。
# free 查看内存使用(默认以kb显示,加-m是以mb显示)-h 显示单位,available有空的,系统可用内存。
# uptime 查看系统负载,最近 1 分钟、5 分钟、15 分钟内的平均负载值。建议负载值保持在 1 左右,在生产环境中不要超过 5 就好。
问题:发现CPU负载过大,接下来怎么办?
答:如果1分钟、5分钟以及15分钟全部超过CPU的总核心数(必须引起警觉),这个时候就要查看底部的进程信息了,看哪些进程消耗CPU最多。
经验之谈:如果一个总核数=8核心的CPU,理论上平均负载达到16,也还可以坚持很长一段时间。
# df -h     -h 显示单位,以较高的可读性显示磁盘剩余空间大小

top :动态查看系统进程的信息(每隔3s切换一次)
ps : 静态查看系统进程的信息(只能查询运行ps命令瞬间的系统进程信息)
# ps [选项]
-e : 等价于“-A”,表示列出全部(all)的进程
-f : 表示full,显示全部的列(显示全字段)
案例:显示当前系统中所有进程的信息
# ps -ef   (类似# ps -aux 查看系统中所有进程)
在实际工作中使用ps命令主要用于查询某个进程的PID或PPID
ps -ef | grep 进程名称
# ps -ef |grep crond
查看crond进程的详细情况
注意:查询结果中,如果只有一条则表示没查到对应的进程(这1 条表示刚才grep指令本身所启动的进程)。只有查到的结果多于1 条,才表示有对应的进程。
grep -v :过滤,去除包含指定关键词的那一行(取反)
# ps -ef |grep crond |grep -v grep

# netstat [选项] | grep 进程名称   查看端口是否被监听,不同端口号能让计算机区分出不同的服务。
服务运行了就表示这个端口被占用或者被监听了,若是服务没有运行,则端口没有被占用或没有被监听
选项说明:
-a,显示所有
-t:只列出tcp协议的连接(tcp协议与udp协议)
-n:将地址从字母组合转化成ip地址,将协议转化成端口号来显示
-l:过滤出"state(状态)"列中其值为LISTEN(监听)的连接
-p:显示发起连接的进程pid和进程名称
# netstat -tnlp 查看进程网络连接状态
# netstat -utnlp 列出tcp协议与udp协议
案例:查询httpd服务的端口网络访问信息
# netstat -tnlp | grep httpd
# ss -atnlp| grep 进程名称
案例:查询sshd服务的端口信息
# ss -atnlp | grep sshd
netstat与ss区别?
① netstat信息比较简洁,ss更加丰富
② ss执行效率比netstat略高一些

# kill [信号编号] PID
作用:kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
# kill -9 pid      强制杀死某个进程
9,杀死进程,即强制结束进程。
15,正常结束进程,是 kill 命令的默认信号。
先用ps命令查看进程pid再kill杀掉
# ps -ef | grep crond
7102
# kill 7102
# killall [信号编号] 进程名称
案例:使用killall命令杀死crond进程
# killall crond

十一、自有服务

Linux自有服务,就是系统开机后就自动运行的一些进程服务(程序),不需要用户独立去安装的软件的服务。
在Centos7之前,通过service 和 chkconfig两个命令来管理服务。service: 负责启动,停止服务,显示服务状态 ,chkconfig: 指定服务是否开机启动 ,从Centos7开始,统一使用systemctl来管理服务, 
systemctl同时具有service和chkconfig命令的功能
# systemctl list-units --type service --all  列出所有服务(包含启动的和没启动的)
# systemctl list-units --type service  列出所有启动的服务
# systemctl list-units --type service | grep sshd    显示系统服务与管道命令结合,筛选想要的服务信息
# systemctl status 系统服务名称
# systemctl stop 系统服务名称
# systemctl start 系统服务名称
# systemctl restart 系统服务名称,重启是先停止服务再启动服务
# systemctl reload 系统服务名称,reload没有停止服务只是更新配置文件
开机自启   # systemctl enable 系统服务名称
开机不自启   # systemctl disable 系统服务名称
将network网络服务设置为开机自启动,用# /sbin/chkconfig network on 
查看network网络服务有没有随开机自启动,# chkconfig --list |grep network    3字符模式和5图形模式是on就代表开机自启动了。
系统7种运行级别,0关机,6重启,3命令字符模式,5图形模式
0 关机模式
1 单用户模式   系统正常启动,但是不会运行网络服务  单用户级别 修复系统/破解系统密码
2 多用户模式   系统多用户级别 不支持网络服务
3 字符模式     支持多用户,支持网络服务,是常用的
4 自定义模式
5 图形模式
6 重启模式
获取默认运行模式(默认图形模式graphical.target)  # systemctl get-default
init命令(临时更改运行模式)   # init 模式编号
案例:把计算机切换到字符模式(黑窗口)    # init 3
案例:把计算机切换到图形模式(图形界面)    # init 5
案例:立即关机     # shutdown -h 0或now   或# halt -p    或# init 0
案例:立即重启     # reboot    或# init 6
	永久修改级别:
	centos6:
	/etc/inittab
	26 id:3:initdefault:   --- 设置系统启动默认级别
	
	centos7:
	systemctl get-default  --- 查看系统默认级别
	ystemctl set-default graphical.target   --- 设置系统默认级别

常用自有服务 (ntpd,firewalld,crond) # date 查看Linux系统时间
# 将系统时间改为1999年1月1日 上午8:30
# date -s "19990101 08:30:00"
# date
1999年 01月 01日 星期五 08:30:25 CST
ntpd,同步计算机的系统时间的服务,ntpd服务配置文件:/etc/ntp.conf
手工同步,# ntpdate NTP服务器的IP地址或域名
案例:从NTP服务器中同步系统时间   # ntpdate cn.ntp.org.cn   或  # ntpdate 120.25.108.11
注意:从网络同步时间,要确保自己的服务器可以访问互联网
错误信息:no servers can be used   含义:服务器不可用,这里的服务器是指网络上的时间服务器,不可用,不代表是对方服务器有问题,也有可能是你自己的服务器网络不通,无法连接到网络上的时间服务器。
自动同步,①启动ntpd服务   # systemctl start ntpd
② 把ntpd服务追加到系统开机启动项中    # systemctl enable ntpd
启动ntpd服务,并配置为开机启动,服务启动后,系统会自动同步网络时间。 注意:从网络同步时间,要确保自己的服务器可以访问互联网。

Linux中防火墙firewalld,防火墙选择让正常请求通过,从而保证网络安全性。firewalld = fire火 wall墙 daemon守护进程
CentOS5、CentOS6 => 防火墙 => iptables防火墙        CentOS7 => 防火墙 => firewalld防火墙
firewalld增加了区域(zone)的概念,所谓区域是指,firewalld预先准备了几套防火墙策略的集合,类似于策略的模板,用户可以根据需求选择区域。
# systemctl stop firewalld    记住:防火墙一旦停止,其设置的所有规则会全部失效!生产环境一定不要停止防火墙。
# systemctl enable firewalld     把防火墙设置为开机启动
# systemctl disable firewalld    把防火墙设置为开机不启动
# systemctl restart firewalld    重启是先停止服务再启动服务
# systemctl reload firewalld    reload没有停止服务只是更新配置文件

firewalld默认采用运行模式,永久模式permanent,在防火墙firewalld中有:运行模式(临时模式)+ 永久模式。
运行模式:不会把策略规则保存到防火墙的配置文件中,设置完成后立即生效。
永久模式:会把策略规则写入到防火墙的配置文件中,但是其需要reload重载后才会立即生效。
# 根据服务名称添加规则(永久)
# firewall-cmd --zone=public --add-service=服务名称 --permanent   服务必须存储在/usr/lib/firewalld/services目录中
# firewall-cmd --reload
#firewall-cmd --zone=public --add-service=http     含义:在public区域,添加允许http服务通过的规则
把http服务从防火墙规则中移除,不允许其通过防火墙  # firewall-cmd --zone=public --remove-service=http     
# firewall-cmd --list-all   查看当前区域的规则设置

# 根据端口号添加规则(永久)(端口号/协议,一定要有端口的协议)
# firewall-cmd --zone=public --add-port=服务占用的端口号 --permanent
# firewall-cmd --reload 
案例:把80端口添加到firewalld防火墙规则中,要求永久生效
# firewall-cmd --zone=public --add-port=80/tcp --permanent  含义:在public区域,使用permanent参数,永久添加允许80端口通过的规则 
# firewall-cmd --reload 重新加载配置
案例:从firewalld防火墙中把80端口的规则移除掉   # firewall-cmd --zone=public --remove-port=80/tcp
# firewall-cmd --list-all     查看当前区域的规则设置

查看防火墙默认的区域(zone) # firewall-cmd --get-default-zone 当前默认使用区域为public
查看所有可用的区域(zones)# firewall-cmd --get-zones 不同的区域就是不同的规则
查看所有区域的规则设置 # firewall-cmd --list-all-zones
查看当前区域的规则设置 # firewall-cmd --list-all

Linux中的计划任务crond,在指定的时间执行指定的操作
# crontab [选项]
-l :list,显示目前已经设置的计划任务
-e :edit,编辑指定用户的计划任务列表
计划任务就是一个文件,使用vim编辑器编辑计划任务的文件
-u:user,指定用户名,如果不指定表示当前用户 
-r:remove,删除指定用户的计划任务列表 
案例:显示当前账号下的计划任务
# crontab -l
no crontab for root,root账号下没有创建计划任务

# crontab -e     编写计划任务(进入vim命令模式)以行为单位,一行则为一个计划任务。分  时  日  月  周  要执行的命令  (用whereis查看命令完整路径)
计划任务的黑名单文件/etc/cron.deny    把要禁止的用户名单,加入黑名单文件,一行只能写一个
白名单文件的路径/etc/cron.allow     白名单文件需要手工创建。白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,会被默认允许创建计划任务。
问题:计划任务文件具体保存在哪?
答:/var/spool/cron/用户名称,如果使用root用户编辑计划任务,则用户文件名为root
计划任务日志文件/var/log/cron
使用tail -f命令动态查看日志变化  # tail -f /var/log/cron
计划任务+tar命令实现文件备份(定时备份数据库)
案例:每天凌晨2点0分把/etc目录备份到/tmp目录下
0 2 * * * /usr/bin/tar -zcf /tmp/etc-$(date +"\%Y\%m\%d").tar.gz /etc
# date +"时间格式"  (+后面的日期格式没有空格)
%F 年-月-日     data +%F  加号和百分号之间没有空格
%T 小时:分钟:秒
%Y 年
%m 月
%d 日
%H 小时
%M 分钟
%S 秒

十二、软件安装
linux下三种软件安装方式:
① RPM软件包管理(软件名称.rpm)需要单独解决依赖问题。
② YUM软件包管理,要有网络及YUM仓库的支持,会自动联网下载软件,自动解决依赖。
③ 源码安装,源码安装三步走(配置编译安装),安装过程比较复杂。优点:定制性很强。

查看已安装的rpm软件包  
# rpm -q 软件名称   或# rpm -qa |grep 软件名称
# rpm -qa | grep firefox
卸载rpm软件包
# rpm -e 软件名称   --nodeps强制卸载
# rpm -e firefox
注意:卸载软件只需要跟软件包名字即可
rpm软件包的安装
# rpm -ivh 软件包的名称.rpm
选项说明:
-i:install,安装
-v:显示进度条
-h:表示以"#"形式显示进度条                                     
# rpm -ivh firefox-60.2.2-1.el7.centos.x86_64.rpm
注意:安装的软件包的名字必须写全,xxx.rpm
rpm软件包的升级
# rpm -Uvh 软件包的名称.rpm
注:rpm -Uvh不仅可升级软件,也可安装软件。
# rpm -Uvh firefox-60.8.0-1.el7.centos.x86_64.rpm
很多rpm软件包在安装时都会提示软件依赖
方法一:根据提示一个一个软件包安装,先解决依赖再回来安装软件。
方法二:使用yum安装,# yum install 软件名称 -y
yum安装会自动联网下载相应软件依赖,yum要联网下载。

which setup  查看这个命令完整路径 /usr/sbin/setup
rpm -qf /usr/sbin/setup  查看某个命令来自哪个软件包

查看文件所属的软件包
# rpm -qf 文件名称        
案例:查询/etc/ntp.conf 属于哪个软件包
# rpm -qf /etc/ntp.conf
ntp-4.2.6p5-28.el7.centos.x86_64
查询软件安装完成后生成了哪些文件
# rpm -ql 软件名称
案例:查询安装firefox软件生成了哪些文件
# rpm -ql firefox
说明:软件安装完成后,一共生成了以下几类文件
配置文件类:/etc目录
程序文件本身,二进制文件命令:/usr/bin或/usr/sbin目录
文档手册:/usr/share/doc或man目录

rpm软件包的获取(光盘)
使用 # lsblk(list block devices)查看块设备信息
/dev/sr0代表光驱设备,挂载点(MOUNTPOINT)默认光驱挂载到此路径 /run/media/mpp/CentOS 7 x86_64 
使用cd命令,切换到挂载目录,# cd /run/media/mpp/CentOS\ 7\ x86_64
使用cd命令,切换到Packages软件包目录,# cd Packages
查询我们要安装的软件包,# ls | grep firefox
firefox-60.2.2-1.el7.centos.x86_64.rpm
使用# rpm -ivh命令安装软件
# rpm -ivh firefox-60.2.2-1.el7.centos.x86_64.rpm
输入firefox + Tab,让其自动补全
Linux系统的中所有存储设备必须先挂载后使用,
umount解挂,# umount 挂载点
# umount /run/media/mpp/CentOS\ 7\ x86_64
问题:当执行以上命令时,系统提示target is busy
原因是在挂载点(当前目录为挂载目录)进行解挂。
要先进入家目录再执行解挂指令
# cd ~
# umount /run/media/mpp/CentOS\ 7\ x86_64
挂载mount,先建一个挂载点,挂载点是一个空目录。
# mount 设备文件路径 挂载点路径
光驱的设备文件为/dev/sr0,案例:把光驱挂载到/mnt/cdrom目录
# mkdir /mnt/cdrom
# mount /dev/sr0 /mnt/cdrom
可用# lsblk指令查看是否挂载成功
案例:把/mnt/cdrom进行解挂操作
解挂:# umount 当前设备的挂载点(路径) 
# cd ~  要先进入家目录再执行解挂
# umount /mnt/cdrom    
解挂后/mnt目录下的cdrom 目录还是存在的

源码安装三步走,配置编译安装
1、配置软件的安装路径(./configure),使用默认安装路径
./configure --prefix=/application/nginx  --with-http_ssl_module  --with-http_stub_status_module
      --prefix=PATH   --- 修改程序安装路径
      --with-xxxx     --- 软件可以支持功能
	  --without-xxxx  --- 取消软件默认功能  
2、编译make,用gcc编译器将源码包编译成二进制的软件包
3、安装make install(把编译后的程序进行安装到Linux系统)
进入源码包解压后的软件目录 => ./configure => make => make install
进入源码包解压后的软件目录后,可查看帮助,# ./configure --help
axel多线程下载软件源码安装,进入到解压包目录里,# cd axel-2.4
对axel软件进行配置(不采用默认配置),设置axel软件的安装路径为/opt/axel
# ./configure --prefix=/opt/axel
对axel软件进行编译与安装,# make && make install
&& :逻辑与,如果make编译成功会立即执行右边的make install安装程序,如果make编译失败,则以上程序会停止执行,然后抛出错误。
确认成功安装,# ls /opt/axel/
卸载源码安装的软件
1、进入到解压包目录里,# cd axel-2.4
# make uninstall,卸载安装
# make distclean,卸载编译与配置过程
2、删除软件的目录
# rm -rf /opt/axel
# rm -rf axel-2.4
编译,就是通过编译工具,把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0。

axel多线程下载软件,通过源码的方式安装成功后,由于没有使用默认的安装路径,导致axel这个命令没有出现在系统的环境变量中,所以其会出现command not found。
使用软链接解决command not found
# which axel 查看二进制命令的绝对路径
# ll /opt/axel/bin
axel
解决方案:给/opt/axel/bin/axel创建一个快捷方式到/usr/local/bin
# ln -s /opt/axel/bin/axel /usr/local/bin/axel 
基本语法:# ln -s  源文件路径 软链接路径
使用环境变量解决command not found
终端=>命令=>系统的环境变量(PATH => /etc/profile) =>一些命令的存放路径
1、查询当前系统的环境变量
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2、把axel所在目录添加到环境变量
使用vim编辑/etc/profile文件,追加到最后一行
# vim /etc/profile
...
export PATH=$PATH:/opt/axel/bin
# source /etc/profile  让配置文件立即生效
使用echo命令向/etc/profile文件中追加一行 (默认换行追加)
# echo 'export PATH=$PATH:/opt/axel/bin' >> /etc/profile
# source /etc/profile  让配置文件立即生效

十三、yum源
yum安装能自动解决软件依赖问题,yum命令需要root权限。
yum是基于rpm包管理,能够从指定的服务器(yum源)自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。
rpm和yum区别?
答:① yum底层也是基于rpm进行安装的(yum安装的软件,可以通过rpm -qa进行查询) ② yum相对于rpm最大的优势,可解决依赖关系。
RPM安装(下载软件、单独安装、需要解决依赖关系)
源码安装(下载软件的源码包,解压,进入目录=>配置+编译+安装)
yum源:相当于rpm软件包管理的升级版,能够解决软件包之间的依赖关系。
yum源底层还是基于RPM进行软件安装操作的,所以yum安装软件后,也可以通过rpm -qa | grep 软件名称 来查看已安装的软件包。
本地yum源:yum仓库在本地(系统光盘/镜像文件)不需要网络的支持
网络yum源:yum仓库不在本地,在远程,要联网。
国内较知名的网络源(aliyun源,163源等)
​ 阿里源:https://opsx.alibaba.com/mirror
​ 网易源:http://mirrors.163.com/
国外较知名的网络源(centos源、redhat源、扩展epel源等)
特定软件相关的网络源(Nginx、MySQL、Zabbix等)

YUM源配置文件在这个目录/etc/yum.repos.d/
本机yum源备份
1、使用cd命令切换到/etc/yum.repos.d目录
# cd /etc/yum.repos.d/
2、对所有的仓库文件进行备份
# tar -zcf repo.tar.gz *.repo
3、删除所有的以.repo结尾的仓库文件
# rm -rf *.repo
CentOS-Base.repo为网络yum源配置文件
CentOS-Media.repo为本地yum源配置文件

本地YUM源配置
1、本地YUM配置
① 使用光盘镜像作为YUM源仓库
② 下载很多软件,使用软件包作为YUM源仓库
2、使用光盘镜像作为YUM源仓库
把光盘挂载到某个目录下
# mount -o ro /dev/sr0 /mnt
-o :挂载方式,
ro代表以readonly,只读的方式进行挂载
rw代表以read/write,读写的方式进行挂载
# lsblk 查看是否挂载成功
手动挂载后,系统重启需要再次手动挂载
3、把光盘挂载添加到开机启动文件中
开机自动挂载,修改/etc/rc.local文件
/etc/rc.local操作系统开机最后读取的一个文件
echo "mount -o ro /dev/sr0 /mnt" >> /etc/rc.local
# chmod +x /etc/rc.local
系统启动后,会自动加载并执行这个文件/etc/rc.local
4、编写本地YUM仓库文件,配置文件路径为/etc/yum.repos.d/
# cd /etc/yum.repos.d/
创建一个以*.repo结尾的文件,名称任意,vim后会自动保存命名此文件。
# vim local.repo
[local]   仓库名字(自定义),不要有特殊符号
name=local yum   仓库描述
baseurl=file:///mnt    指定yum仓库的路径,就是前面的挂载点,支持多种格式,file://本地路径,ftp://,http://,https://
enabled=1      启用仓库,1启用,0不启用
gpgcheck=0     不用校验软件包的密钥,0不校验,1校验,如果是1校验,下方还要定义一个gpgkey=密钥连接
保存后再执行下面指令
# yum clean all 清空yum缓存
# yum makecache 重新创建yum缓存
注:file://本地协议路径,后面跟仓库的具体路径,就是前面的挂载点

网络YUM源配置,当前主机要能访问互联网
配置阿里云的yum源
1、备份默认网络yum源CentOS-Base.repo(国外网速慢)
# cd /etc/yum.repos.d
# mv CentOS-Base.repo CentOS-Base.repo.bak  重命名备份
2、使用wget命令下载阿里云镜像文件到指定路径并重命名,-O (大O):指定文件下载的位置和名称
# wget -O /etc/yum.repos.d/CentOS-Base.repo 
http://mirrors.aliyun.com/repo/Centos-7.repo
使用阿里云的yum源代替默认的网络yum源,http://mirrors.aliyun.com/repo/选择不同centos版本的yum源
3、清理YUM缓存,# yum clean all
4、重新建立缓存(让新YUM源生效),# yum makecache

扩展:EPEL源配置,EPEL是对官网源的一个扩展。epel是“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS等系统。
epel.repo文件,是对官方YUM源的一个补充。
# yum install epel-release -y
比如:会跑的小火车就是在epel源中
# yum install sl -y
# sl

特定软件的YUM源配置
比如特殊的几个软件,如Nginx、MySQL、Zabbix
Nginx:http://www.nginx.org
MySQL:https://www.mysql.com/
Zabbix:https://www.zabbix.com/
找到官方文档,把YUM源配置,写入到文件中(repo文件)

yum配置总结
1、本地yum源配置核心:
本地需要有软件仓库,光盘挂载到系统某个目录上(mount -o ro /dev/sr0 /mnt)
告诉yum工具去哪个仓库找软件包,修改配置(/etc/yum.repos.d/xxx.repo)
2、网络yum源配置核心
当前主机必须能够访问互联网(外网源)
告诉yum工具去哪个仓库找软件包,修改配置(/etc/yum.repos.d/xxx.repo)
配置方法2种:1直接修改配置文件xxx.repo 2下载rpm包,安装软件包自动帮我配置xxx.repo
通过安装相应软件包直接配置xxx.repo, # rpm -ivh 软件包名称.rpm
说明:该方法是通过安装软件包,自动在相应目录里创建.repo文件(自动配置)
先通过wget下载rpm软件包,再 # rpm -ivh 软件包名称.rpm
epel源:
https://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm(路径失效有问题)
mysql源:
https://repo.mysql.com/mysql-community-release-el7.rpm
noarch是no architecture的缩写,说明这个包可以在各个不同的cpu上使用。
3、如果多个仓库里有相同的软件包,高版本优先
4、多个yum源,可以指定优先级,但是需要安装插件,修改配置文件完成。

yum仓库优先级
有多个仓库,可设置yum源的优先级,但需要安装插件yum-plugin-priorities安装完插件后,只需要在yum源配置文件*.repo里指定优先级即可,如:
添加priority=n的配置项,n值越小优先级越高,默认99
[local]
name=local yum
baseurl=file:///mnt
enabled=1
gpgcheck=0
priority=1

yum缓存软件包
1、缓存安装软件包,什么时候需要缓存软件?
下次还需要安装相同版本的软件包
由于网络原因导致网络安装非常慢,将软件包缓存下来,配置本地仓库。
2、如何缓存软件安装包
# vim /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever  定义软件包的缓存路径
keepcache=1   1开启缓存,表示缓存安装软件包到本地  0关闭
debuglevel=2
logfile=/var/log/yum.log
...
3、把软件及依赖软件全部下载到某个路径
只下载不安装软件:
# yum install --downloadonly --downloaddir=保存路径 软件名称
案例:下载samba软件及依赖软件
# mkdir /soft
# yum install --downloadonly --downloaddir=/soft samba

自定义YUM仓库
1、在系统中安装createrepo制作仓库的软件
# yum install createrepo -y
2、把/soft文件夹做成一个本地的自建仓库
# mkdir /soft
# createrepo /soft
# ls /soft  验证/soft目录是否多了repodata目录
3、在/etc/yum.repos.d目录中创建一个soft.repo的仓库
# cd /etc/yum.repos.d/
# vim soft.repo
[soft]
name=soft yum
baseurl=file:///soft
gpgcheck=0
enabled=1
4、清理缓存+重建缓存
# yum clean all
# yum makecache

配置MySQL官方yum源
1、下载官方提供的yum仓库软件包,找到适合自己系统的软件包下载,https://dev.mysql.com/downloads/repo/yum/
2、通过安装软件包来自动配置yum源仓库配置文件(wget默认下载到当前路径)
# wget https://dev.mysql.com/get/mysql80-community-release-el6-2.noarch.rpm
安装软件包
[root@yunwei ~]# rpm -ivh mysql80-community-release-el6-2.noarch.rpm
warning: mysql80-community-release-el6-2.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing...        ########################################### [100%]
  1:mysql80-community-relea########################################### [100%]
查看自动配置的mysql源仓库配置文件
[root@yunwei ~]# ls /etc/yum.repos.d/mysql-community*
/etc/yum.repos.d/mysql-community.repo /etc/yum.repos.d/mysql-community-source.repo
注意:
1.默认情况下,官方提供最新版本的软件,我们需要根据自己的情况进行修改配置文件
2.我们需要安装mysql-5.6版本,所以关闭其他版本的仓库,只打开5.6的仓库
[root@yunwei ~]# cd /etc/yum.repos.d/
[root@yunwei yum.repos.d]# vim mysql-community.repo
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1				将0改为1,开启5.6版本仓库
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
....
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/6/$basearch/
enabled=0			将1改改为0,关闭默认的8.0版本仓库
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
以下两个仓库也关闭,暂时用不到
[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-tools-community]
name=MySQL Tools Community
baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
3、清空yum缓存重新创建缓存
[root@yunwei yum.repos.d]# yum clean all
[root@yunwei yum.repos.d]# yum makecache
安装MySQL-5.6.43版本软件包
# yum install mysql-community-server -y
通过网络安装,可能会由于网络原因安装不成功,多试几次即可
一台机器安装好后,如果另外一台也需要安装,可以通过开启缓存下载下来,做成本地仓库安装。

yum命令详解,yum安装的软件,可通过rpm -qa进行查询
搜索要安装的软件,# yum search 软件名称的关键词
案例:搜索firefox火狐浏览器,# yum search firefox
使用yum安装软件,# yum install 软件名称 [选项]
选项:-y :yes缩写,确认安装,不提示。
案例:使用yum命令安装firefox浏览器,# yum install firefox -y
使用yum卸载软件,# yum remove 软件名称 [选项]
选项:-y :yes缩写,确认卸载,不提示。
案例:把firefox火狐浏览器进行卸载操作,# yum remove firefox -y
使用yum更新软件,# yum update 软件包名称关键词 [选项]
选项:-y :yes缩写,确认更新,不提示
注意:更新软件包的关键词如果不写,则表示更新整个系统(全局更新,也包含内核)
案例:把firefox火狐浏览器进行更新操作,# yum update firefox -y

rpm工具使用
rpm -ivh package 安装
rpm -e package  卸载
rpm -Uvh 升级,如果没安装,则直接安装
rpm --nodeps  强制卸载忽略依赖关系
rpm -ql 查看已经安装的软件的文件列表
rpm -qa  查看已经安装的所有rpm包
rpm -qc  查看软件的配置文件
rpm -qf  filename 查看文件来自哪个rpm包

yum工具使用
# yum clean all  清空之前的yum列表缓存
# yum makecache   创建新的缓存
# yum list   列出仓库里的所有软件包
# yum repolist   列出已配置的软件仓库
# yum list|tail  查看未安装的软件包
# yum list |grep 关键字
@代表已经安装成功
# yum list installed  查看已安装的包
# yum grouplist  查看包组
# yum groupinstall  "包组"    安装包组
# yum groupremove "包组"   移除包组
# md5sum +包名   直接校验第三方提供的软件包 

十四、系统重要文件介绍

系统配置文件:/etc/profile /etc/bashrc  ~/.bashrc  ~/.bash_profile
配置文件修改后生效:source  /etc/profile 或 . /etc/profile  
配置文件设置变量永久生效。局部设置优先级高于全局设置。
 /etc/profile /etc/bashrc:   文件配置变量信息之后,会全局生效(系统中所有用户都可以识别)
 ~/.bashrc  ~/.bash_profile:文件配置变量信息之后,只会局部生效(只有指定用户可以识别,其他用户无法识别)
临时设置别名,alias 别名名称='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
alias ifnet0='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
将别名设置信息写入配置文件永久生效,
vim /etc/profile
alias ifnet0='cat /etc/sysconfig/network-scripts/ifcfg-eth0'   最后一行
取消别名:用unalias取消别名

使用echo命令向/etc/profile文件中追加一行 (默认换行追加)
# echo 'export PATH=$PATH:/opt/axel/bin' >> /etc/profile
# source /etc/profile  让配置文件立即生效

   /proc目录重要文件信息:
   /proc/cpuinfo  --- 查看CPU硬件信息
   model name	: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz   ---CPU型号
   physical id	: 0                                          ---CPU颗数
   processor	: 0                                          ---CPU核心数
   
   grep -c只输出匹配行的计数
   grep -c "physical id" /proc/cpuinfo     --- 服务器中有多少颗CPU 
   PS:总结颗数时,要确认physical id不能相同才能进行统计,相同时需要取消重复的
   grep -c "processor" /proc/cpuinfo       --- 服务器总核心数
   PS:每颗CPU核心数=CPU总核心数/颗数
   
   /proc/meminfo  --- 查看内存硬件信息
   MemTotal:        1865308 kB    --- 服务器总内存情况
   MemFree:         1554888 kB    --- 服务器空闲内存容量 多
   MemAvailable:    1538200 kB    --- 服务器可用内存容量 少  关注可用
   Buffers:            2092 kB    --- 缓冲区占用内存空间
   Cached:           102956 kB    --- 缓存区占用内存空间
   SwapCached:            0 kB    --- 占用交换分区容量

   /proc/loadavg  --- 查看系统负载情况
   0.76            0.45                0.21 
   每分钟平均负载  每5分钟平均负载     每15分钟平均负载
   PS:负载值 < 服务器总核心数
   
   /proc/mounts   --- 查看磁盘挂载情况

十五、磁盘管理
磁盘先分区、再格式化分区成想要的文件系统,数据是放在每个分区上的。
/dev/sda1(真实磁盘):a第一块硬盘、1第一个分区
s=硬件接口类型(sata/scsi),d=disk(硬盘),a=第1块硬盘(b,第二块),2=第2个分区
/dev/vdb2(虚拟磁盘):b第2块硬盘、2第2个分区
挂载/data目录后,使用的空间,是挂载的对应的磁盘分区空间;卸载后/data使用的空间,是默认的/根空间。
在这里插入图片描述

# lsblk 查看磁盘大小,包含挂载和不挂载的
# df -Th 查看已挂载的磁盘,-T查看的内容中有文件系统类型
# blkid 查看系统类型和设备的uuid号
# lsof 查看当前挂载点有哪些进程在用
# cat /proc/partitions 查看磁盘分区情况(推荐使用)
# fdisk -l /dev/vdb  查看磁盘分区情况

硬盘有2种分区方式,MBR分区和GPT分区。
MBR分区方式,硬盘大小<2TB,用fdisk分区工具,一个硬盘最多可分4个主分区或者3个主分区+1个扩展分区(扩展分区下可分N个逻辑分区)
MBR(Master Boot Record)的缩写,由三部分组成
1. Bootloader(主引导程序)446字节,硬盘每一个扇区都是512字节。引导操作系统的主程序。
2. DPT分区表(Disk Partition Table)64字节
分区表保存了硬盘的分区信息,操作系统通过读取分区表内的信息,就能够获得该硬盘的分区信息。
每个分区需要占用16个字节大小,保存有文件系统标识、起止柱面号、磁头号、扇区号、起始扇区位置(4个字节)、分区总扇区数目(4个字节)等内容。
分区表中保存的分区信息都是主分区与扩展分区的分区信息,扩展分区不能直接使用,需要在扩展分区内划分一个或多个逻辑分区后才能使用。
逻辑分区的分区信息保存在扩展分区内而不是保存在MBR分区表内,这样就可以突破MBR分区表只能保存4个分区的限制。
3. 硬盘有效标志(校验位)2个字节。
GPT分区方式,硬盘大小>2TB,用gdisk或parted分区工具,可分128个主分区。
注意:从MBR转到GPT,或从GPT转换到MBR都会导致数据全部丢失。
一个硬盘小于2TB可用MBR或GPT分区方式,一个硬盘大于2TB只能用GPT分区方式。

1、最多只能分4个主分区,主分区编号1-4。
2、逻辑分区大小总和不能超过扩展分区大小,逻辑分区大小由扩展分区决定的,逻辑分区分区编号从5开始。
扩展分区不能格式化,因为扩展分区不能存数据,要格式化的是其下的逻辑分区。
3、如果删除扩展分区,下面的逻辑卷分区也被删除。
一个硬盘可以不分主分区,只分一个扩展分区。
4. 扩展分区的分区编号(1-4)扩展分区属于主分区编号之内的,逻辑分区才是扩展分区之下的。
扩展分区不能存数据,只是保存下面逻辑分区的分区信息,只能在扩展分区下面的逻辑分区存数据。
扩展分区只是存储逻辑分区的分区信息,但实际创建其大小时要给足空间,否则逻辑分区空间不足以分配。
要想分区多空间够,把除主分区外的剩余大小空间都给扩展分区,结束柱面(last cylinder)不给指定大小多少G,按回车默认会把剩余的空间都给扩展分区。创建分区的时候尽可能注意分区序号的连续性。

分区后不能直接存数据,要格式化挂载使用。
当前操作系统支持的文件系统类型有哪些?         
输入mkfs.指令 按两次TAB键补充查询的所有指令
# yum install dosfstools -y   
安装dosfstools软件得到更多的文件系统类型
# mkfs.ext4  /dev/sdb1  
格式化某个分区成想要的文件系统类型
# blkid  /dev/sdb1    
查看设备的UUID和文件系统类型

自动挂载,修改/etc/rc.local文件,系统启动后最后读取的文件,
要给这个文件加个x可执行权限才能开机自动执行,# chmod +x /etc/rc.local
vim /etc/rc.local
/bin/mount -o exec,ro /dev/sdb1 /u01
-o:挂载选项	exec(可执行) ro(只读)

1、物理卷(Physical Volume,PV)
物理卷是底层真正提供容量,存放数据的设备,它可以是整个硬盘、硬盘上的分区等。
2、卷组(Volume Group, VG)
卷组建立在物理卷之上,它由一个或多个物理卷组成。即把物理卷整合起来提供容量分配。
一个逻辑卷(LVM)系统中可以只有一个卷组,也可以包含多个卷组。
3、逻辑卷(Logical Volume, LV)
逻辑卷建立在卷组之上,它是从卷组中“切出”的一块空间。它是最终用户使用的逻辑设备。逻辑卷创建之后,其大小可以伸缩。
4、物理区域 PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小可指定,默认为4 MB。 PE的大小一旦确定将不能改变,同一个卷组中的所有物理卷的PE的大小是一致的。
4MB=4096kb=4096kb/4kb=1024个block
说明:
1.硬盘读取数据最小单位1个扇区512字节
2.操作系统读取数据最小单位1个数据块=8*512字节=4096字节=4KB
3.lvm寻址最小单位1个PE=4MB

5、逻辑区域 LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

真实的物理设备——>逻辑上(命令创建)——>物理卷(pv)——>卷组(vg)——>逻辑卷(lv)——>逻辑卷格式化——>挂载使用 ( hd->pv->vg->lv)
逻辑卷设备映射路径为/dev/vg01/lv01或/dev/mapper/vg01-lv01  
使用fdisk来分区,fdisk  /dev/vdb  按m求帮助
n 添加新分区  
p 主分区  1    从1号开始,起始默认扇区直接回车,结束扇区加大小(+1G,有加号)
First sector   起始柱面默认回车
Laster sector  结束柱面 +1G ,Laster sector 结束柱面直接回车就是把剩余大小都给它
P 打印分区信息,w 保存退出,q直接退出

将分区格式化成想要的文件系统。vfat文件系统能在Linux、Windows和Mac系统之间共享文件。
# mkfs.ext3 /dev/vdb1
# mkfs.    按两次tab会列出所有文件系统

临时挂载 mount /dev/vdb1  挂载点   查看挂载情况 df -h
在当前挂载点不能解挂载,# umount 挂载点
永久挂载vim /etc/fstab 后要用mount -a 刷新
echo "/dev/vdb1 /mnt xfs defaults 0 0"  >> /etc/fstab
设备名/dev/vdb1  挂载点/mnt  文件系统类型xfs  defaults  0  0
修改/etc/fstab 后用# mount -a 刷新

# free -m 查看内存情况  # vmstat 2 10 监控内存等性能,2秒更新1次一共10次
swap交换分区,当物理内存(实际内存)不足时,可充当内存使用,swap约等于实际内存大小。
创建swap分区,使用fdisk来分区,fdisk  /dev/vdb  按m求帮助
n 添加新分区  
p 主分区  1    从1号开始,起始默认扇区直接回车,结束扇区加大小(+1G,有加号)
First sector   起始柱面默认回车
Laster sector  结束柱面 +1G ,Laster sector 结束柱面直接回车就是把剩余大小都给它
P 打印分区信息,w 保存退出,q直接退出

分区后格式化文件系统为swap类型,# mkswap /dev/vdb5
加载:swapon  /dev/vdb5

持久挂载vim /etc/fstab  后要用mount -a 刷新  注意这里swap挂载点无/
/dev/vdb5  swap  swap  defaults  0  0
修改/etc/fstab 后用# mount -a 刷新
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值