概述
目录
- Linux简介
- Linux的安装
- 虚拟机配置
- 系统分区
- 分区的形式
- 分区类型
- 分区格式化
- 设备文件名
- 挂载点
- Linux的安装
- SSH连接
- 初学注意事项
- 与WIndwos的区别
- Linux服务器管理
- Linux的目录结构
- 远程服务器注意事项
- 常用命令
- 命令的基本格式
- 目录操作命令
- 文件操作命令
- 文件与目录命令
- 权限命令
- Linux的基本权限
- 权限基本命令
- 权限的基本作用
- umask默认权限
- 帮助命令
- 搜索命令
- 管道符
- 别名与快捷命令
- 压缩与解压命令
- 开关机命令
- 网络命令
- 系统痕迹命令
- 挂载命令
- Vim编辑器
- 软件包安装
- 软件包的分类
- 二进制包
- 二进制RPM包命令
- RPM包的命名规则
- RPM包的安装
- RPM包升级
- RPM包卸载
- RPM包的查询
- RPM包验证
- 数字证书
- RPM包的文件提取命令
- RPM包在线安装命令yum
- 源码包的安装
- 脚本包安装
- 用户管理
- 用户相关文件
- 用户管理命令
- 组管理命令
- 权限管理
- ACL权限
- sudo 授权
- 特殊文件权限
- chattr权限
- SELinux权限
- 文件系统管理
- 硬盘结构与接口
- 文件系统
- 文件系统组成
- 常见的文件系统
- 常用硬盘管理命令
- 手工分区的方法
- 高级文件系统管理
- 磁盘配额
- LVM逻辑卷管理
- 基本原理
- 图形界面下分区
- 使用fdisk分区
- Shell基础
- Shell概述
- Shell的执行方式
- Shell的基本功能
- Shell的变量和运算符
- 变量
- 运算符
- 环境变量配置文件
- Shell编程
- 正则表达式
- 字符截取和替换
- 字符处理命令
- 条件判断
- 流程控制语句
- 特殊流程控制语句
- 启动引导与修复
- 系统的运行级别
- 启动引导程序
- 系统修复模式
- 服务管理
- 服务的简介与分类
- RPM包的启动和自启动
- Linux中常见的服务的作用
- 系统管理
- 进程管理
- 工作管理
- 系统资源查看
- 系统定时任务
- 日志管理
- 日志
- 日志服务
- 日志轮替
Linux简介
Unix主要发行版
操作系统 | 公司 | 硬件平台 |
---|---|---|
AIX | IBM | PowerPC |
UX | HP | PA-RISC |
Solaris | SUN | SPARC |
Linux,BSD | … | IA(Intel、AMD…) |
常用开源软件
- Web服务器:Apach/Nginx
- 数据库:MySQL/SQLserver/Oracle/MongoDB
- 脚本语言:PHP/Ruby/Python
- 文件服务器:Samba
支撑互联网的开源技术:LAMP(Linux,Apach,MySQL,PHP)
Linux的安装
虚拟机配置
- CentOS 6 安装最小内存是628MB,实际运行还可以更小,选择1024M
- 硬盘选择20G
- 处理器数量不超过线程数
- 网络配置
- 桥接:连接了本地真实网卡,可以连接到本机,局域网,公网。注意要手动设置桥接到那块网卡
- NAT:连接到虚拟网卡,可以连接本机和公网
- 主机模式:连接到虚拟网卡,可以连接本机
虚拟机快照
可以理解为是游戏存档,可用于系统的快速恢复,系统克隆
系统分区
为了读取数据方便,我们将硬盘逻辑上的进行了分区
分区的形式
- MBR分区表:主引导记录分区表,最古老的,最大支持2.1T硬盘,最多支持4分区
- GPT分区表:全局唯一标识分区表,最大9.4ZB,无分区限制
分区类型
- 主分区:最多四个
- 扩展分区
- 最多一个
- 主+扩最多四个
- 不能写入数据,只能包括逻辑分区
- 逻辑分区
这里的最多4个指的是MBR分区表
在使用MBR的时候最多4个分区可能不能满足我们使用,所以可以使用扩展分区,但是两者加起来不得超过4个,扩展分区不能写入数据,可以在里面放逻辑分区
分区格式化
格式化又叫逻辑格式化,目的是用于写入文件系统,在磁盘特定区域划出一片用于存放文件分配表,目录表等用于文件管理的磁盘空间,Windows下常见的文件系统有FAT16,FAT32,NTFS,Linux下常见的有EXT2,EXT3,EXT4
格式化会将分区划成两部分
- 一部分用来存数据,这部分会将硬盘划成等大的数据块(默认4KB),一个数据块如果没有写满也不能存别的数据
- 一部分用来索引,将这个索引叫做inode,一个inode为128B,存放文件的位置,时间,权限
设备文件名
Linux下所有设备都有文件名,其中
- /dev/hda1:IDE硬盘接口
- /dev/sda1:SCSI/STAT接口
其中前两个字母(例如:sd)表示设备类型,之后的字母与数字(例如sda1的a1)表示这个类型的第几块硬盘的第几号分区,注意是第几号分区,例如有两种分区方式
- 三个主分区,分别是sda1-sda3,一个扩展分区是sda4,扩展分区有两个逻辑分区发表是sda5,sda6
- 一个主分区是sda1,一个扩展分区是sda2,扩展分区有两个逻辑分区发表是sda5,sda6
注意sda1-sda4永远是主分区或者扩展分区的,逻辑分区一定是sda5+
挂载点
使用已经存在的空目录作为挂载点
-
必须分区
- / (根分区)
- swap分区(交换分区,允许你不分,但是强烈建议)
- 实际内存小于4G应该是2倍
- 实际内存大于4G应该与实际一致
- 实验用虚拟机不大于2G
-
推荐分区
-
/boot (启动分区 1G 强烈建议)
当系统启动的时候,系统会临时释放很小一点文件用于启动,如果硬盘写满,这点空间都没有就无法启动,于是单独开一个boot用于启动
-
-
常用分区
- /home 常用于文件服务器
- /www 常用于Web服务器
挂载点的位置随意,但是/bin,/lib,/etc必须和/在同目录
Linux的安装
关于ISO文件中的"dvd1"
虚拟机开机之后会选择第一个安装,之后出现蓝窗口,问你找到硬盘,要不要检测里面有什么,选跳过,检测很慢,之后可能报错,说显卡有问题,此时重启或者换镜像
语言选择简体中文,这里的选择语言不仅仅是安装过程的语言,而是安装的系统的,不选中文就没有中文的编码与字体包
然后选择基本存储,主机名需要修改,否则整个集群都是一个名字,暂时不要修改
选择创建自定义分区
选择空闲-标准分区-挂载点:/home-大小2048M-固定大小-不加密,同理创建
- /boot 200M boot必须是启动分区,有他必须是sda1,不能是sda2
- / 15G
创建交换分区:文件系统类型为swap不需要挂载点
真实的服务器选minimal,此时为了学习选择BasicServer
之后会自动安装
SSH连接
若是VirtualBox则务必设置为NAT端口转发,在高级中选择端口转发添加规则,客户机端口为22,主机端口选择不用的
开机后ifconfig
看看有没有检测到非lo的网卡,没有的话
ip a # 查看新网卡
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth0 # eth0换成新网卡
# 将ONBOOT改为yes
service network restart # 重启网络服务
之后在主机上进行ssh连接,linux为
ssh -l [CentOsUsername] -p 1111 127.0.0.1 # 将1111替换为当时端口转发的主机端口
windows直接远程工具
初学注意事项
与WIndwos的区别
- Linux严格区分大小写,没有大写命令,命令的选项有大写
- Linux一切皆文件,硬件也是文件,永久保存的配置必须写入文件
- Linux不靠扩展名区分文件类型,靠权限标识识别文件类型,但是部分特殊文件还是要求写扩展名以区分类型,有
- 压缩包:如果压缩包没有扩展名管理员不知道用哪个命令去解压缩压缩包
- 二进制软件包:redhat下软件包用.rpm,debian下一般是.deb
- 程序文本:shell的.sh
- 网页文件:.htlp,.php…是网页服务器要求的
- 所有的存储设备必须挂载后使用
Linux服务器管理
Linux的目录结构
目录名 | 作用 |
---|---|
/bin/ | 存放系统命令的目录,所有用户都可以执行,是/usr/bin/的软链接 |
/sbin/ | 存放系统命令的目录,root可以执行,是/usr/sbin/的软链接 |
/usr/bin/ | 存放系统命令的目录,所有用户都可以执行 |
/usr/sbin/ | 存放系统命令的目录,root可以执行 |
/boot/ | 系统启动目录。存放与启动相关文件如内核与启动引导(grub)等文件 |
/dev/ | 设备文件保存位置(例如分区) |
/etc/ | 保存配置文件(默认安装的程序的配置文件) |
/home/ | 普通用户的家目录 |
/root/ | root用户的家目录 |
/lib/ | 系统的函数库(频繁调用的程序库,例如C的iostream) |
/lib64/ | 系统的64位函数库(只要看到.so.数字的都是函数库) |
/lost+find/ | 当系统意外关机之后产生的碎片文件,再次开机如果可以恢复系统会自动恢复 |
/media/ | 空目录,事先准备的挂载点,一般用于挂光盘 |
/misc/ | 空目录,事先准备的挂载点,一般用于挂网络设备 |
/mnt/ | 空目录,事先准备的挂载点,一般用于挂硬盘 |
/opt/ | 软件安装位置(用的少,还是习惯在/usr/local) |
/proc/ | 不是硬盘的挂载点,里面挂载的是内存 |
/sys/ | 不是硬盘的挂载点,里面挂载的是内存 |
/net/ | 不是硬盘的挂载点,里面挂载的是内存 |
/selinux/ | linux的增强安全组件,用来限制root |
/usr/ | Unix Software Resource系统软件资源目录的缩写,存放系统资源文件的目录 |
/var/ | 存放动态数据的目录 |
/tmp/ | 临时文件 |
/usr/lib/ | 应用程序调用函数库保存位置,和/lib/的不一样 |
/usr/local/ | 程序安装位置 |
/usr/share/ | 资源文件保存位置,例如文档,说明文档,字体目录 |
/usr/src/ | 源码包保存位置,不过一般是放内核源码,建议三方的源码一般放/usr/local/src,内核放在/usr/src/kernels |
/usr/src/kernels/ | 建议将内核源码放这里 |
/var/log/ | 系统日至目录 |
/var/lib/ | 程序运行时数据保存目录 |
/var/lib/mysql/ | MySQL数据库保存位置 |
/var/www/html/ | 默认的apach网页目录 |
/var/run/ | 服务启动后他们的PID的保存位置,是/run/的软链接 |
/var/spool/ | 放置队列数据的目录,例如邮件队列与打印队列 |
/var/spool/mail/ | 邮件队列,收到的邮件会保存在此处 |
/var/spool/cron/ | 系统定时任务队列的存储位置 |
-
有bin的是二进制命令文件是所有人都能执行的,sbin是管理员执行的,bin与/usr/bin目前几乎没有区别
-
*.so.数字
的文件是Linux的重要函数库 -
Linux准备了三个点挂载,但是习惯于用/mnt/
远程服务器注意事项
- 服务器只能重启不能关机
- 重启之前要终止正在执行的任务
- 重启建议选用
shutdown -r now
并且在重启前多次执行sync
命令,他可以将内存中的数据同步在硬盘上 - 不在访问 高峰进行高负载命令
- 配置防火墙的时候不要把自己踢出服务器,有个笨办法是在每次配置防火墙之前开定时人物没10min删除防火墙配置,确认配置没问题之后再关闭定时人物
常用命令
命令的基本格式
-
命令提示符
[root@bogon ~]#
第一部分是登陆的用户,例如目前是root,@是分隔符无意义,bogon是当前系统的简写主机名,~是当前的路径,之后是命令提示符
#
或$
,#
表示是root用户,$
表示是普通用户 -
命令的基本格式
命令 [选项] [参数]
[]表示可选,选项用于调整命令的功能,参数用来指定操作对象,不写就执行默认参数,例如
ls -l
表示长格式输出 -
ls -l
的输出解释[root@bogon ~]# ls -l 总用量 44 -rw-------. 1 root root 1284 1月 22 20:31 anaconda-ks.cfg -rw-r--r--. 1 root root 28250 1月 22 20:31 install.log -rw-r--r--. 1 root root 7572 1月 22 20:30 install.log.syslog
- 第一列表示权限
- 第二列是引用计数,对于文件表示有多少硬链接的个数,对文件夹表示有多少个一级子目录
- 第三列表示文件所有者
- 第四列表示文件所属组,分配所有者与所属组是为了方便赋权限
- 第五列文件字节(默认Byte)
- 第六列是文件修改/访问时间
-
ls
的其他选项-h
以易于阅读的格式输出文件大小,例如KB-a
显示隐藏文件-d
显示目录本身而不是子文件ls /
与ls -d /
-i
显示文件inode节点号
-
隐藏文件的作用:告诉你不要动而不是想藏起来
-
Linux中绝大部分选项没有先后顺序,例如
ls -al
与ls -la
目录操作命令
-
ls
命令 -
cd
命令用于切换所在的目录,注意区分绝对与相对路径,Linux中特殊路径符号有:
~
家目录-
上次所在目录.
当前目录..
上一级目录pwd
显示当前目录cd
可以直接回到家目录 -
mkdir
命令mkdir tmp
建立目录tmpmkdir -p ./1/2/3
使用-p选项递归建立目录
-
rmdir
命令rmdir
只能删除空目录,所以不推荐使用
-
rm
命令rm
删除文件(夹)-r
递归删除-f
不提示是否确认,强制删除- 防止误删除建议安装
extundelete
文件操作命令
-
touch
命令- 用于创建新文件或者修改文件时间,也就是没有就创建,有就修改文件时间
touch 文件名
就创建了文件
-
stat
命令-
查看文件的基本信息,结果如下
[root@localhost ~]# stat abc File: "abc" Size: 0 Blocks: 0 IO Block: 4096 普通空文件 Device: 802h/2050d Inode: 393882 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2021-01-26 22:13:51.117999672 +0800 Modify: 2021-01-26 22:13:51.117999672 +0800 Change: 2021-01-26 22:13:51.117999672 +0800
分别是文件名,大小,占用块,每个块的大小,硬件设备标识号,inode,硬链接数目,权限,所有者ID,所属组ID,访问时间,修改时间,状态修改时间(修改权限的时间)
-
-
cat
命令- 查看文件内容
-n
查看行号-v
列出特殊字符(例如n
显示为$
)-A
显示所有的特殊字符cat
会输出所有内容,但是终端最大行数有限,不建议使用
-
more
命令- 分屏显示文件内容
空格
向下翻页/字符串
向下搜索字符串b
向上翻页回车
向下一行q
推出
-
less
命令- 分行显示文件内容
上下键
上下显示
-
head
命令- 显示文件头几行
-数字
显示文件头几行,不写是10行
-
tail
命令-
显示文件头几行
-
-数字
显示文件头几行,不写是10行 -
-f
监听文件变化,即当有程序向后面追加内容是自动显示变化,使用ctrl+C
退出
-
-
ln
命令ln filename ./it/is/path/
实现在./it/is/path/
下创建filename
的链接-s
创建软链接,不写默认硬链接
-
软链接与硬链接
我们知道block块放的是文件的内容,inode指向了文件的block地址,但是文件名不知道在那里,实际上文件名存在了他的父文件夹的block中,父文件夹的block里面有个文件名-inode的表,就是说查找文件的时候实际上是去文件夹的block中查找,按照这个说法/
的文件名-inode映射没地方存了,实际上/
的inode是固定的,是2(1在启动的时候被占用了)
创建硬链接后可以看到
18 -rw-rw-r--. 2 liukairui liukairui 0 1月 29 22:25 bcd
18 -rw-rw-r--. 2 liukairui liukairui 0 1月 29 22:25 ./bcd_h
两个文件的inode号相同,引用系数变为2,删除原文件/硬链接之后另一个文件正常存在,原因是硬链接与原文件同inode,删除文件只是删除了父文件夹的文件名-inode的一个映射,但是另一个映射不变
[liukairui@10 ~]$ rm ./bcd
[liukairui@10 ~]$ ls -ild ./bcd_h
18 -rw-rw-r--. 1 liukairui liukairui 3 1月 29 22:30 ./bcd_h
注意的是,不推荐使用硬链接,因为
-
系统不会明显的标注一个链接是硬链接,只能通过同inode与应用系数增加判断是硬链接
-
普通用户不能硬链接目录,见
[liukairui@10 ~]$ ln -db --help -d, -F, --directory 创建指向目录的硬链接(只适用于超级用户)
如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。
在说明第二个原因之前,我们先来看看文件的dentry结构在系统空间中长什么样子和它们是怎么存放在系统空间的。dentry结构主要包含了文件名,文件的inode 号,指向父目录dentry结构的指针和其他一些与本次讨论无关的指针,这里关键是那个指向父目录的指针;系统中所有的dentry结构都是按杂凑值存放在杂凑表中的,这里的杂凑算法很重要,它是取文件名和文件的父目录dentry结构的地址一起杂凑运算出杂凑值的。现在我们假设有两个目录 /a和/b,其中/b是我们通过ln -d命令建立起来的对/a的硬连接。这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知,/a和/b 目录下面的每一个文件或目录都各自有对应的dentry结构(因为虽然/a目录下面的文件名没有改变,但是因为dentry结构有指向父目录dentry 的指针和计算杂凑值时考虑了父目录dentry结构的地址,这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录下面的文件,这样下来就会浪费很多系统空间了,特别是如果被硬连接的目录中存在大量文件和子目录的时候就更加明显了。
-
只能同分区链接
软链接完全可以理解为windows下的快捷方式
-
删除原文件快捷方式就没了
-
在ls软链接的时候会提示原文件位置,例如
[liukairui@10 ~]$ ln -s bcd bcd_s [liukairui@10 ~]$ ls -ild bcd bcd_s 18 -rw-rw-r--. 1 liukairui liukairui 0 1月 29 22:49 bcd 19 lrwxrwxrwx. 1 liukairui liukairui 3 1月 29 22:49 bcd_s -> bcd
删除原文件之后重新ls会发现bcd链接地址变成黑底白字闪烁
-
软链接的权限是最大的例如上面的
19 lrwxrwxrwx.
,意思是所有人可以访问软链接但是软链接没数据还要访问原文件,权限还要看原文件 -
软链接一定要写绝对路径,否则出去或者拷贝软链接就找不到了
文件与目录命令
-
rm
命令- 删除文件或者目录
-f
强制删除-r
递归删除,目录操作使用-i
交互删除,在删除之前会询问用户(默认就是交互删除)
-
cp
命令cp 原文件 新文件的路径
在路径下复制同名新文件cp 原文件 新文件的路径/新文件名
在路径下复制改名新文件-r
复制目录使用-a
相当于-dpr
目标与原文件一模一样,包括修改时间等-i
覆盖同名文件
-
mv
命令-
移动文件/重命名
-
-f
强制覆盖 -
-i
交互移动,默认就是交互 -
-v
显示详细信息,例如[liukairui@10 ~]$ mv -v ./cp1 ./cp2 "./cp1" -> "./cp2"
-
权限命令
Linux的基本权限
ls -l
之后会看到文件的权限,形如:-rw-rw-r--.
-
第一位表示文件类型
-
表示普通文件d
表示目录文件(目录也是文件)l
表示软链接b
表示块设备文件,例如/dev/sda
c
表示字符设备,例如键盘p
管道符文件s
套接字文件,一些服务支持socket访问会产生这样的文件
-
第2-4位表示文件所有者u的权限
r
表示有读权限w
表示有写权限x
表示有执行权限
-
第5-7位表示文件所属组g的权限
-
第9-10位表示文件其他人x的权限
-
最后的
.
表示这个文件是被SELinux管理(保护)的
权限基本命令
-
chmod
命令- 修改文件的权限模式
chmod [选项] 权限 文件名
- 权限可以写
+/-
,写u+x
表示为u(所有者)添加x(执行)权限 - 权限可以用
,
连,写u+x,g-x
表示为u(所有者)添加x(执行)权限,同时为所属组去掉执行权限 - 权限可以用数字表示,
r=4,w=2,x=1
直接把需要的加起来就可以了,例如755
表示rwxr-xr-x
,常见的数字权限有755
文件的执行权限与目录的基本权限644
文件的基本权限777
最大权限,实际生产中不得赋予
- 权限可以写
-R
递归设置,给子目录文件设置
-
chown
命令- 修改所有者与所属组
chown 新所有者 文件
chown 新所有者:新所属组 文件
-
chgrp
命令- 修改所属组
chgrp 新所属组 文件
-
普通用户可以修改自己所有/所属文件权限,但是不能修改任何文件的所有者/所属组
权限的基本作用
权限对文件的作用
- r:一旦文件具有的读权限就可以读取数据,例如cat,more,less,head,tail等命令
- w:一旦文件具有写权限就可以修改文件内容使用例如
vim
,echo >>
写入,拥有w权限并不能删除文件,想要删除文件必须获得文件父文件夹的w权限 - x:代表文件有执行的权限,但是到底能不能正确执行或者能不能执行还要看文件本身
权限对目录的作用
- r:可以读目录,即可以
ls
- w:可以修改目录下的数据例如
touch
,rm
,cp
,mv
等等,这是目录的最高权限 - x:目录不能执行,目录拥有x权限就可以对目录进行cd,进入目录
- 当然如果是
rw-
这样没有x不能进去根本没有用,所以目录至少有x
umask默认权限
当一个文件新建的时候,会有一个默认的权限,这个权限就是从umask权限获取的,Linux是通过umask得到的一个文件的默认权限,使用umask
可以获取到系统的umask值。
- 对于系统说文件的默认最大权限是666(系统认为x是危险的,想要作为执行文件必须后期修改),文件夹是777
- 系统计算权限的方法是进行二进制的与非运算,对于手算可以采用先换成字母然后减去,例如umask是033,创建文件的时候默认是666是rw-rw-rw-减去033是----wx-wx就成了rw-r–r--
可以修改/etc/profile修改umask,这个文件是Linux环境变量
帮助命令
-
man
命令-
man 指令
-
可以使用上下箭头,PgUp/PgDn翻页,g移动到第一页,G文件尾,q退出,/查找,?反向搜索,n/N前后一个
-
帮助是有级别的,可以在man的左上角看到,其中
- 1级别表示普通用户可以执行的命令的帮助
- 2级别表示内核调用函数的帮助
- 3级别表示C语言的函数和工具的帮助
- 4级别表示设备和特殊文件的帮助
- 5级别表示配置文件的帮助
- 6级别表示游戏的帮助
- 7级别表示杂项的帮助
- 8级别表示root可以执行命令的帮助
- 9级别表示内核的帮助
可以使用
whatis 命令
/man -f 命令
查询命令的所有帮助,例如[liukairui@10 ~]$ whatis passwd passwd (1) - update user's authentication tokens passwd (5) - password file passwd [sslpasswd] (1ssl) - compute password hashes
可以使用
man 级别 命令
打开对应级别的命令,例如man 5 passwd
如果whatis不能用可以执行
makewhatis
来重建whatis -
-k
查询所有带有指定关键字的命令
-
-
info
命令info 指令
- info是一本书,每个命令是一节,其中命令的某些内容又是一个小节,可以用
- 可以使用上下箭头,PgUp/PgDn翻页
- 在前有
*
的一行回车进入小节 - tab在小节之间切换
- u进入父小节
- n/p进入下一小节/上一小节
- ?显示帮助
- q退出
-
help
命令- 获取shell内置指令的帮助
-
--help
选项大多数指令 --help
可以获取简明帮助
搜索命令
-
whereis
命令- 直接加命令的名字,只能搜索系统命令,不能搜索文件
- 显示命令的源文件与帮助文件的位置
-
which
命令- 查找系统命令的时候如果有别名也可以查到,例如
[liukairui@10 ~]$ whereis ls ls: /bin/ls /usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz [liukairui@10 ~]$ which ls alias ls='ls --color=auto' /bin/ls
whereis会提示ls的位置在/bin/ls帮助文档在usr/share/man/man1p/ls.1p.gz /usr/share/man/man1/ls.1.gz
which提示ls是
'ls --color=auto'
的别名,可以使用alias
查询所有别名 -
locate
命令-
可以直接加 文件名搜索普通文件
-
他是按照数据库搜索的所以速度快,消耗小,数据库位置在
/var/lib/mlocate/mlocate.db
-
但是只能按照文件名搜索不能做按照权限、大小、时间等搜索
-
由于他是按照数据库搜索的,所以新建的文件在升级数据库之间是找不到的,可以使用命令
updatedb
升级数据库 -
有的时候发现updatedb之后还是搜索不到,这是因为locate配置文件的问题,可以编辑
/etc/updatedb.config
PRUNE_BIND_MOUNTS = "yes" # 表示文件生效 PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs" # 不搜索文件类型,例如光驱中的文件 PRUNENAMES = ".git .hg .svn" # 不搜索扩展名为这些的文件 PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp" # 不搜索这些系统目录
-
-
find
命令-
按照文件名搜索[完全匹配],格式是
find 搜索范围路径 -name 文件名
- 按照文件名不区分大小写,格式是
find 搜索范围路径 -iname 文件名
- 按照inode搜索,格式是
find 搜索范围路径 -inum inode号
- 按照文件名不区分大小写,格式是
-
可以按照文件大小搜索,格式是
find 范围 -size [+/-]大小
其中±分别表示大于或者小于,不写就是等于,大小要写单位,KB是k
MB是M
,注意大小写,可以看find的帮助文档-size n[cwbkMG]File uses n units of space, rounding up. The following suffixes can be used: `b' for 512-byte blocks (this is the default if no suffix is used) 单位b表示是512字节,也就是说1b代表512Byte,b是默认呢单位 `c' for bytes 单位c表示是字节Byte `w' for two-byte words 单位w是2Byte `k' for kibibytes (KiB, units of 1024 bytes) 单位k是1024Byte注意小写 `M' for mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes) 单位M是大写 `G' for gibibytes (GiB, units of 1024 * 1024 * 1024 = 1073741824bytes) 单位G是大写
-
可以按照文件修改时间搜索,格式是
find 范围 -标签 [+-]时间
-atime
是按照文件访问时间搜索-mtime
是按照文件数据修改时间搜索-ctime
是按照文件状态修改时间搜索- 3,-3,+3代表第五天前修改,3天内修改,4天前修改的
-
按照文件权限搜索
find 范围 -perm xxx
查找权限恰好为那几个数字的文件find 范围 -perm +xxx
查找文件的三个权限中有任何一个权限比给出的大,例如666可以查到700文件find 范围 -perm -xxx
查找文件的三个权限都比给出的大,例如666不能查到700文件
-
按照文件的所有者/所属组查询
find 路径 [选项] 内容
,选项有-uid
按照用户ID查询-gid
按照用户组ID查询-user
按照用户名查询-group
按照用户组名查询-nouser
查询没有所有者的文件,只有一种情况没有所有者,当文件来自windows
-
按照文件类型搜索
find 路径 -type d/f/l
分别表示目录,普通文件,软链接
-
逻辑运算符
-a
与运算-o
或运算-not
非运算
例如搜索大于1K的文件夹就是
find ./ -size +1k -a -type d
-
-exec {} ;
选项- 将find的结果作为参数执行到吓一个目录
find ... -exec 新命令 {} ;
格式find ./ -size +1k -exec ls -alh {} ;
就是将find查询到的大于1k的结果放在ls的大括号里面执行,相当于ls了所有大于1k的文件,此时第二个目录不能使用别名
-
-ok {} ;
选项- 与-exec相同,但是在每执行一个文件的时候都会询问是否执行
-
-
grep
命令grep [选项] 搜索内容 搜索文件
-i
忽略大小写-n
输出行号-v
反向查找--color=auto
搜索出的关键字用颜色标注
-
find命令是完全匹配,如需模糊匹配需要使用通配符
grub是包含匹配。如果需要模糊匹配需要使用正则表达式
当对文件名使用通配符的时候最好使用双引号包起来
-
通配符表
通配符 | 作用 |
---|---|
? | 匹配任意一个字符 |
* | 匹配任意多个(也可以是0个)字符 |
[] | 匹配[]中的任意一个字符 |
[-] | 匹配[]中的任意一个字符,其中-代表范围,例如[a-z] |
[^] | 表示匹配不是[^]包裹的字符 |
-
正则表达式
正则符 作用 ? 匹配前一个字符0/1次 * 匹配前一个字符0/任意多次 [] 匹配[]中的任意一个字符 [-] 匹配[]中的任意一个字符,其中-代表范围,例如[a-z] [ ^ ] 匹配不是[^]包裹的字符 ^ 匹配行首 $ 匹配行尾 其中
?
不属于标准正则而是扩展正则,需要使用egrep
匹配
管道符
- 格式:
命令1 | 命令2
- 命令1的输出作为命令2的操作对象
别名与快捷命令
别名是就是为命令创建小名方便使用
- 可以使用
alias
查看当前的所有别名 - 使用
alias 别名="原命令"
的方式临时定义别名,但是别名的优先级高于系统指令所以如果别名和原命令同名就会优先执行别名,原命令就无法执行了 - 可以修改环境变量自定义别名,但是别名应该是一个人的习惯而不是所有人的,所以应该设置为某用户的环境变量,修改
~/.bashrc
即可
Bash下的常用快捷键有
快捷键 | 作用 |
---|---|
Tab | 补全命令/文件 |
Ctrl+A | 将光标移动到命令的开头 |
Ctrl+E | 将光标移动到命令的末尾 |
Ctrl+C | 强制结束命令 |
Ctrl+L | 清屏 |
Ctrl+U | 剪切光标之前的命令 |
Ctrl+Y | 粘贴Ctrl+U的命令 |
压缩与解压命令
压缩文件有很多种,不同的压缩方式有不同的命令
zip
格式- 压缩:
zip 目标压缩包.zip 原文件1 [原文件2...]
- 解压:
unzip 压缩包 [解压路径]
不写解压路径默认到当前目录 - 这个格式在linux中不常用,主要是为了兼容windows,是唯一一个可用的windows压缩格式
- 压缩:
gz
格式- 压缩:
gzip 原文件1 [原文件2...]
- 压缩会自动删除原文件,可以使用
-c
选项,他的原意是将压缩得到的二进制结果输出出来(实际上并不压缩),可以结合管道使用gzip -c 原文件 >> 压缩包.gz
-r
压缩目录,注意这个选项的意思,gz是不会将目录压缩成文件,而是将这个文件夹下的所有文件(包括子目录的)全部单个压缩,即gz不会打包,例如执行gzip a b c d
就会得到a.gz,b.gz,c.gz,d.gz,如果不加-r
gzip会直接提示访问到一个目录直接忽略
- 压缩会自动删除原文件,可以使用
- 解压:
gzip -d 压缩文件
或者gunzip 压缩文件
- 压缩:
bz2
格式- 压缩:
bzip2 [选项] 原文件
-k
保留原文件-v
显示详细信息- 压缩命令不能打包,遇到目录直接报错
- 解压:
bzip2 -d 压缩文件
- 压缩:
tar
格式- tar是用于打包的目录,只打包不压缩
- 打包:
tar [选项] [-f 压缩包文件名] 源文件或目录
-c
打包-v
显示打包过程-f
指定压缩包的文件名,用于给管理员识别是给打包文件- 一般习惯写
-cvf
- 解打包:
tar -xvf 打包文件
tar.gz
/tar.bz2
格式- 压缩为
tar.gz
:tar -zcvf 目标文件 原文件
- 解缩
tar.gz
:tar -zxvf 压缩文件 [-C 解压位置] [要单独解压的文件]
- 查看
tar.gz
:tar -ztvf 压缩文件
- 压缩为
tar.bz2
:tar -jcvf 目标文件 原文件
- 解缩
tar.bz2
:tar -jxvf 压缩文件 [-C 解压位置] [要单独解压的文件]
- 查看
tar.bz2
:tar -jtvf 压缩文件
- 压缩为
开关机命令
sync
命令- 用于数据同步,刷新文件系统缓冲区
shutdown
命令- shutdown是最安全的
shutdown 选项 时间
-r
重启-h
关机-c
取消已经执行的shutdown命令- 时间可以选
now
或者7:10
这样的时间
reboot
命令- 重启,也是安全的
halt
与poweroff
- 直接关机,都不安全
init 0
与init 6
- 关机与重启,都不安全
网络命令
-
配置IP地址
-
配置IP地址
setup
目录图形化实现(redhat专有)vim /etc/sysconfig/network-script/ifcfg-网卡名
-
重启网络服务
-
service network restart
-
如果发现某个网卡重启失败大概率是ip冲突
-
如果换了很多ip还是提示失败大概率是因为装系统的时候使用的是克隆的方式,导致UUID冲突,解决方法是删除mac与通过mac计算uuid的规则文件,然后重启,系统就会自动重新计算UUID
[liukairui@10 ~]$ vim /etc/sysconfig/network-scripts/ifcfg-网卡名 # 删除 HWADDR=XX:XX:XX:XX:XX:XX 一行 [liukairui@10 ~]$ rm -rf /etc/udev/rules.d/70-persistent-net.rules # 删除规则文件 [liukairui@10 ~]$ reboot
-
-
-
ifconfig
命令-
最主要的作用就是查IP,直接输入ifconfig即可
[liukairui@10 ~]$ ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:45:12:CA inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 # IP地址 广播地址 子网掩码 inet6 addr: fe80::a00:27ff:fe45:12ca/64 Scope:Link # IPv6地址 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1316 errors:0 dropped:0 overruns:0 frame:0 # 接受数据包的情况 TX packets:766 errors:0 dropped:0 overruns:0 carrier:0 # 发送数据包的情况 collisions:0 txqueuelen:1000 RX bytes:109033 (106.4 KiB) TX bytes:136348 (133.1 KiB)
-
-
ping
命令ping [选项] IP
通过ICMP协议进行网络探测-b 广播地址
对整个网段进行探测-c 次数
指定ping的次数-s 字节数
指定探测包的大小
-
netstat
命令-
网络状态查看命令,可以看到本机的端口,也可以看到连接的客户端,centOS 7.x默认没有安装,需要使用则要安装
net-snmp
与net-tools
-
-tuln
查询本机所有开启的端口[liukairui@10 ~]$ netstat -tuln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:40398 0.0.0.0:* LISTEN 协议 接受发送数据包队列 本机IP与端口号 远程主机与端口号 状态
-
-tulnp
查询所有开启的端口与那个服务开启了这个端口 -
-rn
查询网关
-
-
write
命令-
Linux是多用户的,一个系统可以多账户同时登陆,可以使用write进行用户之间的交流
-
用户登陆的时候有不同的终端,有本地文本终端是从TTY1-6 可以使用Ctrl+Alt+F1-6切换,还有图形界面TTY7,安装图形界面后按Ctrl+Alt+F7三秒切换,远程终端pts/0-255
-
write 用户名 回车之后填写要发送的内容
[root@10 ~]# w # 使用w查看当前的用户 20:39:11 up 23 min, 2 users, load average: 0.00, 0.01, 0.04 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT liukairu pts/0 10.0.2.2 20:19 2:03 0.01s 0.01s -bash root pts/1 10.0.2.2 20:18 0.00s 0.06s 0.00s w [root@10 ~]# write liukairui pts/0 # 写出用户名和登陆的终端 hello
按ctrl+d结束发送
-
-
wall
命令- 想包括自己的所有人发送消息
wall 内容
-
邮件命令
- 发邮件:
mail 收件人
回车输入标题,回车输入内容 - 查邮件:
mail
未读邮件前显示N -s
指定邮件标题
- 发邮件:
系统痕迹命令
系统中有一些日志文件,为了防止用户修改,这些文件都是二进制文件无法使用编辑器打开,只能使用对应命令查询
-
w
命令-
显示系统中目前正在登陆的用户信息,文件位于
/var/run/utmp
[root@10 ~]# w 21:43:18 up 1:27, 2 users, load average: 0.00, 0.01, 0.04 # 系统时间 系统开机时间 当前用户数目 前1min 5min 15min 的平均负载,一般不超过核心数 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT liukairu pts/0 10.0.2.2 20:19 5.00s 0.02s 0.02s -bash root pts/1 10.0.2.2 20:18 0.00s 0.07s 0.00s w 登陆用户 登陆终端 登陆IP 登陆时间 闲置时间 所有进程占CPU时 当前进程占CPU时 用户当前操作
-
-
who
命令- 与
w
效果相同但是内容简单
- 与
-
last
命令-
查看系统所有登陆过的用户信息
[root@10 ~]# last liukairu pts/0 10.0.2.2 Mon Feb 1 20:19 still logged in root pts/1 10.0.2.2 Mon Feb 1 20:18 still logged in root pts/0 10.0.2.2 Mon Feb 1 20:16 - 20:19 (00:02) reboot system boot 2.6.32-642.el6.x Mon Feb 1 20:15 - 21:53 (01:37) root pts/1 10.0.2.2 Mon Feb 1 12:14 - down (00:17) liukairu pts/0 10.0.2.2 Mon Feb 1 10:49 - 12:31 (01:41) liukairu pts/0 10.0.2.2 Mon Feb 1 10:48 - 10:49 (00:00) liukairu pts/0 10.0.2.2 Mon Feb 1 10:08 - 10:48 (00:40) reboot system boot 2.6.32-642.el6.x Mon Feb 1 09:51 - 12:31 (02:39)
-
-
lastlog
命令-
查询所有用户的最后登陆时间
[root@10 ~]# lastlog 用户名 端口 来自 最后登陆时间 root pts/1 10.0.2.2 一 2月 1 20:18:56 +0800 2021 bin **从未登录过** daemon **从未登录过** adm **从未登录过** lp **从未登录过** sync **从未登录过** shutdown **从未登录过** halt **从未登录过** mail **从未登录过** uucp **从未登录过** operator **从未登录过** games **从未登录过** gopher **从未登录过** ftp **从未登录过** nobody **从未登录过** dbus **从未登录过** rpc **从未登录过** vcsa **从未登录过** abrt **从未登录过** rpcuser **从未登录过** nfsnobody **从未登录过** haldaemon **从未登录过** ntp **从未登录过** saslauth **从未登录过** postfix **从未登录过** sshd **从未登录过** tcpdump **从未登录过** oprofile **从未登录过** liukairui pts/0 10.0.2.2 一 2月 1 20:19:20 +0800 2021
注意,这个命令会列出所有的最近登陆记录,可以看到只有第一个和最后一个是实际存在的用户,其余用户是不能登陆的,也不是我们创建的,叫做伪用户,用来启动特殊的服务
-
-
lastb
查看错误的登陆记录[root@10 ~]# lastb liukairu ssh:notty 10.0.2.2 Mon Feb 1 21:58 - 21:58 (00:00) liukairu ssh:notty 10.0.2.2 Mon Feb 1 21:58 - 21:58 (00:00) liukairu ssh:notty 10.0.2.2 Mon Feb 1 21:58 - 21:58 (00:00) btmp begins Mon Feb 1 21:58:12 2021
挂载命令
挂载是将一个存储设备的设备名与已经存在的空目录连起来的过程
-
mount
挂载命令-
mount
直接使用可以查看当前所有挂载的设备-l
显示卷标-t 文件系统
指定文件系统-o
特殊选项,常用的就是remount来修改挂载的权限
-
mount -a
检查自动挂载文件etc/farab
,但是这个功能很弱Linux支持设备自动挂载,但是光驱等设备不建议自动挂载,否则开机找不到光盘就开不了机,配置文件在
/etc/fstab
系统开机就会从这个文件读取 -
挂载一个光盘
-
在CentOS 5.x-光盘是/dev/hdc/
在CentOS 6.x+光盘是/dev/sr0/
无论是什么系统,都有一个/dev/cdrom软链接到实际的光盘设备,例如
[liukairui@10 ~]$ ll /dev/cdrom lrwxrwxrwx. 1 root root 3 2月 1 20:15 /dev/cdrom -> sr0
-
挂载命令
[root@10 liukairui]# mkdir /mnt/cdrom [root@10 liukairui]# mount -t iso9660 /dev/cdrom /mnt/cdrom/
其中
-t iso9660
表示指定挂载文件系统为iso9660背下来即可,可以省略但是可能会提示不识别文件系统或者找不到/dev/sr0这都是因为没放光盘
还可能会报错
mount: block device /dev/sr0 is write-protected, mounting read-only
说系统想挂载光盘为读写但是挂载成了读,因为大部分光盘是只读的,所以这恰好可以认为是光盘正确挂载了 -
卸载命令
[root@10 cdrom]# cd ../ [root@10 mnt]# umount /dev/sr0
-
-
挂载U盘
-
U盘与硬盘在Linux中共享设备名
sdx
所以U盘的设备名是动态的,例如有3个硬盘,那么U盘就是sdd
所以在挂载之前fdisk -l
查看所有的U盘 -
挂载命令
mkdir /mnt/usb mount -t vfat /dev/sdb4 /mnt/usb # U盘是FAT32的写vfat
注意,进入U盘之后ls可能会出现无法现实中文,修改方式是在挂载的时候指定编码
mount -t vfat -o iocharset=utf8 /dev/sdb4 /mnt/usb
前提是Linux安装的时候选择了中文编码,同时tty支持中文
-
卸载命令
umount /dev/sdb4
-
-
-
挂载NTFS分区
windows下大多数使用的是NTFS分区,但是Linux不识别NTFS分区,可以通过修改实现只读
-
Linux的驱动加载顺序是
- 系统加载必备的驱动会直接放在系统的内核中这这部分数量比较少
- 驱动以模块的形式放在硬盘中,存放在
/lib/modules/2.6.32-642.el6.x86_64/kernel/
- 驱动可以被Linux识别,但是Linux认为不常用,默认不加载,如果需要手动安装那么需要重新编译内核,NTFS属于这个范畴
- 部分硬件不被Linux识别,那么需要手动安装驱动,甚至是手写
-
可以使用
ntfs-3G
插件手动安装,然后mount -t ntfs-3g /dev/sdb1 /mnt/win
-
Vim编辑器
基础内容略,见Vim笔记
windows文件中的回车会在linux中显示为^M$
,Linux中的回车会显示成$
可以使用dos2unix
,unix2dos
实现相互转化
软件包安装
软件包的分类
Windows与Linux的软件是不通用的,windows的软件是经过编译的二进制exe/msi文件,Linux中有软件有源码包和二进制包文件
- 如果服务是给大量客户端使用的,建议使用源码包,因为源码包效率高
- 如果是给本机使用的建议使用RPM包
二进制包
二进制包的分类
- DPKG包:由Debian Linux开发的包管理机制,主要用于Debian和Ubuntu
- RPM包:有RedHat开发的包管理系统,主要用于Fedora,CentOS,suSE
RPM包依赖
-
树形依赖:a->b->c
-
环形依赖:a->b->c->a
-
模块依赖(函数库依赖),例如
[root@10 liukairui]# mount /dev/cdrom /mnt/cdrom/ mount: block device /dev/sr0 is write-protected, mounting read-only [root@10 liukairui]# cd /mnt/cdrom/Packages/ [root@10 Packages]# rpm -ivh mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm warning: mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY error: Failed dependencies: # 错误:失败依赖性 libodbcinst.so.2()(64bit) is needed by mysql-connector-odbc-5.1.5r1144-7.el6.x86_64 unixODBC is needed by mysql-connector-odbc-5.1.5r1144-7.el6.x86_64
可以看到,我们安装的是mysql-connector-odbc-5.1.5r1144-7.el6.x86_64.rpm但是报错提示的是这个包依赖于mysql-connector-odbc-5.1.5r1144-7.el6.x86_64这说明我们看反了…依赖的是libodbcinst.so.2()(64bit)可以看到他依赖的是一个.so.数字,是一个函数库,于是
rpm -ivh libodbc<Tab>
于是tab发现并没有补全,这是因为压根就没有这个软件,我们缺少的是函数库,这个函数库只是某个软件包的一个函数库,需要先安装这个软件才能带出这个软件库,但是这个软件的名字我们不知道,可以去http://rpmfind.net/查询,打开链接输入
libodbcinst.so.2
看到第三列是系统名字,找到我们的CentOS(如果发现一个CentOS都没有,可以刷新一下…)对应的一行,右边一列就是那个需要安装的软件包
RedHat也认为依赖难以解决于是在手动安装包的基础上开发了yum安装的方式(注意没有yum包,只有源码包或者rpm包),yum包安装软件的时候会自动链接RedHat的服务器获取依赖信息,下载依赖文件
二进制RPM包命令
RPM包的命名规则
httpd-2.2.15-53.el6.centos.x86_64.rpm
上面是Apache的软件包,有几个部分组成
-
httpd:软件包名,注意这是软件包名/进程名,可以不叫Apach
-
2.2.15:软件版本
-
53:发布次数
-
e16:软件发行商。e16是RedHat发布的适合于RHEL6.x下使用
-
x86_64:适合的硬件平台,RPM包可以在不同硬件平台安装选择适合不同CPU的软件版本所以出现了有
i386
适合386以上平台使用i686
适合奔腾II以上计算机安装x86_64
64位CPU均可安装noarch
没有硬件限制
等文件名
-
rpm:扩展名,用来帮助管理员区分
以上是包全名,还有包名就是第一部分的软件包名,如果是要操作没有安装的软件包就要使用包全名与绝对路径,如果操作已经安装的软件包可以直接使用包名,系统会自动搜索rpm数据库(/var/lib/rpm
)找到路径
RPM包的安装
-
安装命令
rpm -ivh 包全名
-i
安装-v
显示详细信息-h
打印#显示进度--perfix=
指定路径,如果不指定,软件会安装在开发者指定的安装位置,不建议修改路径,否则不易维护与卸载--nodeps
不检测依赖安装(但是如果不检测依赖的软件基本不能用,不建议使用)--replacefiles
如果安装的时候部分文件已存在就会报错,使用这个选项可以强制覆盖--force
强制安装,相当于--replacefiles --nodeps
--test
测试安装,不实际安装,只是检测依赖
-
使用RPM安装Apache
[root@10 Packages]# rpm -ivh httpd- httpd-2.2.15-53.el6.centos.x86_64.rpm httpd-manual-2.2.15-53.el6.centos.noarch.rpm httpd-devel-2.2.15-53.el6.centos.x86_64.rpm httpd-tools-2.2.15-53.el6.centos.x86_64.rpm [root@10 Packages]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm warning: httpd-2.2.15-53.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: apr-util-ldap is needed by httpd-2.2.15-53.el6.centos.x86_64 httpd-tools = 2.2.15-53.el6.centos is needed by httpd-2.2.15-53.el6.centos.x86_64 libapr-1.so.0()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64 libaprutil-1.so.0()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64 [root@10 Packages]# rpm -ivh apr-devel-1.3.9-5.el6_2.x86_64.rpm warning: apr-devel-1.3.9-5.el6_2.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: apr = 1.3.9-5.el6_2 is needed by apr-devel-1.3.9-5.el6_2.x86_64 libapr-1.so.0()(64bit) is needed by apr-devel-1.3.9-5.el6_2.x86_64 [root@10 Packages]# rpm -ivh apr- apr-1.3.9-5.el6_2.x86_64.rpm apr-util-devel-1.3.9-3.el6_0.1.x86_64.rpm apr-devel-1.3.9-5.el6_2.x86_64.rpm apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm apr-util-1.3.9-3.el6_0.1.x86_64.rpm [root@10 Packages]# rpm -ivh apr-1.3.9-5.el6_2.x86_64.rpm warning: apr-1.3.9-5.el6_2.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:apr ########################################### [100%] [root@10 Packages]# rpm -ivh apr-devel-1.3.9-5.el6_2.x86_64.rpm warning: apr-devel-1.3.9-5.el6_2.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:apr-devel ########################################### [100%] [root@10 Packages]# rpm -ivh httpd-tools-2.2.15-53.el6.centos.x86_64.rpm warning: httpd-tools-2.2.15-53.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: libaprutil-1.so.0()(64bit) is needed by httpd-tools-2.2.15-53.el6.centos.x86_64 [root@10 Packages]# rpm -ivh apr-util- apr-util-1.3.9-3.el6_0.1.x86_64.rpm apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm apr-util-devel-1.3.9-3.el6_0.1.x86_64.rpm [root@10 Packages]# rpm -ivh apr-util-1.3.9-3.el6_0.1.x86_64.rpm ]warning: apr-util-1.3.9-3.el6_0.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:apr-util ########################################### [100%] [root@10 Packages]# rpm -ivh httpd-tools-2.2.15-53.el6.centos.x86_64.rpm warning: httpd-tools-2.2.15-53.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:httpd-tools ########################################### [100%] [root@10 Packages]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm warning: httpd-2.2.15-53.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: apr-util-ldap is needed by httpd-2.2.15-53.el6.centos.x86_64 [root@10 Packages]# rpm -ivh apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm warning: apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:apr-util-ldap ########################################### [100%] [root@10 Packages]# rpm -ivh httpd- httpd-2.2.15-53.el6.centos.x86_64.rpm httpd-manual-2.2.15-53.el6.centos.noarch.rpm httpd-devel-2.2.15-53.el6.centos.x86_64.rpm httpd-tools-2.2.15-53.el6.centos.x86_64.rpm [root@10 Packages]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm warning: httpd-2.2.15-53.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:httpd ########################################### [100%] [root@10 Packages]# rpm -ivh httpd-manual-2.2.15-53.el6.centos.noarch.rpm warning: httpd-manual-2.2.15-53.el6.centos.noarch.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:httpd-manual ########################################### [100%]
启动Apache服务
[root@10 Packages]# service httpd restart 停止 httpd: [确定] 正在启动 httpd: [确定]
也可以是
[root@10 Packages]# /etc/rc.d/init.d/httpd restart 停止 httpd: [确定] 正在启动 httpd: [确定]
实际上service就是搜索的
/etc/rc.d/init.d/httpd
netstat -tulnp
看到httpd跑在80上setup
关闭防火墙ifconfig
看ip网页的位置在
/var/www/html
配置文件在
/etc/httpd/conf/httpd.conf
RPM包升级
rpm -Uvh 全名
:升级安装,没装会直接装,装了会升级rpm -Fvh 全名
:升级安装,只升级不安装
RPM包卸载
rpm -e 包名
--nodeps
不检查依赖 ,生产不得使用- 卸载的时候会提示程序有某个依赖还没有卸载,需要卸载依赖才可以卸载他,例如
hpptd->httpd-tools
那么卸载http的时候就会提示还没卸载httpd-tools,比较麻烦,但是不能用yum替代,yum在卸载的时候会自动处理依赖,但是例如有依赖关系systemXXX->httpd->httptool
某个系统工具依赖httpd,当卸载httpd时候yum认为http-tool没有httpd也可以独立存在没有卸载的必要,但是systemXXX依赖于httpd,没了httpd的话systemXXX也没有必要,于是连带卸载了,但是systemXXX很可能是系统软件直接删了管理员又不知道,系统直接崩
RPM包的查询
rpm -q 包名
可以查询某个包是否安装,注意yum的查询与之不同,yum的查询是查询RedHat也没有这个包rpm -qa
可以系统中所有的包rpm -qi 包名
可以查询某个包的详细信息rpm -qip 包全名
可以查询某未安装包的详细信息rpm -ql 包名
可以查询某包的文件安装位置rpm -qlp 包全名
可以查询某未安装包的文件安装位置rpm -qf 某文件名
可以反查这个文件是那个包的文件rpm -qR 包名
查询软件的所有依赖包(注意不管装没装都写)
RPM包验证
rpm -Va
验证本机所有已经安装的软件包rpm -V 包名
验证某个已经安装的软件包rpm -Vf 文件
验证某个软件包的文件
验证的机制是检查文件与初始安装时发生的变化,例如修改httpd的conf文件
[root@10 liukairui]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
系统会现实那个包发生了变化,变化的信息卸载前面,分别是
S
文件大小发生变化M
文件权限变化5
文件MD5发生变化D
设备主从代码发生改变L
文件路径变化U
文件所有者变化G
文件所属组变化T
文件的修改时间变化c
这个文件是这个软件的配置文件d
这个文件是这个软件的普通文件g
这个文件是这个软件的鬼文件(不是RPM包的文件)l
这个文件是这个软件的授权文件r
这个文件是这个软件的描述文件
这个RPM校验是与RPM记录的原始值进行对比,为了保证原始值有个数字证书的概念
数字证书
数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 RPM 包做了修改,此包携带的数字证书也会改变,将无法与系统成功匹配,软件无法安装。
可以将数字证书想象成自己的签名,是不能被模仿的(厂商的数字证书是唯一的),只有我认可的文件才会签名(只要是厂商发布的软件,都符合数字证书验证);如果我的文件被人修改了,那么我的签名就会变得不同(如果软件改变,数字证书就会改变,从而通不过验证。当然,现实中人的手工签名不会直接改变,所以数字证书比手工签名还要可靠)。
数字证书是为了保证RPM校验文件没有问题,具有如下特点
- 必须找到原厂的公钥才可以安装
- 再安装PRM包的时候会提取RPM的证书与本机原厂证书对比验证
- 验证通过安装,不通过就报错
数字证书的位置/mnt/cdrom/RPM-GPG-KEY-CentOS-6
与/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
-
安装数字证书
[root@localhost ~]# rpm --import /efc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
-
验证数字证书
[root@localhost ~]# rpm -qa | grep gpg-pubkey
RPM包的文件提取命令
在修改软件配置文件但是想恢复的时候会发现覆盖安装只会安装被删除的文件,但是不覆盖存在的文件,所以需要从rpm包中提取文件
-
cpio命令
这个命令本身是用来做复制备份还原的,但是用它备份还原极其不方便,不推荐进行备份还原
备份
cpio -o[vcB] > [文件|设备]
-o
备份模式-v
显示备份过程-c
使用portable formate存储方式-B
设定输入输出块为5120Bytes而不是5120butes
还原
cpio -i[vcdu] < [文件|设备]
-i
还原模式-v
显示还原过程-c
使用portable formate存储方式-d
还原时自动新建目录-u
使用较新的文件覆盖旧文件
备份
cpio -o[vcB] > [文件|设备]
-o
备份模式-v
现实备份过程-c
使用portable formate存储方式-B
设定输入输出块为5120Bytes而不是5120butes
举例备份还原
/etc
find /etc -print | cpio -ocvB > /root/etc.cpio # 必须用find与管道找源文件用>方式写入 cpio -idvcu < /root/etc.cpio # 必须这么恢复
提取RMP中文件
rpm2cpio 包全名 | cpio -idv ./文件的绝对路径
注意,一定要写那个./文件的绝对路径,否则自动覆盖文件,写上之后会拷贝到当前目录,至于那个文件绝对路径只需要写成实际目录地址,例如提取Apach
[root@10 liukairui]# rpm2cpio /mnt/cdrom/Packages/httpd-2.2.15-53.el6.centos.x86_64.rpm | cpio -idv ./etc/httpd/conf/httpd.conf ./etc/httpd/conf/httpd.conf 6222 块 [root@10 liukairui]# ll ./etc/httpd/conf/httpd.conf -rw-r--r--. 1 root root 34419 2月 2 23:43 ./etc/httpd/conf/httpd.conf
RPM包在线安装命令yum
-
yum源的文件解析
yum源配置文件在
/etc/yum.repos.d
目录,扩展名是.repo,也就是说 yum源配置文件只要是.repo就会生效[root@10 liukairui]# ls /etc/yum.repos.d/ CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo
默认有5个源,以此是是默认的基础的网络yum,调试的,快速的,光盘的,虚拟的,可以尝试打开base文件
[base] # 容器名 name=CentOS-$releasever - Base # 容器描述 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ # 镜像地址与原网址,只保留一个生效 gpgcheck=1 # 验证证书 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 # 证书位置 enabled=0 # 是否启用 ...
网络源在国外很慢可以配置光盘源,方式是将其他的源修改为
.repo.bak
,将光盘源enable,修改地址到光盘挂载地址然后注释后面两个不用的地址 -
yum命令
注意在yum中不区分包名和包全名,全部使用包名即可
- 查询
- 查询源中的所有包
yum list
- 查询源中的某个包
yum list 包名
- 模糊查询包
yum search 关键字
- 查询源中的所有包
- 安装
yum -y install 包名
其中-y
是自动回答yes
- 升级
yum -y update 包名
其中-y
是自动回答yesyum -y update
升级所有软件包括内核
- 卸载
yum remove 包名
注意依赖关系,不建议使用
- 查询
-
yum组管理
就像在安装的时候选择BasicSever一样可以安装一系列软件
- 列出所有组:
rpm grouplist
- 查询一个组包括的软件包
yum groupinfo 组
- 安装一个组
yum groupinstall 组
- 卸载一个组
yum grouremove 组
- 列出所有组:
源码包的安装
-
源码包必须指定安装位置,否则会到处乱装,还不知道去哪里卸载
-
尝试安装apache-2.2.7
版本比较老,但是高版本CentOS6跑不起来,可以在此处下载http://archive.apache.org/dist/httpd/然后搜索即可,注意从https://github.com/apache/httpd/releases/tag/2.2.9 下载的缺少文件不要使用,然后使用SCP传输到虚拟机(如果使用的是VirtualBox虚拟机可以使用
scp -P 9000 -r ./download/httpd-2.2.9.tar.bz2 liukairui@127.0.0.1:/home/liukairui
其中-P后面是我们之前配置的转发端口,没有-P则会自动连接22口会显示无法连接)-
解压
[root@10 liukairui]# tar -jxvf httpd-2.2.9.tar.bz2 [root@10 liukairui]# cd httpd-2.2.9
-
./configure
configure
的作用是- 检查系统条件是否符合要求
- 自定义需要安装的功能,可以查询
./configure --help
查看 - 将系统环境检测好写入makefile
[root@10 httpd-2.2.9]# ./configure --prefix=/usr/local/apache2
-
安装
gcc
-
make
以上两条命令只是进行编译而没有安装,不会安装到
/usr/local/http2
所以如果报错只需要make clean
清空文件即可,不需要删除usr/local/http2
make install
如果install报错需要
make clean
删除/usr/local/http2
- 验证安装成功
ps aux | grep httpd
如果是使用VirtualBox可以将网络设置为桥接网卡,其他默认,开机后
ifconfig
看到ip地址,之后ssh就可以不加-P端口了,同时在外面浏览器直接看ip可以看到网页正常工作 -
-
打补丁
生成一个测试补丁
[root@localhost ~]# mkdir ./test # 创建一个测试目录 [root@localhost ~]# cd test/ # 进入目录 [root@localhost test]# echo AAA >> old # 创建老文件 [root@localhost test]# echo ABA >> new # 创建新文件 [root@localhost test]# diff -Naur /root/test/old /root/test/new > txt.patch # 生成补丁必须绝对路径
看补丁
[root@localhost test]# cat txt.patch --- /root/test/old 2021-02-03 23:08:08.635990638 +0800 +++ /root/test/new 2021-02-03 23:08:18.253998956 +0800 @@ -1 +1 @@ -AAA +ABA
可以看到,这个补丁文件详细的记录了文件的绝对路径和修改信息
打补丁
[root@localhost test]# patch -p3 < txt.patch patching file old
-p3
的意思就是将当前pwd的位置退出几层,因为补丁中已经有了路径,如果不写patch会认为是`/root/test/root/test/所以我们要往出退2层写p3,p1是当前目录,p2是退一层,p3是退两层
脚本包安装
可能某个包需要大量的rpm和源码包,十分复杂,可以把安装目录写入shell脚本,以后只需要一条目录回车就可以
-
使用脚本包安装Webmin
Webmin是一个基于Web的Linux系统管理界面
- 解压
./install.sh
用户管理
用户相关文件
-
/tec/passwd
用户信息文件打开以后看到很多行,一行是一个用户,但是都不是自己添加的,是系统为了启动服务添加的,不能动,一行都是如下形式,分别是
root:x:0:0:root:/root:/bin/bash
- 用户名
- 密码位,x代表有密码,具体的密码在
/etc/shadow
,只有有x标记系统才会去shadow里面找密码 - 用户ID
- 0:超级用户UID,只要一个用户UID是0,就是超级用户,所以实际上是可以将一个普通用户升级成超级用户,但是不建议,如果这样的话,用提升后的用户执行
whoami
得到的是root,因为UID一样 - 1-499:系统用户(伪用户)
- 500-60000:普通用户
- 0:超级用户UID,只要一个用户UID是0,就是超级用户,所以实际上是可以将一个普通用户升级成超级用户,但是不建议,如果这样的话,用提升后的用户执行
- 用户的初始组ID,其中组ID与组名的对应关系在
/etc/group
- 简单解释用户是做什么的(可空)
- 用户的家目录
- 登陆之后执行的shell
-
/etc/shadow
影子文件一共9列,分别是
root:$6$lDwFrlZqSZ/jd7Yu$MSOi/4Tka85amFZyV4mWO0swbLe0zUnuU28bo/v/p2uOs/sCyGFXMAiyJJBen5hxUZ9kn2yA.k6hcZmFJVR650:18655:0:99999:7:::
- 用户名
- 加密后的密码(SHA512),
*
或者!!
代表他们是没有密码的,如果我想让一个用户临时无法登陆,约定俗成的是在加密串前面加!
- 上一次设置密码的时间戳
- 最小的修改密码间隔时间(天)
- 密码有效期(天)
- 密码到期前的警告时间
- 密码到期后的款先天数(默认是-1,表示永久有效)
- 密码的失效时间
- 保留列,目前没有意义
-
/etc/group
组信息文件只有四列
mail:x:12:mail,postfix
- 组名
- 组密码位(在
/etc/gshadow
)可以给组设置密码,但是不建议,组密码是用来做组管理员的,在默认情况下只有root可以修改用户组,现在可以让root设置组密码,之后普通用户使用组密码对一个组进行修改用户,但是不常用,不建议 - 组ID
- 组的附加用户
初始组和附加组
- 初始组:每个用户只能有一个,一般就是与用户名同名的组
- 附加组:用户可以有多个附加组,将用户加入组就是加入附加组
-
/home/[username]/
用户家目录 -
/var/spool/mail/[username]/
是用户邮箱文件 -
/etc/skel
用户目录模板,当新建一个用户的时候用户文件夹下会自动创建的文件就是拷贝至此
用户管理命令
-
useradd
命令-
-u XXX
指定用户UID为XXX -
-g
指定初始组 -
-G
指定附加组 -
-c
添加说明 -
-d
指定目录 -
以上选项基本不用,不建议使用,最常用的还是
useradd [username]
,默认选项的控制文件在/etc/default/useradd
和/etc/login.defs
-
/etc/default/useradd
# useradd defaults file GROUP=100 # 添加用户的默认组id(但是目前不采用) HOME=/home # 默认家位置 INACTIVE=-1 # 密码过期的宽限天数(-1代表用不过期) EXPIRE= # 密码的失效时间 SHELL=/bin/bash # shell目录 SKEL=/etc/skel # 模板目录 CREATE_MAIL_SPOOL=yes # 默认创建邮箱
-
/etc/login.defs
MAIL_DIR /var/spool/mail # 邮箱地址 PASS_MAX_DAYS 99999 # 密码有效期 PASS_MIN_DAYS 0 # 改密码最小间隔 PASS_MIN_LEN 5 # 密码最小长度(目前已经无效) PASS_WARN_AGE 7 # 到期警告天数 UID_MIN 500 # UID 范围 UID_MAX 60000 GID_MIN 500 # GID 范围 GID_MAX 60000 CREATE_HOME yes # 自动建立家目录 UMASK 077 # 家目录权限 USERGROUPS_ENAB yes # 使用userdel删除用户的时候是否删除家目录 ENCRYPT_METHOD SHA512 # 密码存储加密方式
-
-
passwd
命令-
普通用户修改自己密码直接
passwd
且必须符合密码原则,root使用passwd [username]
修改别人密码 -
passwd -l [username]
可以将用户锁起来,原理就是在shadow里面用户密码前面加!!
-
passwd -u [username]
可以将用户解锁,原理就是在shadow里面用户密码前面去掉!!
-
passwd --stdin
用于管道设置密码,例如echo "123" | passwd --stdin [username]
这样就不会说什么重复输入密码 -
chage -d 0 [username]
将用户上次修改日期时间戳设为0(shadow的第三列),这样系统认为是时间戳异常,在用户登陆后会要求修改密码
-
-
usermod
命令-c
修改用户帐号的备注文字。
--d
修改用户登入时的目录。
--e
修改帐号的有效期限。
--f
修改在密码过期后多少天即关闭该帐号。
--g
修改用户所属的群组。
--G
修改用户所属的附加群组。
--l
修改用户帐号名称。
--L
锁定用户密码,使密码无效。
--s
修改用户登入后所使用的shell。
--u
修改用户ID。
--U
解除密码锁定。
- 实际上最常用的就是-G
- 不建议修改用户名,否则只修改用户名,初始组…都不变
-
userdel
命令userdel 用户名
可以删除用户-r
同时删除家目录
-
su
命令su [username]
可以切换到其他用户- 存在的小问题是
su [username]
之后home不会切换,方式是加上-
选项 -c
仅执行一次,不切换用户
组管理命令
groupadd
命令- 用于添加组
-g
指定组的GID
groupdel
命令- 删除组
gpasswd
命令- 将用户加入/删除附加组,与
usermod
一样,但是建议用这个 gpasswd -a [username] [groupname]
添加组gpasswd -d [username] [groupname]
移出组
- 将用户加入/删除附加组,与
newgrp
命令- 用于修改有效组(当用户新建文件后文件的所属组是有效组,默认是初始组,可以切换到附加组)
- 在用户登陆后
newgrp 附加组
权限管理
Linux中权限一共有6种,有wrx,umask两种常见的,还有四种
ACL权限
用于解决用户对文件身份不足的问题,例如一个文件夹,所有者A,所属组B,均有7权限,其他人为0权限,现在要有用户C对文件夹有5权限,那么传统的rwx是无法实现的。在windows中我们可以忽略所属组所有者的概念,直接对用户指定权限,ACL与之类似
- 确定开启ACL:
dumpe2fs -h /dev/sad1
,ACL权限是和分区绑定的,使用分区查看工具查看分区是否有ACL,看到Default mount options
有ACL即可。如果没有挂载可以手动重新挂载mount -o remount,acl /
,或者修改fstab setfacl
命令-m
设置ACLsetfacl -m u:用户名:权限 文件名
setfacl -m g:组名:权限 文件名
setfacl -m X:XXX:XXX -R 文件名
对已经存在的子文件递归生效setfacl -m d:X:XXX:XXX -R 文件名
对已经存在和以后创建的子文件递归生效- 设置之后尝试ls文件就会发现文件权限变成了
-rw-rwxr--+
加号表示有ACL权限
-b
删除ACL-x 用户
删除单个用户ACL
getfacl 文件名
查看ACL
ACL权限最大的问题是权限溢出,一旦使用了递归赋予ACL,对目录一定要给x权限,那么目录里面的子文件也拥有了x权限,这个是十分危险的,所以还需要手动将子文件的x删除,可以写shell解决,所以能用rwx就用rwx,遇到文件身份不足的时候再用ACL
sudo 授权
sudo可以给普通用户赋予部分管理员的权限,权限划分需要配置文件,执行visudo
唯一没有注释的一行,意思分别是
root ALL=(ALL) ALL
- 用户名
- 机器所在的ip,例如,可以写123.123.123.123,111.111.111.111表示只有被控制的机器在这两个ip下这行sudo才有效,但是这个限制方式不是很常用了
- 可以临时执行的用户,不写就是root
- 用户可以使用sudo执行哪些命令,必须是命令的绝对路径
例如
liukairui 192.168.1.3,192.168.1.2=(ALL) /sbin/shutdown
指的是liukairui可以临时执行/sbin/shutdown命令,只有当被控制机器的ip在192.168.1.3,192.168.1.2刚刚这句话才有效
这里的命令必须是绝对路径,用户在执行的时候也必须是绝对路径,如果想写多个命令可以在一个命令后加上,
注意,必须是逗号和空格,如果不习惯可以写多行,互不冲突,例如
liukairui 192.168.1.3,192.168.1.2=(ALL) /sbin/shutdown
liukairui 192.168.1.3,192.168.1.2=(ALL) /sbin/reboot
但是一般在分配权限的时候还应该细致考虑,例如我只想让liukairui立刻重启服务器,不想让他关机或者延时重启,应该写
liukairui ALL=(ALL) /sbin/shutdown -r now
命令越细致越安全,也要注意几个例子
-
让用户可以修改某个文件
liukairui ALL=(ALL) /usr/bin/vim /path/to/file
而不能只写
liukairui ALL=(ALL) /usr/bin/vim
否则liukairui可以使用vim做所有的事情,这样完全可以修改任意重要的系统文件例如sudoer,相当于给了他服务器所有的控制权
-
让用户为其他用户修改密码
liukairui ALL=(ALL) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
这里使用正则与!限制用户不会修改了root密码
特殊文件权限
特殊文件权限有SetUID,SetGID,StickyBIT,这三个都是Linux为了应对特殊情况设计的,极其危险,极其不推荐自行设置
在普通用户尝试设置密码的时候,密码会存储到/etc/shadow
中,但是shadow文件是----------.
明显是无法写入的,但是改密码成功了,原因是passwd命令是特殊的,可以查看
[liukairui@10 ~]$ ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
passwd的权限是-rwsr-xr-x
,rwd
变成了rws
此时passwd命令具有SetUID,可以修改shadow,所属组是rws
表示文件具有SetGID权限,如果其他人权限是rwt
表示其他人具有StickyBIT权限
-
SetUID
- 只有二进制文件才可以设置SUID
- 命令执行者必须具有执行权限(否则权限会显示
rwS
,S代表报错) - 命令的执行者在执行命令文件的时候会临时变为文件的所有者例如passwd会变成root
-
SetGID
- 既可以针对执行文件也可以针对目录
- 对于文件,与SUID类似,只不过是执行的时候所属组身份会变化,代表指令有locate
- 对于目录,普通用户必须具有7权限才生效,之后用户进入后有效组会变为所属组,例如user进入了某个
drwxrwsrwx root:root
的文件夹,touch一个文件,文件的所属组会变成root而不是user
-
StickyBIT
- 称为粘着位
- 只对目录有效
- 普通用户必须拥有wx权限
- 当设置了粘着位权限后普通用户只能删除这个文件夹里面自己创建的文件,即使有w也不能删除其他人创建的文件,但是root可以无视
-
设置方法
chmod u+s 文件
设置SUIDchmod g+s 文件
设置SGIDchmod o+t 文件
设置SBITchmod XYYY 文件
,其中YYY是原来是三位数字,例如755,X表示特殊权限- 4是SUID
- 2是SGID
- 1是SBIT
chattr权限
这个权限没有危险性,还可以假性的限制root
chattr
命令- 设置chattr权限
- 只有root可以运行
- 使用
+-
增减权限 i
权限,文件不可以删除,重命名,修改内容的所有操作a
权限,文件只能用echo >>
追加内容,对于文件夹就是只能新建和修改?内部的文件
lsattr
命令- ls不嫩查看chattr权限,只有lsattr可以查看chattr权限
-d
查询目录的权限
- 注意:有的时候我们无法删除文件,但是lsattr却没有特殊权限,考虑是文件夹设置了chattr权限
SELinux权限
以后再说
文件系统管理
硬盘结构与接口
略
文件系统
文件系统组成
- super block (超级块) 记录了整个分区的block与inode总量,已经使用与没有使用的block与inode,文件系统的挂载时间与最近校验时间,可以使用
dumpe2fs -h /dev/sdax
检查 - data block (数据块) 用于保存数据的块
- inode 用来记录文件的权限,所属组,文件大小…
- 分区的模型
- 最开始是一个超级块
- 其余空间由于数量过大,直接做一个inode区不好查,系统还会将剩下的空间分成很多块组(大致200M,使用dumpe2fs /dev/sda1)
- 一个块组中包含了
- inode块
- 数据块
常见的文件系统
ext->ext2->ext3->ext4->xfs
常用的是ext4,文件大小几乎没有限制
从RedHat4(CentOS7)开始就使用了xfs,采用日志形的,丢数据概率低
常用硬盘管理命令
-
df
命令- 显示硬盘占用率
-h
人性化显示-a
显示特殊系统文件,例如内存-T
显示文件系统类型
-
du
命令- ls显示文件夹大小的时候只会显示文件夹文件的大小,也就是文件夹记录的文件名-inode表的大小,想要获取实际的大小
du 文件夹
查看 不加选项
显示每个子文件的大小,最后显示文件夹大小-h
人性化显示-s
只显示总占用-a
显示每个子文件夹的大小
- ls显示文件夹大小的时候只会显示文件夹文件的大小,也就是文件夹记录的文件名-inode表的大小,想要获取实际的大小
df是统计空间大小的,包括的临时文件,没有释放的文件,du是只统计文件大小,两者可能不同,重启即可
-
fsck
命令- 用于修复文件系统
fsck -y /dev/sda1
- 这个命令在意外重启开机后会自动执行,所以如果能修复,开机就修复了,修复不了,手动执行也没有用
-
dumpe2fs
命令-
直接执行
[root@10 liukairui]# dumpe2fs /dev/sda5 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> # 卷标 Last mounted on: /home # 挂载点 Filesystem UUID: 9de2adcf-e7ad-4d49-b032-aadca5924b64 # UUID唯一识别符 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl # 挂载参数 Filesystem state: clean # 文件系统状态,正常 Errors behavior: Continue Filesystem OS type: Linux Inode count: 131072 # inode总数 Block count: 524288 # 块总数 Reserved block count: 26214 Free blocks: 386665 Free inodes: 66943 First block: 0 Block size: 4096 # 块大小 Fragment size: 4096 Reserved GDT blocks: 127 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512 Flex block group size: 16 Filesystem created: Thu Jan 28 23:28:02 2021 Last mount time: Wed Feb 17 19:39:33 2021 Last write time: Wed Feb 17 19:39:33 2021 Mount count: 25 Maximum mount count: -1 Last checked: Thu Jan 28 23:28:02 2021 Check interval: 0 (<none>) Lifetime writes: 962 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256 # inode大小 Required extra isize: 28 Desired extra isize: 28 Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: f23ce554-4779-4435-93e1-6048b842d72b Journal backup: inode blocks Journal features: journal_incompat_revoke 日志大小: 64M Journal length: 16384 Journal sequence: 0x000000f9 Journal start: 1 Group 0: (Blocks 0-32767) [ITABLE_ZEROED] 校验和 0x2b5a,0个未使用的inode 主 superblock at 0, Group descriptors at 1-1 保留的GDT块位于 2-128 Block bitmap at 129 (+129), Inode bitmap at 145 (+145) Inode表位于 161-672 (+161) 22319 free blocks, 1 free inodes, 289 directories 可用块数: 10449-32767 可用inode数: 18 ...块信息...
-
-h
查看超级块信息(没有后面的Group 0)
-
-
stat
命令-
查看文件的详细信息
[root@10 liukairui]# stat webmin-1.970 File: "webmin-1.970" Size: 12288 Blocks: 24 IO Block: 4096 目录 # 文件大小 占用块 分区大小 Device: 805h/2053d Inode: 3621 Links: 132 # 设备inode inode 硬链接数 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 1/ bin) # 权限 所有者 所属组 Access: 2021-02-16 22:44:31.673999983 +0800 # 访问时间 Modify: 2021-01-06 07:42:06.000000000 +0800 # 修改时间 Change: 2021-02-03 23:41:33.988999887 +0800 # 状态修改时间
-
-
type
命令-
判断命令的类型
[root@10 liukairui]# type cd cd is a shell builtin # 内建命令 [root@10 liukairui]# type mkdir mkdir is hashed (/bin/mkdir) [root@10 liukairui]# type /bin/mkdir /bin/mkdir is /bin/mkdir # 是个命令 [root@10 liukairui]# type ls ls is aliased to `ls --color=auto' # 是个别名
-
-
file
命令-
用于判断文件类型
[root@10 liukairui]# file httpd-2.2.9.tar.bz2 httpd-2.2.9.tar.bz2: bzip2 compressed data, block size = 900k [root@10 liukairui]# file demo demo: ASCII text [root@10 liukairui]# file /sbin/shutdown /sbin/shutdown: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
-
手工分区的方法
-
fdisk -l
查询分区状态 -
fdisk /dev/sdb
对sdb进行交互式分区-
m
获取帮助 -
n
新建 -
d
删除 -
p
打印分区 -
l
列数可识别分区 -
t
改变系统id -
q
不保存退出 -
w
保存退出 -
新建一个分区
Command (m for help): n Command action e extended p primary partition (1-4) p # 询问新建一个什么分区,第一个分区当然是主分区 Partition number (1-4): 1 # 主分区号,按顺序写,否则以前的难以利用 First cylinder (1-2610, default 1): # 起始柱面,直接回车默认 Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +2G # 终止柱面,因为难以计算,可以直接写大小,fdisk自己计算,注意的是因为最小单位是柱面,所以如果容量不能正好分完一个柱面则会选择一个就近的值,所以结果会比指定的大一点或者小一点
-
新建一个逻辑分区
Command (m for help): n Command action e extended p primary partition (1-4) e # 新建一个扩展分区 Partition number (1-4): 2 # 选择编号2 First cylinder (263-2610, default 263): # 将逻辑分区占满空闲区域 Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-2610, default 2610): Using default value 2610 Command (m for help): n # 新建逻辑分区 Command action l logical (5 or over) # 会自动换成逻辑,同时编号自动变成5+ p primary partition (1-4) l First cylinder (263-2610, default 263): # 起始扇区默认 Using default value 263 Last cylinder, +cylinders or +size{K,M,G} (263-2610, default 2610): +2G # 给2G
-
w推出后可能会报硬盘忙error16,需要重启才可以格式化
-
-
mkfs -t ext4 /dev/sdb1
对分区格式化如果想要设置高级的格式化参数可以使用
mke2fs
,但是强烈不推荐 -
mount
挂载 -
设置自动挂载
编辑/etc/fstab
UUID=7413895f-b2f5-4d15-80eb-422af604c847 / ext4 defaults 1 1 UUID=95fb2e8e-3bac-4270-83ff-938368cbfa34 /boot ext4 defaults 1 2 UUID=9de2adcf-e7ad-4d49-b032-aadca5924b64 /home ext4 defaults 1 2 UUID=86b5cdd1-de85-431c-a144-2d0eea95ebb6 swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
-
第一列分区的UUID,这里建议写UUID而不是/dev/sdb1的原因是方式更换硬盘后系统将新盘的第一个分区误认为是sdb1,可以这样查看UUID
[root@10 liukairui]# ll /dev/disk/by-uuid/ 总用量 0 lrwxrwxrwx. 1 root root 10 2月 17 23:07 1c974240-05fc-45da-a574-34d62ada86b2 -> ../../sdb5 lrwxrwxrwx. 1 root root 10 2月 17 23:07 45e3bdda-5297-44bd-950f-c7da1eefaec2 -> ../../sdb1 lrwxrwxrwx. 1 root root 10 2月 17 22:09 7413895f-b2f5-4d15-80eb-422af604c847 -> ../../sda2 lrwxrwxrwx. 1 root root 10 2月 17 22:09 86b5cdd1-de85-431c-a144-2d0eea95ebb6 -> ../../sda3 lrwxrwxrwx. 1 root root 10 2月 17 22:09 95fb2e8e-3bac-4270-83ff-938368cbfa34 -> ../../sda1 lrwxrwxrwx. 1 root root 10 2月 17 22:09 9de2adcf-e7ad-4d49-b032-aadca5924b64 -> ../../sda5
-
第二列是挂载点
-
第三列是文件系统
-
第四列是挂载选项
-
第五列是文件是否可以被备份
- 0 不备份
- 1 每天备份(推荐选择)
- 2 不定期备份
-
第六列是是否自动使用fsck自动检测
- 0 不检测
- 1 启动时检测(/需要)
- 2 启动后检测(除了/之外的选择这个)
-
-
/etc/fstab
文件修复- 一切修复的前提是拿到本机…
- 按提示登录
- 重新挂载根分区
mount -o remount,wr /
来修改文件
-
parted
命令目前有GPT和MBR,其中fdisk只能做MBR分区,可以使用parted进行GPT分区
-
print
打印分区,Partition Table: msdos
说明是MBR -
mklabel gpt
修改分区表 -
建立新分区
(parted) mkpart 分区名称? []? disk1 # 设置一个免得后面麻烦 文件系统类型? [ext2]? # 回车 起始点? 1M # 不能回车,直接写1M 结束点? 2G # 写大小 (parted) mkfs # 分区 分区编号? 1 文件系统类型? [ext2]? # 回车 (parted) q 信息: You may need to update /etc/fstab. [root@10 liukairui]# mkfs -t ext4 /dev/sdb1 # 格式化为ext4
-
改分区大小
有很大风险,不建议
[root@10 liukairui]# parted /dev/sdb (parted) resize 分区编号? 1 起始点? [1049kB]? 结束点? [2000MB]? 3G
-
-
建立/增加swap分区
[root@10 ~]# fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +8G Command (m for help): t Selected partition 1 Hex code (type L to list codes): 82 # 修改文件类型,这个可以在l查到 Changed system type of partition 1 to 82 (Linux swap / Solaris) Command (m for help): w The partition table has been altered! [root@10 ~]# mkswap /dev/sdb1 # 格式化 Setting up swapspace version 1, size = 8393924 KiB no label, UUID=a5b2a742-ee50-42f3-aaff-9e4258df52c5 [root@10 ~]# swapon /dev/sdb1 # 挂载 [root@10 ~]# free -h total used free shared buffers cached Mem: 996M 279M 717M 184K 24M 112M -/+ buffers/cache: 142M 853M Swap: 10G 0B 10G # 已经多了8G
永久挂载只需要修改
/etc/fstab
UUID=86b5cdd1-de85-431c-a144-2d0eea95ebb6 swap swap defaults 0 0
高级文件系统管理
磁盘配额
限制用户存储文件的数目与大小
-
磁盘配额的条件
-
内核支持磁盘配额
[root@10 ~]# grep CONFIG_QUOTA /boot/config-2.6.32-642.el6.x86_64 CONFIG_QUOTA=y # 找到了这些项就正常 CONFIG_QUOTA_NETLINK_INTERFACE=y # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREE=y CONFIG_QUOTACTL=y
-
检查系统中安装了quota工具
[root@10 ~]# rpm -qa | grep quota quota-3.17-23.el6.x86_64
-
-
概念
-
用户配额和组配额
组配额用的少,因为组内的配额不是平均分配的,可能一个用户直接写满了配额其他人不能写了
-
磁盘容量与文件个数限制
限制文件个数主要是为了防止inode写满
-
软限制和硬限制
用户在写入超过软限制后还可以继续写入,但是会被警告,超过硬限制则无法写入
-
宽限时间
如果用户处于软硬限制之间,系统会警告用户,如果超过宽限时间用户还是在超过软限制,软限制会升级为硬限制
-
-
磁盘配额是普通用户在使用分区的限制,超级用户可以无视
-
在分区中开启配额功能
临时开启
[root@10 ~]# mount -o remount,usrquota,grpquota /disk
永久开启
UUID=93aa9645-bdde-4a95-b9cb-29e536711869 /disk ext4 defaults,usrquota,grpquota 1 2
-
在分区中建立磁盘配额文件
-
使用
quotacheck
命令-a
扫描所有开启磁盘配额的分区-c
不管是否有配置文件,出现扫描并建立新配置文件-u
建立用户配额文件-g
建立组配额文件-v
显示扫描过程-m
强制读写方式扫描-f
强制扫描文件系统- 常用命令
quotacheck -avug
- 特别的,如果要给
/
开启配额,需要写quotacheck -avugm
使用这个命令必须关闭SELinux
-
关闭SELinux
[root@10 ~]# getenforce # 查看当前状态 Enforcing [root@10 ~]# setenforce 0 # 临时关闭 [root@10 ~]# getenforce # 查看状态 Permissive [root@10 ~]# vim /etc/selinux/config # 永久修改(要重启) SELINUX=enforcing -> disabled
-
检查开启了磁盘配额
[root@10 ~]# ll /disk/ 总用量 32 -rw-------. 1 root root 6144 2月 18 11:17 aquota.group -rw-------. 1 root root 6144 2月 18 11:17 aquota.user drwx------. 2 root root 16384 2月 18 10:25 lost+found
看到了aquota.user/group
-
-
设置用户和组的配额
edquota
命令-u
设置用户配额-g
设置组配额-t
设置宽限时间-p
复制配额方案
例如
[root@10 ~]# edquota -u user1 Disk quotas for user user1 (uid 501): # 为user1 UID=501 配置 Filesystem blocks soft hard inodes soft hard /dev/sdb1 0 0 0 0 0 0 # 分区 用户已经占用block(KB) block软限制 硬限制 已用inode 软限制 硬限制 [root@10 disk]# edquota -p user1 -u user2 # 复制配额 [root@10 disk]# quota -uvs user2 Disk quotas for user user2 (uid 502): Filesystem blocks quota limit grace files quota limit grace /dev/sdb1 0 40000 50000 0 8 11 [root@10 disk]# edquota -t # 修改宽限时间 Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sdb1 8days 7days
-
启动和关闭配额
quotaon
启动配额-a
启动所有配额分区-u
启动用户配额-g
启动组配额-v
显示过程
quotaoff
关闭配额-a
启动所有配额分区-u
启动用户配额-g
启动组配额
-
查询磁盘配额
quota -uvs 用户名
查询用户配额(-v
:详细信息,-s
:人性化显示)quota -gvs 组名
查询组配额repquota -avus
查询分区配额
-
测试配额
[user1@10 disk]$ dd if=/dev/zero of=test bs=1M count=60 sdb1: warning, user block quota exceeded. sdb1: write failed, user block limit reached. dd: 正在写入"test": 超出磁盘限额 记录了49+0 的读入 记录了48+0 的写出 51195904字节(51 MB)已复制,0.0318794 秒,1.6 GB/秒 [user1@10 disk]$ touch 1 [user1@10 disk]$ touch 2 [user1@10 disk]$ touch 3 [user1@10 disk]$ touch 4 [user1@10 disk]$ touch 5 [user1@10 disk]$ touch 6 [user1@10 disk]$ touch 7 [user1@10 disk]$ touch 8 [user1@10 disk]$ touch 9 sdb1: write failed, user file limit reached. touch: 无法创建"9": 超出磁盘限额
dd解释:拷贝文件,来自
/dev/zero
到test,拷贝大小1M,拷贝60次 -
setqupta
命令可以以非交互的形式配置配额
LVM逻辑卷管理
基本原理
LVM是Logical Volume Manager的简称,就是逻辑卷管理,最大的特征是可以动态调整分区大小
LVM的概念
- 物理卷PV:真正的无力硬盘或者分区
- 卷组VG:由多个PV合成的一个逻辑上的硬盘
- 逻辑卷LV:是将VG分区得到的,可以想象成将这个逻辑上的硬盘进行了分区
- 物理扩展PE:保存数据的最小单元,默认4M
LVM原理
- 将普通的分区变成PV
- 一个或者多个PV组成一个VG,相当于重组了一个新硬盘,VG可以随时增加PV扩展大小
- 在VG上划分新的LV,相当于在新硬盘上分区,此时的LV可以从VG上扩展分区
LVM,MBR,GPT,ext…的关系
-
MBR,GPT是硬盘最基本的内容,是分区表的格式
-
在MBR…的基础上我们会进行分区,这个时候就会有诸如标准分区(sda1,sda2)或者swap分区,或者LVM分区的概念,几者同级(在fdisk 的l可以看到),不论这个盘是GPT还是MBR都可以创建普通分区或者LVM分区,只不过是分区为MBR分区还是GPT分区
-
得到分区之后我们需要对分区写入文件系统,这个时候就会有ext4,vfat,iso9660,xfs…,对于标准分区我们会直接格式化对于LVM分区我们也要在LV上进行格式化
-
一张图解释
graph LR HD(硬盘) MBRGPT(MBR/GPT) part(一个普通的分区) stand(标准分区) swap(swap分区) PVP1(LVM分区1) PVP2(LVM分区2) PVP3(LVM分区3) stus(可用的ext4标准分区) lv1us(可用的ext4LVM分区1) lv2us(可用的ext4LVM分区2) spus(可用的swap) subgraph LVM PV1(PV1) PV2(PV2) PV3(PV3) VG(VG) LV1(LV1) LV2(LV2) LVMORE(LV...) end HD --指定 --> MBRGPT MBRGPT --划分出--> part part --默认是--> stand part --fdisk t --> swap part --fdisk t --> PVP1 --创建PV--> PV1 part --fdisk t --> PVP2 --创建PV--> PV2 part --fdisk t --> PVP3 --创建PV--> PV3 PV1 ---> VG PV2 ---> VG PV3 ---> VG VG --分区--> LV1 VG --分区--> LV2 VG --分区--> LVMORE stand --mkfs ext4写入文件系统--> stus LV1 --mkfs ext4写入文件系统--> lv1us LV2 --mkfs ext4写入文件系统--> lv2us swap --mkswap写入文件系统--> spus HD -.逻辑同级.- VG swap -.逻辑同级.- LV1 -.逻辑同级.- LV2 -.逻辑同级.- LVMORE stand -.同级.- swap -.同级.- PVP1 -.同级.- PVP2 -.同级.- PVP3 stus -.同级.- spus -.同级.- lv1us -.同级.- lv2us
图形界面下分区
可以在CentOS 的安装界面下进行LVM分区,进入到手动分区界面
- 在sda下创建200M的标准分区给/boot(/boot不能用LVM)
- 选空闲,创建,LVM物理卷,这里相当于得到了一个PV,准备一个PV组一个VG,使用全部可用空间,至此得到了一个PV叫做sda2
- 选sda2,创建,LVM卷组,得到VG,此时这个VG是和sda同级的,相当于一个硬盘
- 选空闲,创建,LVM逻辑卷,选择VG,创建,选择文件系统和挂载点即可得到
/
,/home/
,swap
进入系统,我们可以查看
[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000798de
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 2611 20765696 8e Linux LVM
Disk /dev/mapper/VolGroup-LogVol01: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-LogVol00: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-LogVol02: 8376 MB, 8376025088 bytes
255 heads, 63 sectors/track, 1018 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@localhost ~]# mount
/dev/mapper/VolGroup-LogVol00 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/VolGroup-LogVol02 on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
fdisk会方便列出LVM分区的详细信息,mount会直接说
/dev/mapper/VolGroup-LogVol00 on / type ext4 (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/VolGroup-LogVol02 on /home type ext4 (rw)
/boot挂载在了sda1上,其他两个直接挂载到了另一个硬件上,这个新硬盘就是我们的VG,当时没有重命名于是给的是默认命名,后面加上1-3就三个LV,可以 查证
[root@localhost ~]# ll /dev/mapper/
总用量 0
crw-rw----. 1 root root 10, 58 2月 19 01:50 control
lrwxrwxrwx. 1 root root 7 2月 19 01:50 VolGroup-LogVol00 -> ../dm-1
lrwxrwxrwx. 1 root root 7 2月 19 01:50 VolGroup-LogVol01 -> ../dm-0
lrwxrwxrwx. 1 root root 7 2月 19 01:50 VolGroup-LogVol02 -> ../dm-2
使用fdisk分区
- 硬盘分区
[root@10 ~]# fdisk /dev/sdb
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +2G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (263-2610, default 263):
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-2610, default 2610): +2G
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (525-2610, default 525):
Using default value 525
Last cylinder, +cylinders or +size{K,M,G} (525-2610, default 2610): +2G
Command (m for help): p # 创建了三个标准分区
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
/dev/sdb2 263 524 2104515 83 Linux
/dev/sdb3 525 786 2104515 83 Linux
Command (m for help): t # 修改分区类型
Partition number (1-4): 1
Hex code (type L to list codes): 8e # 8e是LVM
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 8e
Changed system type of partition 2 to 8e (Linux LVM)
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Linux LVM)
Command (m for help): p # 打印可以看到Linux变为了Linux LVM
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 8e Linux LVM
/dev/sdb2 263 524 2104515 8e Linux LVM
/dev/sdb3 525 786 2104515 8e Linux LVM
Command (m for help): w # 写入
-
建立PV
pvcreat
可以建立pv,注意设备名[root@10 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created [root@10 ~]# pvcreate /dev/sdb2 Physical volume "/dev/sdb2" successfully created [root@10 ~]# pvcreate /dev/sdb3 Physical volume "/dev/sdb3" successfully created
-
查看PV
可以使用
pvscan
,pvdisplay
查看简略/详细的pv[root@10 ~]# pvscan PV /dev/sdb1 VG myvg1 lvm2 [2.00 GiB / 2.00 GiB free] PV /dev/sdb2 VG myvg1 lvm2 [2.00 GiB / 2.00 GiB free] PV /dev/sdb3 lvm2 [2.01 GiB] Total: 3 [6.01 GiB] / in use: 2 [4.01 GiB] / in no VG: 1 [2.01 GiB] [root@10 ~]# pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name myvg1 PV Size 2.01 GiB / not usable 3.16 MiB Allocatable yes PE Size 4.00 MiB Total PE 513 Free PE 513 Allocated PE 0 PV UUID GdSlLe-Ihf5-JNcy-ODaq-Fy8y-VW8k-Ve7wnd --- Physical volume --- PV Name /dev/sdb2 VG Name myvg1 PV Size 2.01 GiB / not usable 3.19 MiB Allocatable yes PE Size 4.00 MiB Total PE 513 Free PE 513 Allocated PE 0 PV UUID G5oqcJ-RLNx-yHR2-CB3s-KfSn-ftIP-jI0CvH "/dev/sdb3" is a new physical volume of "2.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb3 VG Name PV Size 2.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID PqTUdA-2VYn-I3wE-rVBY-7Mja-e2GR-sPR3qz
-
建立VG
vgcreat VG名 PV设备们
-s
指定PE大小,没人用
[root@10 ~]# vgcreate myvg1 /dev/sdb1 /dev/sdb2 # 将两个PV加入VG Volume group "myvg1" successfully created
-
查看VG
可以使用
vgscan
,vgdisplay
查看简略/详细的vg[root@10 ~]# vgscan Reading all physical volumes. This may take a while... Found volume group "myvg1" using metadata type lvm2 [root@10 ~]# vgdisplay --- Volume group --- VG Name myvg1 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 4.01 GiB PE Size 4.00 MiB Total PE 1026 Alloc PE / Size 0 / 0 Free PE / Size 1026 / 4.01 GiB VG UUID zn4VDW-Q5nz-ctFv-71E3-m3oo-OIy9-tyyyrE
-
VG扩容
vgextend VG名 PV设备
可以扩容[root@10 ~]# vgextend myvg1 /dev/sdb3 Volume group "myvg1" successfully extended
扩容无需重挂载,可以在占用的时候扩容
-
VG缩容
禁止操作
-
建立LV
lvcreat 卷组名
可以建立LV-L 容量
:指定LV大小,单位有MB,GB,TB…,注意写GB而非G-l 个数
:指定LV大小,方式是有多少个PE,不好算,没人用-n [LVName]
:指定逻辑卷名
[root@10 ~]# lvcreate -L 1GB -n mylv1 myvg1 Logical volume "mylv1" created. [root@10 ~]# lvcreate -L 2GB -n mylv2 myvg1 Logical volume "mylv2" created. [root@10 ~]# lvcreate -L 3GB -n mylv3 myvg1 Logical volume "mylv3" created.
-
查看LV
可以使用
lvscan
,lvdisplay
查看简略/详细的lv[root@10 ~]# lvscan ACTIVE '/dev/myvg1/mylv1' [1.00 GiB] inherit ACTIVE '/dev/myvg1/mylv2' [2.00 GiB] inherit ACTIVE '/dev/myvg1/mylv3' [3.00 GiB] inherit [root@10 ~]# lvdisplay --- Logical volume --- LV Path /dev/myvg1/mylv1 LV Name mylv1 VG Name myvg1 LV UUID DP4H2E-y372-VzQu-KSIE-35tR-ipJT-w5GEqT LV Write Access read/write LV Creation host, time 10.0.2.15, 2021-02-19 02:23:04 +0800 LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 --- Logical volume --- LV Path /dev/myvg1/mylv2 LV Name mylv2 VG Name myvg1 LV UUID khVCFL-addO-mnzy-6CwG-TtKd-T8Nh-kJGdAC LV Write Access read/write LV Creation host, time 10.0.2.15, 2021-02-19 02:23:16 +0800 LV Status available # open 0 LV Size 2.00 GiB Current LE 512 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 --- Logical volume --- LV Path /dev/myvg1/mylv3 LV Name mylv3 VG Name myvg1 LV UUID ypbyjM-ClmO-6fzL-oa7e-kREr-qxES-mPQe1N LV Write Access read/write LV Creation host, time 10.0.2.15, 2021-02-19 02:23:21 +0800 LV Status available # open 0 LV Size 3.00 GiB Current LE 768 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2
-
格式化LV
[root@10 ~]# mkfs -t ext4 /dev/myvg1/mylv1 [root@10 ~]# mkfs -t ext4 /dev/myvg1/mylv2 [root@10 ~]# mkfs -t ext4 /dev/myvg1/mylv3
注意新分区的位置在
dev/[vgname]/[lvname]
,这里的mylv1
,mylv2
,mylv3
只不过是因为当时恰好这么起名的,不必后面是1,2,3 -
LV扩容
lvresize LV设备名
调整大小-L 容量
:修改大小,可以接+2GB,-1GB调整增量,也可以直接5GB调整到5GB,单位有MB,GB,TB…,注意写GB而非G-l 个数
:修改大小,加上调整后的PE数
resize2fs LV设备名
刷新大小扩容无需卸载,可以在占用的时候扩容
-
挂载
略
Shell基础
Shell编程的目的是方便运维人员的工作,为了自己使用,对效率要求不高,思路简单,代码长,不像其他编程语言追求精简的代码,复杂的思路
Shell概述
- Shell是一个命令解释器,将命令翻译成机器可以看懂的二进制指令
- Linux使用的Shell名字叫做Bash,可以在
/etc/shell
查询Linux支持的shell
Shell的执行方式
-
echo
命令输出指定内容
-
对于没有空格的文本可以直接写
-
有空格的需要在文本两边加上""
-
-n
输出后不换行,例如[root@10 ~]# echo 123 123 [root@10 ~]# echo -n 123 123[root@10 ~]#
-
-e
支持输出转义字符 -
echo -e "e[1;XXmabcde[0m"
彩色输出abcd,其中e[1;XXm
和e[0m
相当于左右括号前后无需空格,XX内填写的数字表示颜色,第一位3表示修改字体颜色,4代表背景色,第二位0黑,1红,2绿,3黄,4蓝,5洋红,6青色,7白色 -
shell想要输出
!
必须写成!空格
否则报错,显示的时候也会显示空格
-
-
shell脚本最好以.sh结尾
-
第一句必须是
#!/bin/bash
这个不是注释,叫做bashbang,在多语言的脚本中没他跑不起来 -
执行
- 直接文件名可以执行,但是要赋予执行权限
bash 文件名
可以执行,不需要x权限,但是没人用…
Shell的基本功能
-
查看历史命令
-
可以使用上箭头显示历史命令/
history
查询历史命令 -
系统会将历史命令记录在
~/.bash_history
下,history就是输出的这个文件 -
~/.bash_history
文件只有在系统关机的时候才会写入,也就是说不会显示本次登陆后写的命令,可以使用history -w
立刻写入本次登录后的历史命令 -
在
/etc/profile
修改历史命令记录条数HISTSIZE=1000
-
可以使用
history -c
清除本次登录后和~/.bash_history
的历史记录,上箭头也失效,一般用于输入明文密码后 -
可以在
history
之后使用!数字
执行history显示的第某编号条命令 -
!!
执行上一条命令 -
!XXX
执行以XXX开头的最后一条命令 -
!$
可以被替换为上一个命令的最后一个参数,例如[root@10 ~]# touch aaa [root@10 ~]# ls aaa anaconda-ks.cfg install.log install.log.syslog [root@10 ~]# rm -rf aaa [root@10 ~]# touch !$ touch aaa [root@10 ~]# ls aaa anaconda-ks.cfg install.log install.log.syslog
-
-
Tab补全
-
别名
- 使用
alias 新命令="原来命令"
临时生效,注意前面没有"",后面有"" - 在
~/.bashrc
中直接写下临时命令即可永久生效,重启或者source ~/.bashrc
即可启用 - Bash中命令的执行优先级
- 绝对路径
- 别名
- Bash命令
- 在PATH环境变量中找到的第一个命令
- 使用
-
.
.
相当于source的别名,但是别名里面查询不到./
是当前目录.XXX
是隐藏文件
-
常见快捷键
-
Ctrl+A
光标移动到开头 -
Ctrl+E
光标移动到末尾 -
Ctrl+C
终止 -
Ctrl+L
清屏 -
Ctrl+U
剪切光标之前的内容 -
Ctrl+K
剪切光标之后的命令 -
Ctrl+Y
粘贴剪切的内容 -
Ctrl+R
在历史命令中搜索 -
Ctrl+D
退出终端 -
Ctrl+Z
将程序暂停然后存入后台(注意不要当成Ctrl+C
用) -
Ctrl+S
暂停屏幕输出 -
Ctrl+Q
恢复屏幕输出
-
-
IO重定向
-
Bash下的标准IO有
设备 文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/stdout 1 标准输出 显示器 /dev/stderr 2 标准错误输出 -
输出重定向
命令的输出本来应该输出到标准输出,但是我们改变了输出的方向,输出到了文件
-
标准输出的重定向
可以将命令的正确输出输出到指定的文件,方式是
命令 > 文件
,或者命令 >> 文件
,区别是,前者是覆盖文件内容,后者是追加 -
标准错误输出重定向
可以将命令的报错信息重定向到文件,但是正确的输出不会重定向,方法是
错误命令 2> 文件
或者错误命令 2>> 文件
-
同时输出正确与错误的输出
命令 >> 文件1 2>> 文件2
1,2分别存放正确和错误输出命令 &>> 文件
或者命令 >> 文件 2>&1
两者全部追加命令 &> 文件
或者命令 > 文件 2>&1
两者全部覆盖
-
-
输入重定向
改变输入方式,变为从文件输入
-
<
是直接文件输入,例如patch -p3 < txt.patch
-
<<
是输入部分内容,当出现与开头相同的内容的时候将中间的内容输入,例如[root@10 ~]# cat << Imhead > as > sd > df > Imhead as sd df
-
-
-
多命令顺序执行
可以在一行下写下多个命令,让这些命令顺序执行,同时这几条命令不像管道一样结果传递,命令之间完全平行,中间可以使用不同的符号隔开
;
:命令之间完全无关,一条执行完一条执行,不论前一条是否报错&&
:只有前一条命令正确才执行后一条||
:只有前一条错误才执行后一条
可以理解成C++中的
;
,&&
,||
,且存在短路操作 -
管道符
-
同配符
-
Bash中的特殊符号
''
:单引号表示其中的特殊内容没有特殊含义,例如‘$name’就表示字符串而不是变量值""
:双引号表示其中的特殊内容没有特殊含义,"$","`",""除外``
:用来引用系统命令的结果,括起来的内容是系统命令,Bash会优先执行,与$()一样,但是不推荐,容易看成‘$()
:用来引用系统命令的结果,括起来的内容是系统命令,Bash会优先执行,例如s=$(date)
得到的s就是当前时间的字符串()
:括起来的是系统命令,会在子shell中执行括起来的命令,命令必须以;结尾,最后一个可以不加{}
:括起来的是系统命令,会在父shell中执行括起来的命令,命令必须以;结尾[]
:用于变量测试#
:注释$
:调用变量的时候需要,例如 n a m e 相 当 于 是 n a m e 变 量 , 但 是 n a m e 相 当 于 是 字 符 串 , 在 定 义 的 时 候 不 需 要 name相当于是name变量,但是name相当于是字符串,在定义的时候不需要 name相当于是name变量,但是name相当于是字符串,在定义的时候不需要,直接name=1即可:转义符
-
父Shell与子Shell
我们在开一个Shell之后还可以在他的内部再开一个Shell,例如:
[root@10 ~]# pstree init─┬─省略一些进程 ├─省略一些进程 ├─sshd───sshd───bash───pstree └─省略一些进程 [root@10 ~]# bash [root@10 ~]# pstree init─┬─省略一些进程 ├─省略一些进程... ├─sshd───sshd───bash───bash───pstree └─省略一些进程
最开始使用pstree查看进程树看到有一个bash下开了一个pstree,在我们输入bash后查进程树看到一个bash下开了一个bash下有个pstree,相当于我们处于资格bash下的bash,这个bash就是原bash的子bash,在这个Bash下原Bash的变量等等都是隔离的,例如
[root@10 ~]# a=1 [root@10 ~]# (a=2;echo $a;) 2 [root@10 ~]# echo $a 1
这个和C++的变量保护一样,子有用子,子无用父
Shell的变量和运算符
变量
-
变量规则
-
命名规则于从C++ 相同
-
弱类型,但是特殊规定,默认是字符串型,如果要进行数值运算必须指定为数值类型
-
变量赋值的时候
=
两边左右不得加空格 -
变量允许叠加,例如
[root@10 ~]# test=123 [root@10 ~]# test="$test"456 [root@10 ~]# echo $test 123456
-
环境变量建议全大写
-
-
变量分类
Shell只有字符串和数值类型,这里是按照操作环境分类
- 用户自定义变量:由用户自定义的
- 环境变量:保存于系统相关的数据,例如
/etc/profile
的HISTSIZE,可以分成两种,系统自带的环境变量,名字,作用是确定的,值可以自定义,例如分辨率。用户自定义的环境变量最大的作用就是可以跨Shell调用,全局生效。建议将环境变量全大写方便区分 - 位置参数变量:向脚本传递参数
- 预定义变量:Bash中定义好的变量
-
用户自定义变量
-
定义:
name=123
-
调用:
echo $name
(echo一个不存在的变量结果是空) -
查看所有变量:
set [选项] 后面没有操作对象
-u
调用未声明的变量会报错(正常情况为空)-x
在执行命令之前会重新输出命令空
显示所有变量
[root@10 ~]# a=1 # 在Bash中我只定义了a不定义b [root@10 ~]# echo $a # 正确输出a 1 [root@10 ~]# echo $b # 未知内容和空内容输出相同 [root@10 ~]# echo "" [root@10 ~]# c="$a"0 # 正常拼接 [root@10 ~]# echo $c 10 [root@10 ~]# c="$b"0 # 未知变量拼接不报错,只不过只有0 [root@10 ~]# echo $c 0 [root@10 ~]# set -u # 开启-u [root@10 ~]# echo $a # 已经定义的正常 1 [root@10 ~]# echo $b # 未定义的报错 -bash: b: unbound variable [root@10 ~]# c="$a"0 # 已定义的正常 [root@10 ~]# echo $c 10 [root@10 ~]# c="$b"0 # 未定义的报错 -bash: b: unbound variable [root@10 ~]# echo $c # 还是报错前的状态 10 [root@10 ~]# set -x # 开启-x ++ printf '
-