08-27-周三_17-09-29
617
Linux基础/LVM逻辑卷管理器.md
Normal file
@@ -0,0 +1,617 @@
|
||||
# LVM(逻辑卷管理器)
|
||||
|
||||
逻辑卷管理器是Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。
|
||||
|
||||

|
||||
|
||||
物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列,这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。
|
||||
|
||||
PE最小存储单元,VG通过PV组合好PE,成一个整的;然后LV从VG分出来可供挂载使用
|
||||
|
||||
## 部署逻辑卷
|
||||
|
||||
常用的LVM部署命令
|
||||
|
||||
| 功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
|
||||
| --------- | ---------- | --------- | ---------- |
|
||||
| 扫描 | pvscan | vgscan | lvscan |
|
||||
| 建立 | pvcreate | vgcreate | lvcreate |
|
||||
| 显示 | pvdisplay | vgdisplay | lvdisplay |
|
||||
| 删除 | pvremove | vgremove | lvremove |
|
||||
| 扩展 | | vgextend | lvextend |
|
||||
| 缩小 | | vgreduce | lvreduce |
|
||||
|
||||
为了避免多个实验之间相互发生冲突,请大家自行将虚拟机还原到初始状态,并在虚拟机中添加两块新硬盘设备,然后开机
|
||||
|
||||
第1步:让新添加的两块硬盘设备支持LVM技术
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# pvcreate /dev/nvme0n2 /dev/nvme0n3
|
||||
Physical volume "/dev/nvme0n2" successfully created.
|
||||
Physical volume "/dev/nvme0n3" successfully created.
|
||||
#有时候创建不成功,有残留数据需要重新做分区表
|
||||
#[root@localhost ~]#parted /dev/sd[b-c] mklabel msdos
|
||||
```
|
||||
|
||||
第2步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# vgcreate storage /dev/nvme0n2 /dev/nvme0n3
|
||||
Volume group "storage" successfully created
|
||||
[root@localhost ~]# vgdisplay storage
|
||||
--- Volume group ---
|
||||
VG Name storage
|
||||
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 9.99 GiB
|
||||
PE Size 4.00 MiB
|
||||
Total PE 2558
|
||||
Alloc PE / Size 0 / 0
|
||||
Free PE / Size 2558 / 9.99 GiB
|
||||
VG UUID fhR9kn-q5mT-CxO1-Skst-c5mN-X1nN-TbQpU6
|
||||
```
|
||||
|
||||
第3步:切割出一个约为150MB的逻辑卷设备。
|
||||
|
||||
这里需要注意切割单位的问题。在对逻辑卷进行切割时有两种计量单位。
|
||||
|
||||
第一种是以容量为单位,所使用的参数为-L。例如,使用-L 150M生成一个大小为150MB的逻辑卷。
|
||||
|
||||
另外一种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为4MB。例如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。
|
||||
|
||||
```bash
|
||||
# [root@localhost ~]# lvcreate -n vo -l 37 -I 8M storage
|
||||
[root@localhost ~]# lvcreate -n vo -l 37 storage
|
||||
Logical volume "vo" created.
|
||||
# 每个PE占4M,37*4=148M,远少于/dev/nvme0n2的5G,不会占用到第二个PV(/dev/nvme0n3),所以lsblk只看到占用了/dev/nvme0n2
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─storage-vo 253:2 0 148M 0 lvm
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
|
||||
[root@localhost ~]# lvdisplay
|
||||
--- Logical volume ---
|
||||
LV Path /dev/storage/vo
|
||||
LV Name vo
|
||||
VG Name storage
|
||||
LV UUID X83QDm-cgYS-Vlsj-FHqq-pJWh-bWnY-NhoozO
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-16 17:35:36 +0800
|
||||
LV Status available
|
||||
# open 0
|
||||
LV Size 148.00 MiB
|
||||
Current LE 37
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:2
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/swap
|
||||
LV Name swap
|
||||
VG Name rl
|
||||
LV UUID mStLV7-xYcw-4GHG-vdEC-igob-LNmI-xWVQRF
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 2
|
||||
LV Size 2.00 GiB
|
||||
Current LE 512
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:1
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/root
|
||||
LV Name root
|
||||
VG Name rl
|
||||
LV UUID yQ6wgx-mgEh-ACiF-Au17-X7Qs-PzQx-0eiqg3
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 1
|
||||
LV Size <17.00 GiB
|
||||
Current LE 4351
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:0
|
||||
```
|
||||
|
||||
第4步:把生成好的逻辑卷进行格式化,然后挂载使用。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkfs.ext4 /dev/storage/vo
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 151552 1k blocks and 37848 inodes
|
||||
Filesystem UUID: 11f83627-21f1-42fb-a19b-6ccfdc62453d
|
||||
Superblock backups stored on blocks:
|
||||
8193, 24577, 40961, 57345, 73729
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (4096 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# mkdir /mnt/vo
|
||||
[root@localhost ~]# mount /dev/storage/vo /mnt/vo
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/mapper/storage-vo 134M 14K 123M 1% /mnt/vo
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─storage-vo 253:2 0 148M 0 lvm /mnt/vo
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
|
||||
[root@localhost ~]# echo "/dev/storage/vo /mnt/vo ext4 defaults 0 0" >> /etc/fstab
|
||||
```
|
||||
|
||||
## 扩容逻辑卷
|
||||
|
||||
第1步:把上一个实验中的逻辑卷vo扩展至290MB
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# umount /mnt/vo
|
||||
[root@localhost ~]# lvextend -L 290M /dev/storage/vo
|
||||
Rounding size to boundary between physical extents: 292.00 MiB.
|
||||
Size of logical volume storage/vo changed from 148.00 MiB (37 extents) to 292.00 MiB (73 extents).
|
||||
Logical volume storage/vo successfully resized.
|
||||
```
|
||||
|
||||
第2步:检查硬盘完整性,并重置硬盘容量,否则挂载了还是148M
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# e2fsck -f /dev/storage/vo
|
||||
e2fsck 1.46.5 (30-Dec-2021)
|
||||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Pass 3: Checking directory connectivity
|
||||
Pass 4: Checking reference counts
|
||||
Pass 5: Checking group summary information
|
||||
/dev/storage/vo: 11/37848 files (0.0% non-contiguous), 15165/151552 blocks
|
||||
[root@localhost ~]# resize2fs /dev/storage/vo
|
||||
resize2fs 1.46.5 (30-Dec-2021)
|
||||
Resizing the filesystem on /dev/storage/vo to 299008 (1k) blocks.
|
||||
The filesystem on /dev/storage/vo is now 299008 (1k) blocks long.
|
||||
```
|
||||
|
||||
第3步:重新挂载硬盘设备并查看挂载状态
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# systemctl daemon-reload
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/mapper/storage-vo 268M 14K 250M 1% /mnt/vo
|
||||
```
|
||||
|
||||
第4步,如果扩容到6G,则会占用到nvme0n3的pv
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# umount /mnt/vo
|
||||
[root@localhost ~]# lvextend -L 6G /dev/storage/vo
|
||||
Size of logical volume storage/vo changed from 292.00 MiB (73 extents) to 6.00 GiB (1536 extents).
|
||||
Logical volume storage/vo successfully resized.
|
||||
[root@localhost ~]# e2fsck -f /dev/storage/vo
|
||||
e2fsck 1.46.5 (30-Dec-2021)
|
||||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Pass 3: Checking directory connectivity
|
||||
Pass 4: Checking reference counts
|
||||
Pass 5: Checking group summary information
|
||||
/dev/storage/vo: 11/73704 files (0.0% non-contiguous), 24683/299008 blocks
|
||||
[root@localhost ~]# resize2fs /dev/storage/vo
|
||||
resize2fs 1.46.5 (30-Dec-2021)
|
||||
Resizing the filesystem on /dev/storage/vo to 6291456 (1k) blocks.
|
||||
The filesystem on /dev/storage/vo is now 6291456 (1k) blocks long.
|
||||
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─storage-vo 253:2 0 6G 0 lvm /mnt/vo
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
└─storage-vo 253:2 0 6G 0 lvm /mnt/vo
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/mapper/storage-vo 5.7G 14K 5.4G 1% /mnt/vo
|
||||
```
|
||||
|
||||
## 缩小逻辑卷
|
||||
|
||||
第1步:检查文件系统的完整性
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# umount /mnt/vo
|
||||
[root@localhost ~]# e2fsck -f /dev/storage/vo
|
||||
e2fsck 1.46.5 (30-Dec-2021)
|
||||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Pass 3: Checking directory connectivity
|
||||
Pass 4: Checking reference counts
|
||||
Pass 5: Checking group summary information
|
||||
/dev/storage/vo: 11/1529856 files (0.0% non-contiguous), 391996/6291456 blocks
|
||||
```
|
||||
|
||||
第2步:把逻辑卷vo的容量减小到120MB
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# resize2fs /dev/storage/vo 120M
|
||||
resize2fs 1.46.5 (30-Dec-2021)
|
||||
Resizing the filesystem on /dev/storage/vo to 122880 (1k) blocks.
|
||||
The filesystem on /dev/storage/vo is now 122880 (1k) blocks long.
|
||||
|
||||
[root@localhost ~]# lvreduce -L 120M /dev/storage/vo
|
||||
File system ext4 found on storage/vo.
|
||||
File system size (120.00 MiB) is equal to the requested size (120.00 MiB).
|
||||
File system reduce is not needed, skipping.
|
||||
Size of logical volume storage/vo changed from 6.00 GiB (1536 extents) to 120.00 MiB (30 extents).
|
||||
Logical volume storage/vo successfully resized.
|
||||
```
|
||||
|
||||
第3步:重新挂载文件系统并查看系统状态
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 5.2M 344M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/mapper/storage-vo 108M 14K 99M 1% /mnt/vo
|
||||
```
|
||||
|
||||
## 逻辑卷快照
|
||||
|
||||
LVM还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。LVM的快照卷功能有两个特点:
|
||||
|
||||
- 快照卷的容量必须等同于逻辑卷的容量;
|
||||
- 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# vgdisplay
|
||||
--- Volume group ---
|
||||
VG Name storage
|
||||
System ID
|
||||
Format lvm2
|
||||
Metadata Areas 2
|
||||
Metadata Sequence No 5
|
||||
VG Access read/write
|
||||
VG Status resizable
|
||||
MAX LV 0
|
||||
Cur LV 1
|
||||
Open LV 1
|
||||
Max PV 0
|
||||
Cur PV 2
|
||||
Act PV 2
|
||||
VG Size 9.99 GiB
|
||||
PE Size 4.00 MiB
|
||||
Total PE 2558
|
||||
Alloc PE / Size 30 / 120.00 MiB
|
||||
Free PE / Size 2528 / <9.88 GiB # 容量剩余9.88G
|
||||
VG UUID fhR9kn-q5mT-CxO1-Skst-c5mN-X1nN-TbQpU6
|
||||
|
||||
--- Volume group ---
|
||||
VG Name rl
|
||||
System ID
|
||||
Format lvm2
|
||||
Metadata Areas 1
|
||||
Metadata Sequence No 3
|
||||
VG Access read/write
|
||||
VG Status resizable
|
||||
MAX LV 0
|
||||
Cur LV 2
|
||||
Open LV 2
|
||||
Max PV 0
|
||||
Cur PV 1
|
||||
Act PV 1
|
||||
VG Size <19.00 GiB
|
||||
PE Size 4.00 MiB
|
||||
Total PE 4863
|
||||
Alloc PE / Size 4863 / <19.00 GiB
|
||||
Free PE / Size 0 / 0
|
||||
VG UUID GbAoZ2-IvHg-YKLQ-366L-f2lq-qo71-T79Hm6
|
||||
```
|
||||
|
||||
接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# echo "hello world" > /mnt/vo/readme.txt
|
||||
[root@localhost ~]# ls -l /mnt/vo
|
||||
total 14
|
||||
drwx------. 2 root root 12288 Apr 18 13:38 lost+found
|
||||
-rw-r--r--. 1 root root 12 Apr 18 13:48 readme.txt
|
||||
```
|
||||
|
||||
第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小。
|
||||
|
||||
另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。**强烈建议快照大小和原来的LVM一样大**
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# lvcreate -L 120M -s -n SNAP /dev/storage/vo
|
||||
#强烈建议快照大小和原来的LVM一样大,虽然指定大小是120M,并不是创建一个120M大小的快照,除非修改、新增的文件超出120M才会出事情,删除不影响。
|
||||
Logical volume "SNAP" created.
|
||||
[root@localhost ~]# lvdisplay
|
||||
--- Logical volume ---
|
||||
LV Path /dev/storage/vo
|
||||
LV Name vo
|
||||
VG Name storage
|
||||
LV UUID X83QDm-cgYS-Vlsj-FHqq-pJWh-bWnY-NhoozO
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-16 17:35:36 +0800
|
||||
LV snapshot status source of
|
||||
SNAP [active]
|
||||
LV Status available
|
||||
# open 1
|
||||
LV Size 120.00 MiB
|
||||
Current LE 30
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:2
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/storage/SNAP
|
||||
LV Name SNAP
|
||||
VG Name storage
|
||||
LV UUID om37W1-JVXY-yctX-4Rm7-Bh9L-ERVo-JlqTuV
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-16 17:43:02 +0800
|
||||
LV snapshot status active destination for vo
|
||||
LV Status available
|
||||
# open 0
|
||||
LV Size 120.00 MiB
|
||||
Current LE 30
|
||||
COW-table size 120.00 MiB
|
||||
COW-table LE 30
|
||||
Allocated to snapshot 0.01%
|
||||
Snapshot chunk size 4.00 KiB
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:5
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/swap
|
||||
LV Name swap
|
||||
VG Name rl
|
||||
LV UUID mStLV7-xYcw-4GHG-vdEC-igob-LNmI-xWVQRF
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 2
|
||||
LV Size 2.00 GiB
|
||||
Current LE 512
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:1
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/root
|
||||
LV Name root
|
||||
VG Name rl
|
||||
LV UUID yQ6wgx-mgEh-ACiF-Au17-X7Qs-PzQx-0eiqg3
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 1
|
||||
LV Size <17.00 GiB
|
||||
Current LE 4351
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:0
|
||||
```
|
||||
|
||||
第2步:在逻辑卷所挂载的目录中创建一个50MB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# dd if=/dev/zero of=/mnt/vo/files count=1 bs=50M
|
||||
1+0 records in
|
||||
1+0 records out
|
||||
104857600 bytes (105 MB) copied, 3.29409 s, 31.8 MB/s
|
||||
[root@localhost ~]# lvdisplay
|
||||
--- Logical volume ---
|
||||
LV Path /dev/storage/vo
|
||||
LV Name vo
|
||||
VG Name storage
|
||||
LV UUID X83QDm-cgYS-Vlsj-FHqq-pJWh-bWnY-NhoozO
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-16 17:35:36 +0800
|
||||
LV snapshot status source of
|
||||
SNAP [active]
|
||||
LV Status available
|
||||
# open 1
|
||||
LV Size 120.00 MiB
|
||||
Current LE 30
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:2
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/storage/SNAP
|
||||
LV Name SNAP
|
||||
VG Name storage
|
||||
LV UUID om37W1-JVXY-yctX-4Rm7-Bh9L-ERVo-JlqTuV
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-16 17:43:02 +0800
|
||||
LV snapshot status active destination for vo
|
||||
LV Status available
|
||||
# open 0
|
||||
LV Size 120.00 MiB
|
||||
Current LE 30
|
||||
COW-table size 120.00 MiB
|
||||
COW-table LE 30
|
||||
Allocated to snapshot 41.90% # 从0.01变成了41.90
|
||||
Snapshot chunk size 4.00 KiB
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:5
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/swap
|
||||
LV Name swap
|
||||
VG Name rl
|
||||
LV UUID mStLV7-xYcw-4GHG-vdEC-igob-LNmI-xWVQRF
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 2
|
||||
LV Size 2.00 GiB
|
||||
Current LE 512
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:1
|
||||
|
||||
--- Logical volume ---
|
||||
LV Path /dev/rl/root
|
||||
LV Name root
|
||||
VG Name rl
|
||||
LV UUID yQ6wgx-mgEh-ACiF-Au17-X7Qs-PzQx-0eiqg3
|
||||
LV Write Access read/write
|
||||
LV Creation host, time localhost.localdomain, 2024-11-09 10:51:12 +0800
|
||||
LV Status available
|
||||
# open 1
|
||||
LV Size <17.00 GiB
|
||||
Current LE 4351
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 8192
|
||||
Block device 253:0
|
||||
```
|
||||
|
||||
第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# umount /mnt/vo
|
||||
[root@localhost ~]# lvconvert --merge /dev/storage/SNAP
|
||||
Merging of volume storage/SNAP started.
|
||||
storage/vo: Merged: 31.39%
|
||||
storage/vo: Merged: 100.00%
|
||||
```
|
||||
|
||||
第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的50MB的垃圾文件也被清除了
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# ls /mnt/vo/
|
||||
lost+found readme.txt
|
||||
```
|
||||
|
||||
## 删除逻辑卷
|
||||
|
||||
第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# umount /mnt/vo/
|
||||
[root@localhost ~]# vi /etc/fstab
|
||||
#
|
||||
# /etc/fstab
|
||||
# Created by anaconda on Mon Apr 15 17:31:00 2019
|
||||
#
|
||||
# Accessible filesystems, by reference, are maintained under '/dev/disk'
|
||||
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
|
||||
#
|
||||
/dev/mapper/centos-root / xfs defaults 0 0
|
||||
UUID=63e91158-e754-41c3-b35d-7b9698e71355 /boot xfs defaults 0 0
|
||||
/dev/mapper/centos-swap swap swap defaults 0 0
|
||||
```
|
||||
|
||||
第2步:删除逻辑卷设备,需要输入y来确认操作
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# lvremove /dev/storage/vo
|
||||
Do you really want to remove active logical volume storage/vo? [y/n]: y
|
||||
Logical volume "vo" successfully removed
|
||||
```
|
||||
|
||||
第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# vgremove storage
|
||||
Volume group "storage" successfully removed
|
||||
```
|
||||
|
||||
第4步:删除物理卷设备
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# pvremove /dev/nvme0n2 /dev/nvme0n3
|
||||
Labels on physical volume "/dev/nvme0n2" successfully wiped.
|
||||
Labels on physical volume "/dev/nvme0n3" successfully wiped.
|
||||
```
|
BIN
Linux基础/LVM逻辑卷管理器/LVM逻辑图.png
Normal file
After Width: | Height: | Size: 26 KiB |
9
Linux基础/Linux.md
Normal file
@@ -0,0 +1,9 @@
|
||||
Linux是一种广泛使用的开源操作系统,它在计算机领域扮演着重要的角色。作为一个开源项目,Linux的发展得到了全球开发者社区的积极参与和贡献。它被广泛应用于各种领域,包括服务器、个人电脑、移动设备、嵌入式系统以及云计算等。
|
||||
|
||||
Linux的成功得益于其开源的本质和强大的特性。开源意味着任何人都可以查看、修改和分发Linux的源代码,这为开发者提供了灵活性和自由度。由于开放源代码的特性,Linux得到了全球范围内的开发者社区的支持和贡献,这使得Linux系统能够不断地获得改进和更新。
|
||||
|
||||
Linux在服务器领域表现出色。由于其稳定性、安全性和高度可定制性,许多大型互联网公司和企业选择在其服务器环境中使用Linux。Linux服务器能够提供高性能和可靠性,满足了企业对数据处理、存储和网络服务的需求。
|
||||
|
||||
此外,Linux也在个人电脑和移动设备领域发挥着重要作用。许多个人电脑用户选择使用Linux操作系统,因为它提供了多样化的发行版和定制选项,同时具备稳定性和安全性。在移动设备领域,Android操作系统是基于Linux内核开发的,成为了全球最受欢迎的移动操作系统之一。
|
||||
|
||||
Linux的应用还扩展到嵌入式系统和云计算领域。嵌入式Linux广泛应用于各种设备,如智能家居、汽车导航系统和工业控制系统等。它提供了轻量级、高度可定制的操作系统解决方案。在云计算领域,Linux为云服务提供商和虚拟化技术提供了稳定、可扩展和高性能的基础。
|
421
Linux基础/Linux命令行.md
Normal file
@@ -0,0 +1,421 @@
|
||||
# 初识 Shell
|
||||
|
||||
虽然我们已经安装好了系统,但是光会安装不会操作是不够的。我们还要像玩手机一样熟悉并记忆操作方法。
|
||||
|
||||
Shell 是系统的**用户界面**,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个**命令解释器**,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)
|
||||
|
||||

|
||||
|
||||
我们可以使用 Shell 实现对Linux系统的大部分管理,例如:
|
||||
1. 文件管理
|
||||
2. 用户管理
|
||||
3. 权限管理
|
||||
4. 磁盘管理
|
||||
5. 软件管理
|
||||
6. 网络管理
|
||||
...
|
||||
|
||||
使用 Shell 的两种方式
|
||||
- 交互式命令行
|
||||
- 默认等待用户输入命令,输入一行回车后执行一行命令
|
||||
- 适合少量的工作
|
||||
- Shell 脚本
|
||||
- 将需要执行的命令和逻辑判断语句都写入一个文件后执行该文件
|
||||
- 适合完成复杂,重复性工作
|
||||
|
||||
# Bash shell 提示符
|
||||
|
||||
登录 Linux 系统之后,默认进入交互式的命令行界面,在光标前边会出现提示符
|
||||
|
||||
```shell
|
||||
[root@localhost ~]#
|
||||
[用户名@主机名 目录名]权限标识
|
||||
|
||||
```
|
||||
**解释说明:**
|
||||
|
||||
- 用户名:当前登录的用户
|
||||
- 主机名:当前这台主机的名字,默认叫`localhost`
|
||||
- 目录名:当前光标所在的目录;当前用户家目录表示成`~`
|
||||
- 权限标识:超级管理员权限就表示为`#`;普通用户标识为`$`
|
||||
|
||||
**修改提示符:**
|
||||
|
||||
```shell
|
||||
# 这个提示符格式被`$PS1`控制,我们可以查看这个变量
|
||||
# \u表示是用户名 \h表示的是主机名 \W表示的当前所在目录 \$是权限标识
|
||||
[root@localhost ~]# echo $PS1
|
||||
[\u@\h \W]\$
|
||||
|
||||
# 可以通过export命令修改PS1变量,让提示符可以根据你的习惯变化
|
||||
[root@localhost ~]# export PS1="{\u@\h}\W \$"
|
||||
{root@localhost}~ $
|
||||
|
||||
# 修改回原来的样子
|
||||
{root@localhost}~ $ $export PS1="[\u@\h \W]\$ "
|
||||
|
||||
```
|
||||
|
||||
# 常用命令
|
||||
|
||||
**Linux 常见命令比较多,这边只列出初学者最常用的部分命令,大家可以根据命令有意去进行练习。**
|
||||
|
||||
注意 Linux 会准确的识别出命令的大小写,所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔,请大家在输入的时候注意不要缺失空格。
|
||||
|
||||
学习 Linux 最重要的就是以下三个方面
|
||||
1. 命令的积累
|
||||
2. 原理的掌握
|
||||
3. 大量的实战
|
||||
|
||||
下面就是开始第一步,积累基础的命令
|
||||
|
||||
## ls
|
||||
|
||||
用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)
|
||||
```shell
|
||||
Usage: ls [OPTION]... [FILE]...
|
||||
List information about the FILEs (the current directory by default).
|
||||
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-a` | 显示所有文件及目录 (`.`开头的隐藏文件也会列出) |
|
||||
| `-l` | 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出 |
|
||||
| `-r` | 将文件以相反次序显示(原定依英文字母次序) |
|
||||
| `-t` | 将文件依建立时间之先后次序列出 |
|
||||
| `-A` | 同 `-a`,但不列出 `.(目前目录)` 及 `.. (父目录)` |
|
||||
| `-F` | 在列出的文件名称后加一符号;例如可执行档则加 `*`, 目录则加 `/`,链接加`@` |
|
||||
| `-R` | 若目录下有文件,则以下之文件亦皆依序列出 |
|
||||
| `-h` | 将显示出来的文件大小以合适的单位显示出来 |
|
||||
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 查看当前目录下的文件
|
||||
[root@localhost ~]# ls
|
||||
|
||||
# 查看根目录下的文件,查看/usr目录下的文件
|
||||
[root@localhost ~]# ls /
|
||||
[root@localhost ~]# ls /usr
|
||||
|
||||
# 查看当前目录下所有文件,包括隐藏文件
|
||||
[root@localhost ~]# ls -a
|
||||
|
||||
# 查看当前目录下文件详情,包括隐藏文件
|
||||
[root@localhost ~]# ls -lha
|
||||
|
||||
# 查看 /usr/sbin/ 目录下的文件,并且显示出目录,文件,程序的区别
|
||||
# 可以看到普通文件只有文件名,可执行文件后面带*,文件夹后面带/
|
||||
[root@localhost ~]# ls -F /usr/sbin/
|
||||
|
||||
# 查看 /etc/ssh/ 目录下的文件,如果有文件夹,那么将文件夹中的文件也显示出来
|
||||
[root@localhost ~]# ls -FR /etc/ssh/
|
||||
|
||||
# 显示详细的信息
|
||||
[root@localhost ~]# ls -FRl
|
||||
```
|
||||
|
||||
## cd
|
||||
|
||||
用于切换当前工作目录
|
||||
|
||||
```shell
|
||||
cd: cd [-L|[-P [-e]] [-@]] [dir]
|
||||
Change the shell working directory.
|
||||
```
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 跳转到 /usr/bin 目录下
|
||||
[root@localhost ~]# cd /usr/bin
|
||||
|
||||
# 跳到自己的 home 目录
|
||||
[root@localhost bin]# cd ~
|
||||
|
||||
# 跳到目前目录的上一层
|
||||
[root@localhost ~]# cd ..
|
||||
```
|
||||
|
||||
## pwd
|
||||
|
||||
显示工作目录
|
||||
|
||||
```shell
|
||||
pwd: pwd [-LP]
|
||||
Print the name of the current working directory.
|
||||
```
|
||||
|
||||
## clear
|
||||
|
||||
用于清除屏幕
|
||||
|
||||
```shell
|
||||
Usage: clear [options]
|
||||
```
|
||||
|
||||
## echo
|
||||
|
||||
用于字符串的输出
|
||||
|
||||
```shell
|
||||
echo [option]... [string]...
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-n` | 不输出行尾的换行符 |
|
||||
| `-e` | 允许对下面列出的加反斜线转义的字符进行解释 |
|
||||
| `\\`| 反斜线 |
|
||||
| `\a` | 报警符(BEL) |
|
||||
| `\b` | 退格符 |
|
||||
| `\c` | 禁止尾随的换行符 |
|
||||
| `\f` | 换页符 |
|
||||
| `\n` | 换行符 |
|
||||
| `\r` | 回车符 |
|
||||
| `\t` | 水平制表符 |
|
||||
| `\v` | 纵向制表符 |
|
||||
| `-E` | 禁止对在 STRINGs 中的那些序列进行解释 |
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 显示出 hello world
|
||||
[root@localhost ~]# echo "hello world"
|
||||
# 用两行显示出 hello world
|
||||
[root@localhost ~]# echo -e "hello\nworld"
|
||||
# 输出 hello world 的时候让系统发出警报音
|
||||
[root@localhost ~]# echo -e "hello\aworld"
|
||||
|
||||
```
|
||||
|
||||
|
||||
# 系统命令
|
||||
|
||||
## poweroff
|
||||
|
||||
用于关闭计算器并切断电源
|
||||
|
||||
```shell
|
||||
poweroff [OPTIONS...]
|
||||
Power off the system.
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-n` | 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。 |
|
||||
| `-w` | 仅记录关机信息到 `/var/log/wtmp` 文件中,但并不实际执行关机操作。 |
|
||||
| `-d` | 不把记录写到 /var/log/wtmp 文件里 |
|
||||
| `-f` | 强制关机。此参数会立即停止所有进程并关闭系统,而不是正常关机流程。|
|
||||
|
||||
## reboot
|
||||
|
||||
用来重新启动计算机
|
||||
```shell
|
||||
reboot [OPTIONS...] [ARG]
|
||||
Reboot the system
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-n` | 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。 |
|
||||
| `-w` | 仅记录重启信息到 `/var/log/wtmp` 文件中,但并不实际执行重启操作。 |
|
||||
| `-d` | 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d) |
|
||||
| `-f` | 强迫重开机,不呼叫 shutdown 这个指令 |
|
||||
|
||||
|
||||
## whoami
|
||||
|
||||
用于显示自身用户名称
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# whoami
|
||||
root
|
||||
|
||||
```
|
||||
|
||||
# 快捷键
|
||||
|
||||
| 快捷键 | 作用 |
|
||||
| :--- | :---|
|
||||
| `^C` | 终止前台运行的程序 |
|
||||
| `^D` | 退出 等价exit |
|
||||
| `^L` | 清屏 |
|
||||
| `^A` | 光标移动到命令行的最前端 |
|
||||
| `^E` | 光标移动到命令行的后端 |
|
||||
| `^U` | 删除光标前所有字符 |
|
||||
| `^K` | 删除光标后所有字符 |
|
||||
| `^R` | 搜索历史命令,利用关键词 |
|
||||
|
||||
|
||||
# 帮助命令
|
||||
|
||||
## history
|
||||
|
||||
```shell
|
||||
history [n] n为数字,列出最近的n条命令
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-c` | 将目前shell中的所有history命令消除 |
|
||||
| `-a` | 将目前新增的命令写入histfiles, 默认写入`~/.bash_history` |
|
||||
| `-r` | 将histfiles内容读入到目前shell的history记忆中 |
|
||||
| `-w` | 将目前history记忆的内容写入到histfiles |
|
||||
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 将history的内容写入一个新的文件中
|
||||
[root@localhost ~]# history -w histfiles.txt
|
||||
# 清理所有的history记录,注意并不清空 ~/.bash_history 文件
|
||||
[root@localhos t ~]# history -c
|
||||
[root@localhost ~]# history
|
||||
1 history
|
||||
2 cat .bash_history
|
||||
3 ping -c 3 baidu.com
|
||||
4 history
|
||||
# 这里是执行第三条命令的意思
|
||||
[root@localhost ~]# !3
|
||||
# 从最近的命令查到以`command`开头的命令执行
|
||||
[root@localhost ~]# !ping
|
||||
# 执行上一条命令
|
||||
[root@localhost ~]# !!
|
||||
|
||||
```
|
||||
|
||||
## help
|
||||
|
||||
显示命令的帮助信息
|
||||
```shell
|
||||
help [-dms] [内置命令]
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-d` | 输出每个主题的简短描述 |
|
||||
| `-m` | 以伪 man 手册的格式显示使用方法 |
|
||||
| `-s` | 为每一个匹配 PATTERN 模式的主题仅显示一个用法 |
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 查看echo的帮助信息
|
||||
[root@localhost ~]# help echo
|
||||
```
|
||||
|
||||
## man
|
||||
|
||||
显示在线帮助手册页
|
||||
|
||||
```shell
|
||||
man 需要帮助的命令或者文件
|
||||
```
|
||||
|
||||
**快捷键**
|
||||
|
||||
| 按键 | 用途 |
|
||||
| :--- | :--- |
|
||||
| `空格键` | 向下翻一页 |
|
||||
| `PaGe down` | 向下翻一页 |
|
||||
| `PaGe up` | 向上翻一页 |
|
||||
| `home` | 直接前往首页 |
|
||||
| `end` | 直接前往尾页 |
|
||||
| `/` | 从上至下搜索某个关键词,如“/linux” |
|
||||
| `?` | 从下至上搜索某个关键词,如“?linux” |
|
||||
| `n` | 定位到下一个搜索到的关键词 |
|
||||
| `N` | 定位到上一个搜索到的关键词 |
|
||||
| `q` | 退出帮助文档 |
|
||||
|
||||
|
||||
**手册的结构**
|
||||
|
||||
| 结构名称 | 代表意义 |
|
||||
| :--- | :--- |
|
||||
| NAME | 命令的名称 |
|
||||
| SYNOPSIS | 参数的大致使用方法 |
|
||||
| DESCRIPTION | 介绍说明 |
|
||||
| EXAMPLES | 演示(附带简单说明) |
|
||||
| OVERVIEW | 概述 |
|
||||
| DEFAULTS | 默认的功能 |
|
||||
| OPTIONS | 具体的可用选项(带介绍) |
|
||||
| ENVIRONMENT | 环境变量 |
|
||||
| FILES | 用到的文件 |
|
||||
| SEE ALSO | 相关的资料 |
|
||||
| HISTORY | 维护历史与联系方式 |
|
||||
|
||||
## alias
|
||||
|
||||
用于设置指令的别名
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 查看系统当前的别名
|
||||
[root@localhost ~]# alias
|
||||
alias cp='cp -i'
|
||||
alias egrep='egrep --color=auto'
|
||||
alias fgrep='fgrep --color=auto'
|
||||
alias grep='grep --color=auto'
|
||||
alias l.='ls -d .* --color=auto'
|
||||
alias ll='ls -l --color=auto'
|
||||
alias ls='ls --color=auto'
|
||||
alias mv='mv -i'
|
||||
alias rm='rm -i'
|
||||
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
|
||||
[root@localhost ~]# ll
|
||||
总用量 4
|
||||
-rw-------. 1 root root 1241 8月 22 2018 anaconda-ks.cfg
|
||||
drwxr-xr-x. 2 root root 19 8月 21 12:15 home
|
||||
# 查看命令类型
|
||||
# ls 是 `ls --color=auto' 的别名
|
||||
# ls 是 /usr/bin/ls
|
||||
[root@xwz ~]# type -a ls
|
||||
# 修改别名,比如使用wl来查看IP地址相关信息
|
||||
[root@localhost ~]# alias wl='ip address'
|
||||
[root@localhost ~]# wl
|
||||
# 为了让别名永久生效,可以将修改别名的命令写入 bashrc 文件,这个文件中的命令会在每次登陆命令行的时候执行
|
||||
[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc
|
||||
|
||||
```
|
||||
|
||||
# 环境变量
|
||||
|
||||
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
|
||||
|
||||
简单的理解就是告诉操作系统在程序运行的时候,有一些默认的设置是什么。
|
||||
|
||||
比如上面我们修改了 `LANG` 变量,就是一个环境变量,会影响到显示的语言是中文还是英文。
|
||||
|
||||
比如在讲解 `pwd` 命令的时候,我们修改了 `$PWD` 变量,就影响了当前所处的文件夹。
|
||||
|
||||
在我们使用 shell 命令行输入命令的时候,其实每个命令都是有一个可执行文件去完成我们下达的任务,这个可执行文件在操作系统中是分布在不同的文件夹中的,我们总不能每次执行的时候都要告诉操作系统这个文件在哪里,那么就算是查看一个文件,我们都需要输入如下的命令:
|
||||
|
||||
```shell
|
||||
# 在Linux中,ls的可执行程序在/usr/bin目录下
|
||||
[root@localhost ~]# /usr/bin/ls -lh
|
||||
```
|
||||
|
||||
这样就太麻烦了,所以就指定了一个环境变量 `$PATH`,这个变量中有很多的目录地址,当我们执行命令的时候,操作系统就会到这些目录中查找,是否存在你所输入的命令。如果有那么就会去执行。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# echo $PATH
|
||||
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
|
||||
```
|
||||
|
||||
如果你想让自己安装的某个软件可以在操作系统的任意位置直接输入文件名执行,那么你也可以把自定义的目录加入到这个 `$PATH` 中
|
BIN
Linux基础/Linux命令行/命令解释器.png
Normal file
After Width: | Height: | Size: 105 KiB |
81
Linux基础/Linux基础.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# 操作系统简介
|
||||
|
||||
世上本没有路,走的人多了,便变成了路。——鲁迅
|
||||
|
||||
这句话真的是鲁迅说的,出自鲁迅的《故乡》,我们可以理解为一个东西用的人多了,自然而然就会把这个东西的使用方式打磨完善了,人类自动获得了智慧开始就掌握了工具的使用方法。众所周知做不同的事情就需要有不同的方法,走不同的路,也就有了不同的工具。
|
||||
|
||||
一台机器往往有不同的零件组成,一台电脑也是由很多不同的硬件组成,这么多的硬件设备,就需要有一个系统去代替我们管理好,这个就是操作系统。
|
||||
|
||||
操作系统需要完成的任务很简单,就是去学习每个硬件的不同使用方法,专业的术语叫“安装驱动程序”,当操作系统学会了每个硬件的使用方法之后,就会以某种人类可以操作的方式来被人类使用,有的操作系统是图形化界面的,我们可以鼠标点击来操作,有的是命令行的,我们需要输入命令来操作,不管是哪种方式,最终都是让计算机硬件来为我们而工作。
|
||||
|
||||

|
||||
|
||||
# Linux操作系统
|
||||
|
||||
不同的人对计算机有不同的操作习惯,不同的使用场景对操作系统有不同的挑战,所以当前就出现了多种多样的操作系统
|
||||
|
||||
* Windows
|
||||
* 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些
|
||||
* Linux
|
||||
* 免费的,开源的,主要用于服务器领域,性能稳定,安全
|
||||
* Unix
|
||||
* 用于封闭的硬件环境,企业的应用依赖于定制化开发
|
||||
|
||||
# Linux图谱
|
||||
|
||||
Linux发展到今天出现了大量不同的分支。不同的分支都有不同的发展方向,可以扫描下面二维码,查看Linux发展分支图,或者点开[此链接](https://user-images.githubusercontent.com/19638095/97118180-e25f3680-1708-11eb-8bef-1ebe025e1374.png)。
|
||||
|
||||

|
||||
|
||||
# Linux名词
|
||||
|
||||
* Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
|
||||
* Linux发行套件系统是我们常说的Linux操作系统,也即是由Linux内核与各种常用软件的集合产品
|
||||
|
||||
# RedHat认证
|
||||
|
||||
redhat是目前全球最大的Linux商业公司,redhat为Linux技术工程师提供了一个考试认证,通过这个考试认证的工程师,可以获得redhat公司颁发的证书。
|
||||
|
||||
在行业内,redhat的技术证书还是占有很高的含金量的,证书的认证难度依次如下。
|
||||
|
||||

|
||||
|
||||
## RHCSA
|
||||
|
||||
* 管理文件、目录、文档以及命令行环境;
|
||||
* 使用分区、LVM逻辑卷管理本地存储;
|
||||
* 安装、更新、维护、配置系统与核心服务;
|
||||
* 熟练创建、修改、删除用户与用户组,并使用LDAP进行集中目录身份认证;
|
||||
* 熟练配置防火墙以及SELinux来保障系统安全。
|
||||
|
||||
## RHCE
|
||||
|
||||
* 熟练配置防火墙规则链与SElinux安全上下文;
|
||||
* 配置iSCSI(互联网小型计算机系统接口)服务;
|
||||
* 编写Shell脚本来批量创建用户、自动完成系统的维护任务;
|
||||
* 配置HTTP/HTTPS网络服务;
|
||||
* 配置FTP服务;
|
||||
* 配置NFS服务;
|
||||
* 配置SMB服务;
|
||||
* 配置SMTP服务;
|
||||
* 配置SSH服务;
|
||||
* 配置NTP服务。
|
||||
* 自动化运维工具ansible
|
||||
|
||||
## RHCA
|
||||
|
||||
欲取得红帽RHCA认证,您必须通过以下任意5门认证考试。
|
||||
|
||||
| 考试代码 | 认证名称 |
|
||||
| :------- | :--------------------------------- |
|
||||
| EX210 | 红帽OpenStack 认证系统管理员考试 |
|
||||
| EX220 | 红帽混合云管理专业技能证书考试 |
|
||||
| EX236 | 红帽混合云存储专业技能证书考试 |
|
||||
| EX248 | 红帽认证 JBoss管理员考试 |
|
||||
| EX280 | 红帽平台即服务专业技能证书考试 |
|
||||
| EX318 | 红帽认证虚拟化管理员考试 |
|
||||
| EX401 | 红帽部署和系统管理专业技能证书考试 |
|
||||
| EX413 | 红帽服务器固化专业技能证书考试 |
|
||||
| EX436 | 红帽集群和存储管理专业技能证书考试 |
|
||||
| EX442 | 红帽性能调优专业技能证书考试 |
|
||||
|
BIN
Linux基础/Linux基础/Linux发展分支图.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
Linux基础/Linux基础/RedHat认证.png
Normal file
After Width: | Height: | Size: 156 KiB |
BIN
Linux基础/Linux基础/操作系统简介.png
Normal file
After Width: | Height: | Size: 712 KiB |
81
Linux基础/Linux常用命令大全.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# gzip/unzip
|
||||
```shell
|
||||
Usage: gzip [OPTION]... [FILE]...
|
||||
Compress or uncompress FILEs (by default, compress FILES in-place).
|
||||
|
||||
Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
|
||||
Default action is to extract files in list, except those in xlist, to exdir;
|
||||
file[.zip] may be a wildcard. -Z => ZipInfo mode ("unzip -Z" for usage).
|
||||
```
|
||||
|
||||
**常用案例**
|
||||
```shell
|
||||
# 压缩后保留原文件
|
||||
gzip -k <filename>
|
||||
# 递归压缩目录内所有文件
|
||||
gzip -r <dir>
|
||||
# 压缩级别设置: -1(最快)到 -9(最高压缩比),默认 -6
|
||||
gzip -k -1 <filename>
|
||||
# 流式压缩(处理大文件):边读边压缩
|
||||
cat <filename> | gzip > <filename>.gz
|
||||
|
||||
# 解压到指定目录
|
||||
unzip file.zip -d /target/path
|
||||
# 列出压缩包内容
|
||||
unzip -l file.zip
|
||||
# 强制覆盖/保留已有文件
|
||||
unzip -o file.zip
|
||||
unzip -n file.zip
|
||||
```
|
||||
|
||||
# tar
|
||||
```shell
|
||||
Usage: tar [OPTION...] [FILE]...
|
||||
GNU 'tar' saves many files together into a single tape or disk archive, and can
|
||||
restore individual files from the archive.
|
||||
```
|
||||
|
||||
**常用案例**
|
||||
```shell
|
||||
# 打包目录 & 打包并压缩目录
|
||||
tar -cvf archive.tar /path/to/directory
|
||||
tar -zcvf <dir_name>.tar.gz <dir>
|
||||
# 解压普通归档 & gzip压缩包 & 指定目录
|
||||
tar -xvf archive.tar
|
||||
tar -xzvf backup.tar.gz
|
||||
tar -xzvf backup.tar.gz -C /target/path
|
||||
# 查看归档内容
|
||||
tar -tvf archive.tar
|
||||
tar -tzvf backup.tar.gz
|
||||
```
|
||||
|
||||
# wget
|
||||
```shell
|
||||
Usage: wget [OPTION]... [URL]...
|
||||
```
|
||||
|
||||
**常用案例**
|
||||
```shell
|
||||
# 下载单个文件并重命名保存
|
||||
wget -O custom_name.zip http://example.com/download.php?id=1080
|
||||
# 断点续传
|
||||
wget -c http://example.com/largefile.iso
|
||||
# 限速下载
|
||||
wget --limit-rate=500k http://example.com/data.tar.gz
|
||||
|
||||
```
|
||||
|
||||
# curl
|
||||
```shell
|
||||
Usage: curl [options...] <url>
|
||||
```
|
||||
|
||||
**常用案例**
|
||||
```shell
|
||||
# 保存响应
|
||||
curl -o output.html http://example.com
|
||||
curl -O http://example.com/file.zip
|
||||
# 调试与日志
|
||||
curl -v http://example.com
|
||||
curl -i http://example.com
|
||||
```
|
BIN
Linux基础/Linux系统安装/MobaXterm-会话设置.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Linux基础/Linux系统安装/MobaXterm-安装.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
Linux基础/Linux系统安装/MobaXterm-执行命令.png
Normal file
After Width: | Height: | Size: 132 KiB |
BIN
Linux基础/Linux系统安装/MobaXterm-登录成功.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
Linux基础/Linux系统安装/RL系统使用1.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
Linux基础/Linux系统安装/RL系统使用2.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导1.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导2.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导3.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导4.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导5.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导6.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro安装向导7.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro输入许可证1.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Linux基础/Linux系统安装/WorkstationPro输入许可证2.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-SCSI控制器.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-完成创建.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-指定磁盘容量.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-磁盘类型.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-网络类型.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机-选择磁盘.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机1.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机2.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机3.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机4.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机5.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机6.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
Linux基础/Linux系统安装/创建虚拟机7.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-安装源.png
Normal file
After Width: | Height: | Size: 194 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-安装选项.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-开启.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-开始安装.png
Normal file
After Width: | Height: | Size: 330 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-标准安装.png
Normal file
After Width: | Height: | Size: 289 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-目标位置.png
Normal file
After Width: | Height: | Size: 230 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-网络连接.png
Normal file
After Width: | Height: | Size: 191 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-设置密码.png
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-选择语言.png
Normal file
After Width: | Height: | Size: 316 KiB |
BIN
Linux基础/Linux系统安装/安装RL系统-重启系统.png
Normal file
After Width: | Height: | Size: 267 KiB |
BIN
Linux基础/Linux系统安装/编辑虚拟机-ISO映像文件.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Linux基础/Linux系统安装/编辑虚拟机-设置.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
Linux基础/Linux系统安装/虚拟机快照1.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
Linux基础/Linux系统安装/虚拟机快照2.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
Linux基础/Linux系统安装/虚拟机快照3.png
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
Linux基础/Linux系统安装/远程管理1.png
Normal file
After Width: | Height: | Size: 13 KiB |
406
Linux基础/Linux网络管理.md
Normal file
@@ -0,0 +1,406 @@
|
||||
# 数据通信基础
|
||||
|
||||
- 数据从产生到传递到目的地的过程中会经历好几个过程,每个过程都负责加工自己这部分的内容,类似于工厂流水线
|
||||
- 目前我们只需要有个最基本的概念:
|
||||
- IP地址是用来标识网络中位置的,比如你在江苏省xxx市xxx路xxx号
|
||||
- MAC地址是每个网络设备的唯一ID,比如你的身份证号码
|
||||
- 如果想要发送数据,必须(暂且认为必须)同时拥有IP和MAC地址
|
||||
- Linux的网络管理基础部分就是需要大家掌握IP地址的配置
|
||||
|
||||

|
||||
|
||||
## IP地址
|
||||
|
||||
- 在IP网络中,通信节点需要有一个唯一的IP地址
|
||||
- IP地址用于IP报文的寻址以及标识一个节点
|
||||
- IPv4地址一共32bits,使用点分十进制的形式表示
|
||||
|
||||
<img src="Linux网络管理/IP地址.png" alt="img-IP地址" style="zoom:67%;" />
|
||||
|
||||
- IPv4地址由网络位和主机位组成
|
||||
- 网络位一致表示在同一个广播域中,可以直接通信
|
||||
- 主机位用于在同一个局域网中标识唯一节点
|
||||
|
||||
### 早期IP地址的划分
|
||||
|
||||
<img src="Linux网络管理/IP地址划分.png" alt="img-IP地址划分" style="zoom:67%;" />
|
||||
|
||||
- 早期参与互联网的设备不多,所以仅仅使用ABC类地址分配给用户即可
|
||||
- 随着网络用户的增多,ABC类分配地址过于浪费,于是出现子网掩码方式划分网络位和主机位
|
||||
|
||||
### IP网络通信类型
|
||||
|
||||
- 单播(Unicast)
|
||||
- 广播(Broadcast)
|
||||
- 组播(Multicast)
|
||||
|
||||
### 子网掩码(Netmask)
|
||||
|
||||
- 网络掩码与IP地址搭配使用,用于描述一个IP地址中的网络部分及主机部分
|
||||
- 网络掩码32bits,与32bits的IP地址一一对应,掩码中为1的位对应IP地址中的网络位,掩码中为0的位对应IP地址中的主机位
|
||||
|
||||
<img src="Linux网络管理/子网掩码.png" alt="img-子网掩码" style="zoom:67%;" />
|
||||
|
||||
- 减少一个局域网中的设备数量可以有效降低广播报文消耗资源
|
||||
|
||||
- 可变长子网掩码可以将一个局域网中的主机地址分配的更加小
|
||||
|
||||
<img src="Linux网络管理/可变长子网掩码.png" alt="img-可变长子网掩码" style="zoom:67%;" />
|
||||
|
||||
### 广播地址与网络号
|
||||
|
||||
- 在局域网中经常会有广播的需要(比如,mac地址查询,地址冲突检测等等),所以将主机位全为1的地址做为本局域网的广播地址(注意!广播并不能跨越不同的局域网)
|
||||
- 在网络中需要表示整个局域网,就像邮政编码表示一个大的区域一样,所以将主机位全为0的地址作为本局域网的网络号,用来代指整个网段
|
||||
- 综上所述,计算产生的子网及每个子网的主机数量公式如下:
|
||||
|
||||
<img src="Linux网络管理/子网和主机IP数.png" alt="img-子网和主机IP数" style="zoom:50%;" />
|
||||
|
||||
### 私有IP地址
|
||||
|
||||
- 如果要取得互联网合法地址用于通信,必须要找 iana.org 组织分配
|
||||
- 很多企业内部都有大量的网络设备,大多数时候这些设备只需要内部通信即可
|
||||
- 企业的网络管理员可以从如下网段中自行分配地址
|
||||
|
||||
<img src="Linux网络管理/私有IP地址.png" alt="img-私有IP地址" style="zoom:50%;" />
|
||||
|
||||
- 私有IP地址空间中的地址不需要申请,随意使用,但是不能在互联网上与合法地址通信(因为对方没法回复你这个地址,因为世界上私有IP地址段无数个重复的,怎么知道回到谁那里呢)
|
||||
- 而我们明明用的私有IP地址,也可以上网,因为我们需要先把自己的上网请求提交给网络中的网关(就是你家的出口路由器),再由网关代替我们去获取内容转交给我们的电脑手机,而网关往往能从运营商那里得到一个合法的公有IP地址
|
||||
|
||||
# DHCP
|
||||
|
||||
DHCP(动态主机配置协议),主要用于给设备自动的分配IP地址以及网络信息,以便网络设备能够连接到网络并进行通信
|
||||
|
||||
DHCP给设备提供的信息如下:
|
||||
|
||||
- IP地址
|
||||
- 子网掩码
|
||||
- 网关地址
|
||||
- DNS服务器地址
|
||||
- 租约时间
|
||||
|
||||
|
||||
|
||||
## DHCP工作过程
|
||||
|
||||
1. 客户端启动时发送 DHCP 发现(DHCPDISCOVER)广播消息,寻找 DHCP 服务器。
|
||||
2. DHCP 服务器收到广播消息后,会提供一个未被使用的 IP 地址以及其他网络配置信息(如子网掩码、默认网关、DNS 服务器等),并发送 DHCP 提供(DHCPOFFER)消息给客户端。
|
||||
3. 客户端收到一个或多个 DHCP 提供消息后,会选择其中一个 DHCP 服务器提供的 IP 地址,并发送 DHCP 请求(DHCPREQUEST)消息确认。
|
||||
4. DHCP 服务器收到客户端的 DHCP 请求消息后,会将该 IP 地址分配给客户端,并发送 DHCP 确认(DHCPACK)消息给客户端。
|
||||
5. 客户端收到 DHCP 确认消息后,就可以使用分配到的 IP 地址和其他网络配置参数连接到网络了。
|
||||
|
||||
`dhclient`
|
||||
|
||||
我们可以通过抓包软件,捕捉到主机通过DHCP方式获取ip的过程,一共有4个数据包:
|
||||
|
||||

|
||||
|
||||
其中每个数据包的作用如下:
|
||||
|
||||
1. `Discover`消息是用于客户端向整个内网发送广播,期待DHCP服务器进行回应
|
||||
1. 这个数据包中的重要内容就是:消息类型,客户端ID,主机名,请求获得的信息
|
||||
2. `Offer`消息是DHCP服务器对客户的回应
|
||||
1. 这个消息中会回复对方所需要的所有信息
|
||||
3. `Request`这个是客户端确认DHCP服务器的消息
|
||||
1. 这个消息和第一个消息差不多,但是消息类别变为`Request`,并且会携带请求的IP地址
|
||||
4. `ACK`DHCP服务器给客户端的最终确认
|
||||
1. 这个消息和第二个消息差不多,但是消息类型变为`ACK`
|
||||
|
||||
## DHCP续租
|
||||
|
||||
DHCP分配的信息是有有效期的,再租约时间快到的时候,如果我们想要继续使用这个地址信息,就需要向DHCP服务器续租
|
||||
|
||||
这也是大家虚拟机上IP地址经常发生变化的原因,这是因为虚拟机上默认就是以DHCP的方式获得IP地址的
|
||||
|
||||
我们可以查看Linux上的网络配置信息,该信息位于`/etc/NetworkManager/system-connections/ens160.nmconnection`
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
|
||||
[connection]
|
||||
id=ens160
|
||||
uuid=dfea55d8-6ddc-3229-8152-cb9e261de181
|
||||
type=ethernet
|
||||
autoconnect-priority=-999
|
||||
interface-name=ens160
|
||||
timestamp=1731149277
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
method=auto
|
||||
|
||||
[ipv6]
|
||||
addr-gen-mode=eui64
|
||||
method=auto
|
||||
|
||||
[proxy]
|
||||
|
||||
|
||||
# 可以看到配置中的method字段是以dhcp来获得IP地址的。
|
||||
```
|
||||
|
||||
同样从VMware的虚拟网络设置中,也可以看到租约时间相关的内容
|
||||
|
||||
<img src="Linux网络管理/虚拟网络编辑器.png" alt="img-虚拟网络编辑器" style="zoom: 80%;" />
|
||||
|
||||
|
||||
|
||||
# DNS(域名解析)
|
||||
|
||||
DNS(Domain Name System) 是一套从域名到IP的映射的协议
|
||||
|
||||
在网络世界中,如果我们想要给某个机器,或者是某个网站去发送一个数据,都需要通过IP地址来找到对方,比如我们想要使用百度来搜索东西,就需要知道百度的IP地址,换句话说只要知道了百度的IP地址,我们就可以访问到百度
|
||||
|
||||
但是IP地址不易记忆,不可能记住每一个网站的IP地址是什么,于是早期的搞IT的那帮人研发出一个叫做主机名的东西。
|
||||
|
||||
最开始人们把IP和主机名的的对应关系记录在本地,这个文件目前在windows系统的`C:\Windows\System32\drivers\etc\hosts`中。但是后面发现并不好用,而且需要经常手动更新这个文件。类似于黄历
|
||||
|
||||
|
||||
|
||||
随着主机名越来越多,hosts文件不易维护,所以后来改用**域名解析系统DNS**:
|
||||
|
||||
- 一个组织的系统管理机构,维护系统内的每个主机的`IP和主机名`的对应关系
|
||||
- 如果新计算机接入网络,将这个信息注册到`数据库`中
|
||||
- 用户输入域名的时候,会自动查询`DNS`服务器,由`DNS服务器`检索数据库, 得到对应的IP地址。
|
||||
|
||||
## 域名
|
||||
|
||||
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
|
||||
例如:http://www.baidu.com(域名使用.连接)
|
||||
|
||||
- com: 一级域名,表示这是一个企业域名。同级的还有 "net"(网络提供商),"org"(非盈利组织) 等。
|
||||
- baidu: 二级域名, 公司名。
|
||||
- www: 只是一种习惯用法,并不是每个域名都支持。
|
||||
- http:// : 要使用什么协议来连接这个主机名。
|
||||
|
||||
## 常见的域名解析服务器
|
||||
|
||||
- 114dns
|
||||
|
||||
114.114.114.114
|
||||
|
||||
114.114.115.115
|
||||
|
||||
这是国内用户量数一数二的 dns 服务器,该 dns 一直标榜高速、稳定、无劫持、防钓鱼。
|
||||
|
||||
- Google DNS
|
||||
|
||||
8.8.8.8
|
||||
|
||||
8.8.4.4
|
||||
|
||||
......
|
||||
|
||||
可以理解为由这些服务器帮我们记录的域名和IP的对应关系,我们访问域名的时候去找这些dns服务器询问该域名对应的IP地址,当然,除了上述提到的这些dns服务器,三大运营商也提供了dns解析服务
|
||||
|
||||
## 域名解析的过程
|
||||
|
||||
1. 浏览器发起域名解析,首先查询浏览器缓存,如果没有,就查询hosts文件,如果没有就提出域名解析请求
|
||||
2. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
|
||||
3. 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
|
||||
4. 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
|
||||
5. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
|
||||
6. 重复第四步,直到找到正确的纪录。
|
||||
7. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机
|
||||
|
||||
|
||||
|
||||
# 配置网络服务
|
||||
## 修改网卡配置文件
|
||||
```bash
|
||||
# 修改网卡配置文件
|
||||
[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
|
||||
[connection]
|
||||
id=ens160
|
||||
uuid=dfea55d8-6ddc-3229-8152-cb9e261de181
|
||||
type=ethernet
|
||||
autoconnect-priority=-999
|
||||
interface-name=ens160
|
||||
timestamp=1732264040
|
||||
|
||||
[ethernet]
|
||||
|
||||
[ipv4]
|
||||
address1=192.168.88.110/24,192.168.88.2
|
||||
dns=114.114.114.114;114.114.115.115;
|
||||
method=manual
|
||||
|
||||
[ipv6]
|
||||
addr-gen-mode=eui64
|
||||
method=auto
|
||||
|
||||
[proxy]
|
||||
```
|
||||
|
||||
当修改完Linux系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件,需要手动重启相应的服务,之后就可以看到网络畅通了
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# systemctl restart NetworkManager
|
||||
[root@localhost ~]# ping -c 4 www.baidu.com
|
||||
PING www.a.shifen.com (180.101.50.242) 56(84) bytes of data.
|
||||
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=1 ttl=128 time=11.3 ms
|
||||
...
|
||||
```
|
||||
|
||||
## 网卡配置文件参数
|
||||
|
||||
| **节** | **参数** | **描述** |
|
||||
| -------------- | ---------------------- | ------------------------------------------------------------ |
|
||||
| `[connection]` | `id` | 连接的名称,这里是 `ens160`。 |
|
||||
| | `uuid` | 连接的唯一标识符(UUID),用于唯一识别此连接。 |
|
||||
| | `type` | 连接的类型,`ethernet` 表示这是一个以太网连接。 |
|
||||
| | `autoconnect-priority` | 自动连接优先级,数值越小优先级越低。这里设置为 `-999`,表示极低的优先级。 |
|
||||
| | `interface-name` | 连接对应的网络接口名称,这里是 `ens160`。 |
|
||||
| | `timestamp` | 连接的时间戳,表示最后修改的时间。 |
|
||||
| `[ethernet]` | - | 此节用于配置以太网特定的设置,当前没有额外参数。 |
|
||||
| `[ipv4]` | `address1` | 静态 IPv4 地址及其子网掩码,格式为 `IP地址/子网掩码` 和网关,例:`192.168.88.110/24,192.168.88.2`。 |
|
||||
| | `dns` | DNS 服务器地址,多个地址用分号分隔,这里是 `114.114.114.114;114.114.115.115;`。 |
|
||||
| | `method` | IPv4 地址配置方法,这里设置为 `manual`,表示使用手动配置。 |
|
||||
| `[ipv6]` | `addr-gen-mode` | 地址生成模式,`eui64` 表示使用 EUI-64 地址生成方式。 |
|
||||
| | `method` | IPv6 地址配置方法,这里设置为 `auto`,表示自动获取 IPv6 地址。 |
|
||||
| `[proxy]` | - | 此节用于配置代理设置,当前没有额外参数。 |
|
||||
|
||||
## nmcli 工具
|
||||
|
||||
nmcli命令是redhat7或者centos7之后的命令,该命令可以完成网卡上所有的配置工作,并且可以写入 配置文件,永久生效
|
||||
|
||||
- 查看接口状态
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli device status
|
||||
DEVICE TYPE STATE CONNECTION
|
||||
ens160 ethernet connected ens160
|
||||
lo loopback connected (externally) lo
|
||||
```
|
||||
- 查看链接信息
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli connection show
|
||||
NAME UUID TYPE DEVICE
|
||||
ens160 dfea55d8-6ddc-3229-8152-cb9e261de181 ethernet ens160
|
||||
lo 529b2eed-2755-4cce-af3c-999beb49882d loopback lo
|
||||
```
|
||||
|
||||
- 配置IP等网络信息
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli con mod "ens160" ipv4.addresses 192.168.88.140/24 ipv4.gateway 192.168.88.2 ipv4.dns "8.8.8.8,8.8.4.4" ipv4.method manual
|
||||
```
|
||||
|
||||
- 启动/停止接口
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli connection down ens160
|
||||
[root@localhost ~]# nmcli connection up ens160
|
||||
```
|
||||
|
||||
- 创建链接
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli connection add type ethernet ifname ens160 con-name dhcp_ens160
|
||||
# 激活链接
|
||||
[root@localhost ~]# nmcli connection up dhcp_ens160
|
||||
```
|
||||
|
||||
- 删除链接
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# nmcli connection delete dhcp_ens160
|
||||
成功删除连接 'dhcp_ens160'(37adadf4-419d-47f0-a0f6-af849160a4f7)。
|
||||
```
|
||||
|
||||
|
||||
|
||||
# ifconfig
|
||||
|
||||
- ifconfig 命令用于显示或设置网络设备。
|
||||
|
||||
**安装:**`yum install -y net-tools`
|
||||
|
||||
## 语法
|
||||
|
||||
```bash
|
||||
ifconfig [network_interface]
|
||||
[down|up]
|
||||
[add <address>]
|
||||
[del <address>]
|
||||
[hw <type> <hw_address>]
|
||||
[io_addr <I/O_address>]
|
||||
[irq <IRQ>]
|
||||
[media <media_type>]
|
||||
[mem_start <memory_address>]
|
||||
[metric <number>]
|
||||
[mtu <bytes>]
|
||||
[netmask <netmask>]
|
||||
[tunnel <address>]
|
||||
[-broadcast <address>]
|
||||
[-pointopoint <address>]
|
||||
[<IP_address>]
|
||||
```
|
||||
|
||||
## 选项说明
|
||||
|
||||
- `down`/`up`: 禁用/启用网络接口
|
||||
- `add <address>`/`del <address>`: 添加或删除 IP 地址
|
||||
- `hw <type> <hw_address>`: 设置硬件地址 (MAC 地址)
|
||||
- `io_addr <I/O_address>`: 设置 I/O 地址
|
||||
- `irq <IRQ>`: 设置中断请求
|
||||
- `media <media_type>`: 设置网络媒体类型
|
||||
- `mem_start <memory_address>`: 设置内存起始地址
|
||||
- `metric <number>`: 设置路由度量值
|
||||
- `mtu <bytes>`: 设置 MTU 值
|
||||
- `netmask <netmask>`: 设置子网掩码
|
||||
- `tunnel <address>`: 设置隧道地址
|
||||
- `-broadcast <address>`: 设置广播地址
|
||||
- `-pointopoint <address>`: 设置点对点地址
|
||||
- `<IP_address>`: 设置 IP 地址
|
||||
|
||||
## 实例
|
||||
|
||||
- 显示网络设备信息
|
||||
|
||||
```bash
|
||||
[root@localhost cmatrix-1.2a]# ifconfig
|
||||
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
|
||||
inet 192.168.88.136 netmask 255.255.255.0 broadcast 192.168.88.255
|
||||
inet6 fe80::a49c:12c9:1ebd:8fb2 prefixlen 64 scopeid 0x20<link>
|
||||
ether 00:0c:29:cb:d5:1a txqueuelen 1000 (Ethernet)
|
||||
RX packets 122441 bytes 178564616 (170.2 MiB)
|
||||
RX errors 0 dropped 0 overruns 0 frame 0
|
||||
TX packets 13762 bytes 1315614 (1.2 MiB)
|
||||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
||||
|
||||
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
|
||||
inet 127.0.0.1 netmask 255.0.0.0
|
||||
inet6 ::1 prefixlen 128 scopeid 0x10<host>
|
||||
loop txqueuelen 1000 (Local Loopback)
|
||||
RX packets 0 bytes 0 (0.0 B)
|
||||
RX errors 0 dropped 0 overruns 0 frame 0
|
||||
TX packets 0 bytes 0 (0.0 B)
|
||||
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
||||
```
|
||||
|
||||
- 启动关闭指定网卡
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# ifconfig ens33 down
|
||||
[root@localhost ~]# ifconfig ens33 up
|
||||
```
|
||||
|
||||
- 配置IP地址
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# ifconfig eth0 192.168.1.56
|
||||
//给eth0网卡配置IP地址
|
||||
[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0
|
||||
// 给eth0网卡配置IP地址,并加上子掩码
|
||||
[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
|
||||
// 给eth0网卡配置IP地址,加上子掩码,加上个广播地址
|
||||
```
|
||||
|
||||
- 设置最大传输单元
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# ifconfig eth0 mtu 1500
|
||||
//设置能通过的最大数据包大小为 1500 bytes
|
||||
```
|
||||
|
BIN
Linux基础/Linux网络管理/DHCP数据包.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/Linux网络管理/IP地址.png
Normal file
After Width: | Height: | Size: 58 KiB |
BIN
Linux基础/Linux网络管理/IP地址划分.png
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
Linux基础/Linux网络管理/可变长子网掩码.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
Linux基础/Linux网络管理/子网和主机IP数.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
Linux基础/Linux网络管理/子网掩码.png
Normal file
After Width: | Height: | Size: 57 KiB |
BIN
Linux基础/Linux网络管理/数据通信基础.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
Linux基础/Linux网络管理/私有IP地址.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
Linux基础/Linux网络管理/虚拟网络编辑器.png
Normal file
After Width: | Height: | Size: 34 KiB |
196
Linux基础/RockyLinux系统安装.md
Normal file
@@ -0,0 +1,196 @@
|
||||
RockyLinux系统在企业中一般是安装在服务器上的,但是我们学习的时候买台服务器并不方便,所以我们可以将其安装在虚拟机中(实际上很多企业也这么做)
|
||||
|
||||
# vmware workstation 软件安装
|
||||
|
||||
**双击安装包**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
**输入许可证**
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
# 创建 RockyLinux 虚拟机
|
||||
|
||||
**新建虚拟机**
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机1.png" alt="img-创建虚拟机1" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机2.png" alt="img-创建虚拟机2" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机3.png" alt="img-创建虚拟机3" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机4.png" alt="img-创建虚拟机4" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机5.png" alt="img-创建虚拟机5" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机6.png" alt="img-创建虚拟机6" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机7.png" alt="img-创建虚拟机7" style="zoom:80%;" />
|
||||
|
||||
**以下选项全部保持默认或者按照图片中选择**
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机-网络类型.png" alt="img-创建虚拟机-网络类型" style="zoom:80%;" />
|
||||
|
||||

|
||||
|
||||
<img src="Linux系统安装/创建虚拟机-磁盘类型.png" alt="img-创建虚拟机-磁盘类型" style="zoom:80%;" />
|
||||
|
||||
**创建新的虚拟磁盘**
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机-选择磁盘.png" alt="img-创建虚拟机-选择磁盘" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机-指定磁盘容量.png" alt="img-创建虚拟机-指定磁盘容量" style="zoom:80%;" />
|
||||
|
||||
**完成创建**
|
||||
|
||||
<img src="Linux系统安装/创建虚拟机-完成创建.png" alt="img-创建虚拟机-完成创建" style="zoom:80%;" />
|
||||
|
||||
**导入ISO文件**
|
||||
|
||||
<img src="Linux系统安装/编辑虚拟机-设置.png" alt="img-编辑虚拟机-设置" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/编辑虚拟机-ISO映像文件.png" alt="img-编辑虚拟机-ISO映像文件" style="zoom: 80%;" />
|
||||
|
||||
|
||||
|
||||
# 安装 RockyLinux 系统
|
||||
|
||||
1. 点击开启此虚拟机
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-开启.png" alt="img-安装RL系统-开启" style="zoom:80%;" />
|
||||
|
||||
2. 鼠标点击进入这个黑框中,通过方向键选择**安装选项**,我们选择第一个:**Install Rocky Linux 9.4**
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-安装选项.png" alt="img-安装RL系统-安装选项" />
|
||||
|
||||
3. 依次按照图片所示,完成以下设置
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-选择语言.png" alt="img-安装RL系统-选择语言" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-安装源.png" alt="img-安装RL系统-安装源" style="zoom:80%;" />
|
||||
|
||||
4. 依次设置带有黄色感叹号的选项
|
||||
|
||||
5. 选择安装位置:
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-目标位置.png" alt="img-安装RL系统-目标位置" style="zoom:80%;" />
|
||||
|
||||
6. 选择安装的软件环境,标准安装:
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-标准安装.png" alt="img-安装RL系统-标准安装" style="zoom:80%;" />
|
||||
|
||||
7. 选择网络和主机名,用于开启网络连接:
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-网络连接.png" alt="img-安装RL系统-网络连接" style="zoom:80%;" />
|
||||
|
||||
8. 设置 root 密码,为了方便操作,我们统一设置为`2`,然后点击两次完成:
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-设置密码.png" alt="img-安装RL系统-设置密码" style="zoom:80%;" />
|
||||
|
||||
9. 点击开始安装,并且等待安装完成
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-开始安装.png" alt="img-安装RL系统-开始安装" style="zoom:80%;" />
|
||||
|
||||
10. 安装完成以后,点击重启系统
|
||||
|
||||
<img src="Linux系统安装/安装RL系统-重启系统.png" alt="img-安装RL系统-重启系统" style="zoom:80%;" />
|
||||
|
||||
# RockyLinux 系统使用
|
||||
|
||||
重启之后就进入 RockyLinux 系统的界面,没有图形化,只有黑框框。然后我们先输入用户名`root`回车以后,在输入我们设置的密码`2`。但是输入密码的时候,是没有任何显示的,这是命令行为了保护密码的安全故意为之,我们我们输入了密码以后这直接回车即可进入系统。
|
||||
|
||||
<img src="Linux系统安装/RL系统使用1.png" alt="img-RL系统使用1" style="zoom:80%;" />
|
||||
|
||||
如果输入密码回车之后,显示`[root@localhost ~]# `那么说明我们成功进入系统
|
||||
|
||||
最好检查一下,网络有没有问题,我们可以使用命令`ping qq.com -c 4`来测试与腾讯服务器的连通性,依次来判断网络是否正常连接。
|
||||
|
||||
<img src="Linux系统安装/RL系统使用2.png" alt="img-RL系统使用2" style="zoom:80%;" />
|
||||
|
||||
如果输出的结果如图所示,说明我们系统的网络连接正常。那么接下来我们就是给这个系统拍个快照。
|
||||
|
||||
# 虚拟机快照
|
||||
|
||||
快照可以理解为保存的一个当前状态的还原点,可以完整保存当前的环境及状态。当我们以后再实验中,不小心把环境弄坏了以后,我们可以通过拍摄的快照,时光回溯到现在这个状态,避免我们重新安装系统的麻烦。
|
||||
|
||||
## 快照的创建
|
||||
|
||||
在创建快照的时候,一定要关机了以后再拍摄快照,不要在开机的状态下创建快照。
|
||||
|
||||
关机命令:
|
||||
|
||||
```shell
|
||||
poweroff
|
||||
```
|
||||
|
||||
创建快照:
|
||||
|
||||
在上方点击虚拟机,找到快照,拍摄快照,然后起个名字,最后点击拍摄快照。我们的快照就创建好了
|
||||
|
||||
<img src="Linux系统安装/虚拟机快照1.png" alt="img-虚拟机快照1" style="zoom:80%;" />
|
||||
|
||||
<img src="Linux系统安装/虚拟机快照2.png" alt="img-虚拟机快照2" style="zoom:80%;" />
|
||||
|
||||
## 快照的使用
|
||||
|
||||
如果我们想要回复到某一个快照的时候,我们还是在上方虚拟机,快照,然后选择恢复到快照即可。
|
||||
|
||||
<img src="Linux系统安装/虚拟机快照3.png" alt="img-虚拟机快照3" style="zoom:80%;" />
|
||||
|
||||
# 远程管理 Linux 服务器
|
||||
|
||||
大多数情况下 Linux 服务器都是安装在数据中心机房的机柜里面的,大家可以把数据中心理解为大仓库,那么机柜就是一个个货架,而管理人员都是坐在办公室当中,通过电脑远程连接服务器进行管理,所以我们在后续学习的时候,为了方便,全部使用远程连接。
|
||||
|
||||
Linux 远程连接命令行工具有很多:
|
||||
|
||||
- xshell:收费工具,有免费版,基本能满足需求,目前比较主流
|
||||
- putty:开源工具,功能比较简单
|
||||
- MobaXterm:免费工具,功能比较齐全,本次课程中推荐使用
|
||||
|
||||
首先查看虚拟机的IP地址,也就是 Linux 服务器的 IP 地址,登录进虚拟机之后输入`ip address`可以查看
|
||||
|
||||
<img src="Linux系统安装/远程管理1.png" alt="img-远程管理1" style="zoom:80%;" />
|
||||
|
||||
这边可以看到本次安装的 RockyLinux 操作系统获取到的IP地址是 `192.168.88.103` 每个人装的虚拟机获取的 IP 地址可能是不一样的,需要仔细看清楚。
|
||||
|
||||
在连接之前,我们需要在 RockyLinux 上设置一下,让它允许通过 root 用户远程连接进来,大家先照着做,后面我们都会详细学到
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
[root@localhost ~]# systemctl restart sshd
|
||||
```
|
||||
|
||||
## MobaXterm
|
||||
|
||||
解压之前下载的 MobaXterm 压缩包,双击程序运行
|
||||
|
||||

|
||||
|
||||
选择会话——ssh,然后填入IP地址
|
||||
|
||||
<img src="Linux系统安装/MobaXterm-会话设置.png" alt="img-MobaXterm-会话设置" style="zoom:80%;" />
|
||||
|
||||
输入密码以后,回车。如果让你保存密码,建议选择不保存
|
||||
|
||||
如下图所示,则为登录成功
|
||||
|
||||
<img src="Linux系统安装/MobaXterm-登录成功.png" alt="img-MobaXterm-登录成功" style="zoom:80%;" />
|
||||
|
||||
MobaXterm 工具只是用来远程连接和管理我们的 RockyLinux 虚拟机,所以在使用的时候,我们必须先启动 RockyLinux 虚拟机。然后再次使用 MobaXterm 工具连接上来。并且我们在 MobaXterm 上面执行的命令,也都会被传递到我们的 RockyLinux 上面执行。
|
||||
|
||||

|
948
Linux基础/存储管理.md
Normal file
@@ -0,0 +1,948 @@
|
||||
我们在计算机中保存的文件大都是保存在电脑硬盘中,部分同学还会将自己的文件存储在网盘中,网盘中的文件只能说是用来做备份,并不能像本地硬盘上的数据那样随时使用,我们在学习存储管理的时候主要学习的就是如何对自己计算机上的硬盘进行管理,目前我们主流的硬盘主要有两种形态,一种是及机械硬盘(HDD),一种是的固态硬盘(SSD)
|
||||
|
||||
# 硬盘工作原理
|
||||
|
||||
## 机械硬盘HDD
|
||||
|
||||
机械硬盘是靠机械马达以固定的速度转动磁盘,然后再有机械臂的摆动,让磁头可以读取盘片上的磁性信息,这种工作原理的硬盘我们成为机械硬盘。
|
||||
|
||||

|
||||
|
||||
由于机械硬盘是依靠机械的运动来读写数据的,大家都知道机械在长时间运转的过程中是会产生一定的损耗,所以机械硬盘虽然理论上寿命很长,但随着时间的变长,机械磨损变大,导致磁头定位的误差变大,从而影响到硬盘的速度,这个就是为什么你的老电脑开机缓慢,运行卡顿的原因了。
|
||||
|
||||
## 固态硬盘SSD
|
||||
|
||||
固态硬盘依靠主控芯片来将数据的二进制信息写入浮栅晶体管中,以这样的原理实现数据的读取和写入。
|
||||
|
||||

|
||||
|
||||
固态硬盘在读取和写入数据的时候完全是依靠数字电路实现的,所以并没有机械硬盘的机械磨损,而且也没有在磁盘上定位读写的延迟,所以固态硬盘的数据读写效率是远远高于机械硬盘的,但是也有一定的缺点,由于浮栅晶体管的设计原理,每次数据的读写,都会让浮栅晶体管所需要的电压更高,一定寿命以后,固态硬盘就会失效。并且固态硬盘如果发生了损坏,数据恢复的难度是大于机械硬盘的,所以为了可靠性,企业目前还是在大量使用机械硬盘的。
|
||||
|
||||
<img src="存储管理/固态硬盘设计1.png" alt="固态硬盘设计1" style="zoom: 50%;" />
|
||||
|
||||
<img src="存储管理/固态硬盘设计2.png" alt="固态硬盘设计2" style="zoom: 50%;" />
|
||||
|
||||
<img src="存储管理/固态硬盘设计3.png" alt="固态硬盘设计3" style="zoom:50%;" />
|
||||
|
||||
# 硬盘设备命名
|
||||
|
||||
一台服务器往往会配备有多块硬盘,Linux中为了区分不同的硬盘,会使用不同的命名来将硬盘设备标识,Linux系统对物理磁盘设备会使用`sd[a-z]`的方式来命名。物理硬盘上的详细分区会使用数字的方式来进行标识,比如`sda`设备上的多个分区会标识为`sda[1,2,3....]`
|
||||
|
||||
# 分区表
|
||||
|
||||
为了让系统能够识别和管理物理设备上的不同分区,需要在物理设备前加上一些数据用于记录分区的情况,这些数据就是分区表数据,目前分区表有两种主流的格式:
|
||||
|
||||
* MBR
|
||||
* 管理的硬盘大小不能超过2T
|
||||
* 有主分区和扩展分区两种,不管是哪种分区,总数不能超过4个分区
|
||||
* 扩展分区内部可以逻辑上划分多个区域,但是在分区表中都算在一个分区内
|
||||
* 如果作为系统盘,必须要设置一个激活分区,用于存放系统的引导文件
|
||||
|
||||

|
||||
|
||||
* GPT
|
||||
* 管理硬盘大小不能超过18EB,目前人类还没制造出单块这么大的硬盘
|
||||
* 理论上支持无限分区,在win10系统上,最多可以分128个分区
|
||||
* 如果作为系统盘,**必须要创建一个EFI分区,用于存放系统的引导文件**建议ESP分区512M,对齐8扇区4096字节
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
电脑启动的时候:
|
||||
|
||||
MBR分区表会找到激活分区,从里面加载系统启动;
|
||||
|
||||
GPT分区表会查找EFI分区,没有是开不了机的,所以GPT分区表情况下需要建立ESP,MSR分区。
|
||||
|
||||
MSR是微软保留的引导分区,分区一般不会坏因此一般不需要。
|
||||
|
||||
ESP建立512MB,对齐到扇区整数倍是指一次读写几个扇区(例如新建个txt只写一个字符,依旧占用4K,除非越写越大超过4K,占4K的整数倍),并不是越大越好也不是越小越好,根据实际需求,一般是4KB。
|
||||
|
||||
# 管理分区
|
||||
|
||||
- 列出块设备
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
||||
sda 8:0 0 50G 0 disk
|
||||
├─sda1 8:1 0 1G 0 part /boot
|
||||
└─sda2 8:2 0 49G 0 part
|
||||
├─centos-root 253:0 0 47G 0 lvm /
|
||||
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
sdb 8:16 0 20G 0 disk
|
||||
sdc 8:32 0 20G 0 disk
|
||||
sr0 11:0 1 1024M 0 rom
|
||||
```
|
||||
|
||||
- 创建分区命令
|
||||
|
||||
```bash
|
||||
fdisk 管理MBR分区
|
||||
gdisk 管理GPT分区
|
||||
parted 高级分区操作
|
||||
```
|
||||
|
||||
- 重新设置内存中的内核分区表版本
|
||||
|
||||
```bash
|
||||
partprobe
|
||||
```
|
||||
|
||||
## parted 命令
|
||||
|
||||
- parted的操作都是实时生效的,小心使用
|
||||
- 格式:
|
||||
|
||||
```bash
|
||||
parted [选项]... [设备 [命令 [参数]...]...]
|
||||
```
|
||||
|
||||
- 操作命令:
|
||||
|
||||
```bash
|
||||
cp [FROM-DEVICE] FROM-MINOR TO-MINOR #将文件系统复制到另一个分区
|
||||
help [COMMAND] #打印通用求助信息,或关于 COMMAND 的信息
|
||||
mklabel 标签类型 #创建新的磁盘标签 (分区表)
|
||||
mkfs MINOR 文件系统类型 #在 MINOR 创建类型为“文件系统类型”的文件系统
|
||||
mkpart 分区类型 [文件系统类型] 起始点 终止点 #创建一个分区
|
||||
mkpartfs 分区类型 文件系统类型 起始点 终止点 #创建一个带有文件系统的分区
|
||||
move MINOR 起始点 终止点 #移动编号为 MINOR 的分区
|
||||
name MINOR 名称 #将编号为 MINOR 的分区命名为“名称”
|
||||
print [MINOR] #打印分区表,或者分区
|
||||
quit #退出程序
|
||||
rescue 起始点 终止点 #挽救临近“起始点”、“终止点”的遗失的分区
|
||||
resize MINOR 起始点 终止点 #改变位于编号为 MINOR 的分区中文件系统的大小
|
||||
rm MINOR #删除编号为 MINOR 的分区
|
||||
select 设备 #选择要编辑的设备
|
||||
set MINOR 标志 状态 #改变编号为 MINOR 的分区的标志
|
||||
```
|
||||
|
||||
- 查看分区情况
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# parted /dev/nvme0n1 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n1: 21.5GB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: msdos
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size Type File system Flags
|
||||
1 1049kB 1075MB 1074MB primary xfs boot
|
||||
2 1075MB 21.5GB 20.4GB primary lvm
|
||||
|
||||
[root@localhost ~]# parted /dev/nvme0n2 print
|
||||
Error: /dev/nvme0n2: unrecognised disk label
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n2: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: unknown
|
||||
Disk Flags:
|
||||
```
|
||||
|
||||
- 设置磁盘的分区表
|
||||
|
||||
```bash
|
||||
# [root@localhost ~]# parted /dev/nvme0n2 mklabel msdos
|
||||
[root@localhost ~]# parted /dev/nvme0n2 mklabel gpt
|
||||
Information: You may need to update /etc/fstab.
|
||||
|
||||
[root@localhost ~]# parted /dev/nvme0n2 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n2: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
# 由于没有分区,所有没有具体的分区信息
|
||||
```
|
||||
|
||||
- 对磁盘进行分区
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# parted /dev/nvme0n2 mkpart primary 1 1G
|
||||
# 创建1个G大小的分区
|
||||
Information: You may need to update /etc/fstab.
|
||||
[root@localhost ~]# parted /dev/nvme0n2 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n2: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 1000MB 999MB primary
|
||||
|
||||
```
|
||||
|
||||
- 删除分区
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# parted /dev/nvme0n2 rm 1
|
||||
Information: You may need to update /etc/fstab.
|
||||
|
||||
[root@localhost ~]# parted /dev/nvme0n2 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n2: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
```
|
||||
|
||||
- 修改磁盘为mbr分区,注意会丢失所有数据
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# parted /dev/nvme0n2 mklabel msdos
|
||||
警告: The existing disk label on /dev/nvme0n2 will be destroyed and all data on this disk will be lost. Do
|
||||
you want to continue?
|
||||
是/Yes/否/No? yes
|
||||
信息: You may need to update /etc/fstab.
|
||||
```
|
||||
|
||||
## fdisk工具
|
||||
|
||||
管理磁盘中MBR分区
|
||||
|
||||
`fdisk [磁盘名称]`
|
||||
|
||||
fdisk命令中的参数以及作用
|
||||
|
||||
| 参数 | 作用 |
|
||||
| ---- | ---------------------- |
|
||||
| m | 查看全部可用的参数 |
|
||||
| n | 添加新的分区 |
|
||||
| d | 删除某个分区信息 |
|
||||
| l | 列出所有可用的分区类型 |
|
||||
| t | 改变某个分区的类型 |
|
||||
| p | 查看分区信息 |
|
||||
| w | 保存并退出 |
|
||||
| q | 不保存直接退出 |
|
||||
|
||||

|
||||
|
||||
```bash
|
||||
[root@localhost ~]# fdisk /dev/nvme0n2
|
||||
|
||||
Welcome to fdisk (util-linux 2.37.4).
|
||||
Changes will remain in memory only, until you decide to write them.
|
||||
Be careful before using the write command.
|
||||
|
||||
Device does not contain a recognized partition table.
|
||||
Created a new DOS disklabel with disk identifier 0x447f44d1.
|
||||
|
||||
Command (m for help): n
|
||||
Partition type
|
||||
p primary (0 primary, 0 extended, 4 free)
|
||||
e extended (container for logical partitions)
|
||||
Select (default p): p
|
||||
Partition number (1-4, default 1):
|
||||
First sector (2048-10485759, default 2048):
|
||||
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485759, default 10485759): +1G
|
||||
|
||||
Created a new partition 1 of type 'Linux' and of size 1 GiB.
|
||||
|
||||
Command (m for help): p
|
||||
Disk /dev/nvme0n2: 5 GiB, 5368709120 bytes, 10485760 sectors
|
||||
Disk model: VMware Virtual NVMe Disk
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disklabel type: dos
|
||||
Disk identifier: 0x447f44d1
|
||||
|
||||
Device Boot Start End Sectors Size Id Type
|
||||
/dev/nvme0n2p1 2048 2099199 2097152 1G 83 Linux
|
||||
|
||||
Command (m for help): w
|
||||
The partition table has been altered.
|
||||
Calling ioctl() to re-read partition table.
|
||||
Syncing disks.
|
||||
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─nvme0n2p1 259:8 0 1G 0 part
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
```
|
||||
|
||||
## gdisk工具
|
||||
|
||||
管理磁盘中的GPT分区
|
||||
|
||||
使用方式和选项与fdisk中几乎一致
|
||||
|
||||
# 存储结构与磁盘划分
|
||||
|
||||
Linux系统中常见的目录名称以及相应内容
|
||||
|
||||
| 目录名称 | 应放置文件的内容 |
|
||||
| ----------- | --------------------------------------------------------- |
|
||||
| /boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
|
||||
| /dev | 以文件形式存放任何设备与接口 |
|
||||
| /etc | 配置文件 |
|
||||
| /home | 用户家目录 |
|
||||
| /bin | 存放单用户模式下还可以操作的命令 |
|
||||
| /lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
|
||||
| /sbin | 开机过程中需要的命令 |
|
||||
| /media | 用于挂载设备文件的目录 |
|
||||
| /opt | 放置第三方的软件 |
|
||||
| /root | 系统管理员的家目录 |
|
||||
| /srv | 一些网络服务的数据文件目录 |
|
||||
| /tmp | 任何人均可使用的“共享”临时目录 |
|
||||
| /proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
|
||||
| /usr/local | 用户自行安装的软件 |
|
||||
| /usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
|
||||
| /usr/share | 帮助与说明文件,也可放置共享文件 |
|
||||
| /var | 主要存放经常变化的文件,如日志 |
|
||||
| /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
|
||||
|
||||
表示路径的方式:
|
||||
|
||||
- 绝对路径指的是从根目录(/)开始写起的文件或目录名称
|
||||
- 相对路径则指的是相对于当前路径的写法
|
||||
|
||||
# 物理设备的命名规则
|
||||
|
||||
常见的硬件设备及其文件名称
|
||||
|
||||
| 硬件设备 | 文件名称 |
|
||||
| ------------- | ------------------ |
|
||||
| IDE设备 | /dev/hd[a-d] |
|
||||
| SCSI/SATA/U盘 | /dev/sd[a-p] |
|
||||
| 软驱 | /dev/fd[0-1] |
|
||||
| 打印机 | /dev/lp[0-15] |
|
||||
| 光驱 | /dev/cdrom |
|
||||
| 鼠标 | /dev/mouse |
|
||||
| 磁带机 | /dev/st0或/dev/ht0 |
|
||||
|
||||
一般的硬盘设备都会是以“/dev/sd”开头,分区编号按照如下规则:
|
||||
|
||||
- 主分区或扩展分区的编号从1开始,到4结束;
|
||||
- 逻辑分区从编号5开始。
|
||||
|
||||
设备文件名称:
|
||||
|
||||

|
||||
|
||||
# 文件系统与数据资料
|
||||
|
||||
当我们对一块硬盘分区好了以后,接下来我们还要做一件事情,就是我们要对这个分区做一个规定。也可以理解为,当我们要在这个分区上面存放数据的时候,应该按照什么样的规律存放,或者是读取的时候,应该按照什么样的规律读取。
|
||||
|
||||
这样对磁盘或者分区的规定,我们就称之为文件系统。
|
||||
|
||||
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统。但是从大的角度上来看,其实主要分为日志式文件系统和索引式文件系统两种。
|
||||
|
||||
<img src="存储管理/日志文件系统1.png" alt="日志文件系统1" style="zoom: 80%;" />
|
||||
|
||||
<img src="存储管理/日志文件系统2.png" alt="日志文件系统2" style="zoom:80%;" />
|
||||
|
||||
## Linux常见的文件系统
|
||||
|
||||
| 文件系统 | 解释 |
|
||||
| -------- | ------------------------------------------------------------ |
|
||||
| Ext3 | 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。 |
|
||||
| Ext4 | Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。 |
|
||||
| XFS | 是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。 |
|
||||
|
||||
格式化后会发生如下事情
|
||||
|
||||
- 日志式文件系统先干掉inode表,索引式文件系统先干掉第一个索引,表示空间可用。
|
||||
|
||||
- Linux创建一个硬盘地图'superblock',记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
|
||||
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码,默认一个inode表格128字节,一个block记录消耗4B,记录满了后会新建inode用于扩展。
|
||||
- 该文件的访问权限(read、write、execute);
|
||||
- 该文件的所有者与所属组(owner、group);
|
||||
- 该文件的大小(size);
|
||||
- 该文件的创建或内容修改时间(ctime);
|
||||
- 该文件的最后一次访问时间(atime);
|
||||
- 该文件的修改时间(mtime);
|
||||
- 文件的特殊权限(SUID、SGID、SBIT);
|
||||
- 该文件的真实数据地址(point)。
|
||||
- block:用于存储数据
|
||||
|
||||
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。
|
||||
|
||||

|
||||
|
||||
## mkfs工具
|
||||
|
||||
Linux mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。
|
||||
|
||||
**格式:**
|
||||
|
||||
```bash
|
||||
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
|
||||
```
|
||||
|
||||
选项:
|
||||
|
||||
- device : 预备检查的硬盘分区,例如:/dev/nvme0n1p1
|
||||
- -V : 详细显示模式
|
||||
- -c : 在制做档案系统前,检查该partition 是否有坏轨
|
||||
- -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
|
||||
- block : 给定 block 的大小
|
||||
|
||||
**实例:使用parted分区,然后使用mkfs创建ext4文件系统**
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# parted /dev/nvme0n3 mklabel gpt
|
||||
[root@localhost ~]# parted /dev/nvme0n3 mkpart primary 1 1G
|
||||
Information: You may need to update /etc/fstab.
|
||||
[root@localhost ~]# parted /dev/nvme0n3 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n3: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 1000MB 999MB primary
|
||||
|
||||
[root@localhost ~]# mkfs.ext4 /dev/nvme0n3p1
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 243968 4k blocks and 61056 inodes
|
||||
Filesystem UUID: db15a3c8-ae5d-4e69-aa93-cc0ee4107547
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (4096 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# parted /dev/nvme0n3 print
|
||||
Model: VMware Virtual NVMe Disk (nvme)
|
||||
Disk /dev/nvme0n3: 5369MB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: gpt
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size File system Name Flags
|
||||
1 1049kB 1000MB 999MB ext4 primary
|
||||
```
|
||||
|
||||
## mount挂载
|
||||
|
||||
挂载文件系统`mount 文件系统 挂载目录`
|
||||
|
||||
mount命令中的参数以及作用
|
||||
|
||||
| 参数 | 作用 |
|
||||
| ---- | ------------------------------------ |
|
||||
| -a | 挂载所有在/etc/fstab中定义的文件系统 |
|
||||
| -t | 指定文件系统的类型 |
|
||||
|
||||
临时挂载文件系统
|
||||
|
||||
系统在重启后挂载就会失效
|
||||
|
||||
```bash
|
||||
[root@node-1 ~]# mkdir backup
|
||||
[root@node-1 ~]# mount /dev/sda2 /root/backup
|
||||
```
|
||||
|
||||
如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”,写入到/etc/fstab文件中。
|
||||
|
||||
用于挂载信息的指定填写格式中,各字段所表示的意义
|
||||
|
||||
| 字段 | 意义 |
|
||||
| -------- | ------------------------------------------------------------ |
|
||||
| 设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) |
|
||||
| 挂载目录 | 指定要挂载到的目录,需在挂载前创建好 |
|
||||
| 格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 |
|
||||
| 权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async |
|
||||
| 是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 |
|
||||
| 是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 |
|
||||
|
||||
- 实例,挂载分区`/dev/sdb1`到`/mnt/volume1`下,并且设置为永久自动挂载
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkdir -p /mnt/volume1
|
||||
[root@localhost ~]# mount /dev/sdb1 /mnt/volume1
|
||||
[root@localhost ~]# df -h
|
||||
文件系统 容量 已用 可用 已用% 挂载点
|
||||
/dev/mapper/centos-root 47G 995M 46G 3% /
|
||||
devtmpfs 979M 0 979M 0% /dev
|
||||
tmpfs 991M 0 991M 0% /dev/shm
|
||||
tmpfs 991M 8.5M 982M 1% /run
|
||||
tmpfs 991M 0 991M 0% /sys/fs/cgroup
|
||||
/dev/sda1 1014M 133M 882M 14% /boot
|
||||
tmpfs 199M 0 199M 0% /run/user/0
|
||||
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
|
||||
# 先卸载sdb1
|
||||
[root@localhost ~]# umount /dev/sdb1
|
||||
[root@localhost ~]# vim /etc/fstab
|
||||
# 最后一行加上
|
||||
/dev/sdb1 /mnt/volume1 ext4 defaults 0 0
|
||||
|
||||
[root@localhost ~]# mount -a
|
||||
# 测试是否正确配置,fstab上的设备挂一遍试试看,万一错了重启系统会失败。
|
||||
[root@localhost ~]# df -h
|
||||
文件系统 容量 已用 可用 已用% 挂载点
|
||||
/dev/mapper/centos-root 47G 995M 46G 3% /
|
||||
devtmpfs 979M 0 979M 0% /dev
|
||||
tmpfs 991M 0 991M 0% /dev/shm
|
||||
tmpfs 991M 8.5M 982M 1% /run
|
||||
tmpfs 991M 0 991M 0% /sys/fs/cgroup
|
||||
/dev/sda1 1014M 133M 882M 14% /boot
|
||||
tmpfs 199M 0 199M 0% /run/user/0
|
||||
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
|
||||
```
|
||||
|
||||
## umount
|
||||
|
||||
撤销已经挂载的设备文件`umount [挂载点/设备文件]`
|
||||
|
||||
```bash
|
||||
[root@node-1 ~]# umount /dev/sda2
|
||||
```
|
||||
|
||||
挂载实验:
|
||||
|
||||
```shell
|
||||
#进行了格式化后
|
||||
#[root@localhost ~]# mkfs.ext4 /dev/sdb1
|
||||
#未挂载sdb1前,此时file0创建在sda1上
|
||||
[root@localhost ~]# mkdir /mnt/disk1
|
||||
[root@localhost ~]# touch /mnt/disk1/file0
|
||||
[root@localhost ~]# ll /mnt/disk1/
|
||||
-rw-r--r-- 1 root root 0 6月 9 19:44 file0
|
||||
#挂载sdb1,file0消失
|
||||
[root@localhost ~]# mount /dev/sdb1 /mnt/disk1/
|
||||
[root@localhost ~]# ll /mnt/disk1/
|
||||
drwx------ 2 root root 16384 6月 9 19:42 lost+found
|
||||
#此时file0创建在sda1
|
||||
[root@localhost ~]# touch /mnt/disk1/file1
|
||||
[root@localhost ~]# ll /mnt/disk1/
|
||||
-rw-r--r-- 1 root root 0 6月 9 19:48 file1
|
||||
drwx------ 2 root root 16384 6月 9 19:42 lost+found
|
||||
#卸载sdb1,file1消失,file0出现
|
||||
[root@localhost ~]# umount /dev/sdb1
|
||||
[root@localhost ~]# ll /mnt/disk1/
|
||||
-rw-r--r-- 1 root root 0 6月 9 19:44 file0
|
||||
```
|
||||
|
||||
## df
|
||||
|
||||
用于显示文件系统的磁盘空间使用情况
|
||||
|
||||
`df [选项]`
|
||||
|
||||
常用选项
|
||||
|
||||
- `-h`:以人类可读的格式显示磁盘空间,使用K、M、G等单位。
|
||||
- `-T`:显示文件系统类型。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# df -h
|
||||
文件系统 容量 已用 可用 已用% 挂载点
|
||||
/dev/mapper/centos-root 47G 995M 46G 3% /
|
||||
devtmpfs 979M 0 979M 0% /dev
|
||||
tmpfs 991M 0 991M 0% /dev/shm
|
||||
tmpfs 991M 8.5M 982M 1% /run
|
||||
tmpfs 991M 0 991M 0% /sys/fs/cgroup
|
||||
/dev/sda1 1014M 133M 882M 14% /boot
|
||||
tmpfs 199M 0 199M 0% /run/user/0
|
||||
/dev/sdb1 9.1G 37M 8.6G 1% /mnt/volume1
|
||||
```
|
||||
|
||||
## du
|
||||
|
||||
查看某个目录下文件数据的占用量
|
||||
|
||||
`du [选项] [文件]`
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# du -sh /etc
|
||||
23M /etc
|
||||
```
|
||||
|
||||
# 添加交换分区
|
||||
|
||||
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术
|
||||
|
||||
在生产环境中,交换分区的大小一般为真实物理内存的1.5~2倍
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkswap /dev/nvme0n2p1
|
||||
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
|
||||
no label, UUID=9d5158b3-9a30-4a0a-8167-7ee1bc9ce4f8
|
||||
[root@localhost ~]# free -h
|
||||
total used free shared buff/cache available
|
||||
Mem: 1.7Gi 448Mi 1.2Gi 6.0Mi 201Mi 1.3Gi
|
||||
Swap: 2.0Gi 0B 2.0Gi
|
||||
[root@localhost ~]# swapon /dev/nvme0n2p1 # 挂载swap交换分区
|
||||
[root@localhost ~]# vim /etc/fstab # 写入fstab文件中永久挂载
|
||||
#
|
||||
# /etc/fstab
|
||||
# Created by anaconda on Sat Nov 9 02:51:16 2024
|
||||
#
|
||||
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
|
||||
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
|
||||
#
|
||||
# After editing this file, run 'systemctl daemon-reload' to update systemd
|
||||
# units generated from this file.
|
||||
#
|
||||
/dev/mapper/rl-root / xfs defaults 0 0
|
||||
UUID=12fcea99-d1db-4f0a-ad86-f03129024fdb /boot xfs defaults 0 0
|
||||
/dev/mapper/rl-swap none swap defaults 0 0
|
||||
/dev/nvme0n2p1 swap swap defaults 0 0
|
||||
|
||||
[root@localhost ~]# free -h
|
||||
total used free shared buff/cache available
|
||||
Mem: 1.7Gi 451Mi 1.2Gi 6.0Mi 205Mi 1.3Gi
|
||||
Swap: 3.0Gi 0B 3.0Gi
|
||||
```
|
||||
|
||||
# 磁盘容量配额
|
||||
|
||||
简单理解就是可以通过磁盘配额限制某个用户能够使用多大的空间
|
||||
|
||||
## quota
|
||||
|
||||
### 实例切入
|
||||
|
||||
描述:
|
||||
|
||||
- 创建5个用户user1,user2,user3,user4,user5,密码和用户名相同,初始组为usergrp组。
|
||||
- 5个用户都可以取得300M的磁盘使用空间,文件数量不限。超过250M,给于提示。
|
||||
|
||||
### 准备磁盘
|
||||
|
||||
- 创建分区
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# fdisk /dev/nvme0n2
|
||||
|
||||
Welcome to fdisk (util-linux 2.37.4).
|
||||
Changes will remain in memory only, until you decide to write them.
|
||||
Be careful before using the write command.
|
||||
|
||||
Device does not contain a recognized partition table.
|
||||
Created a new DOS disklabel with disk identifier 0x27819a3d.
|
||||
|
||||
Command (m for help): n
|
||||
Partition type
|
||||
p primary (0 primary, 0 extended, 4 free)
|
||||
e extended (container for logical partitions)
|
||||
Select (default p):
|
||||
|
||||
Using default response p.
|
||||
Partition number (1-4, default 1):
|
||||
First sector (2048-10485759, default 2048):
|
||||
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485759, default 10485759): +2G
|
||||
|
||||
Created a new partition 1 of type 'Linux' and of size 2 GiB.
|
||||
|
||||
Command (m for help): p
|
||||
Disk /dev/nvme0n2: 5 GiB, 5368709120 bytes, 10485760 sectors
|
||||
Disk model: VMware Virtual NVMe Disk
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disklabel type: dos
|
||||
Disk identifier: 0x27819a3d
|
||||
|
||||
Device Boot Start End Sectors Size Id Type
|
||||
/dev/nvme0n2p1 2048 4196351 4194304 2G 83 Linux
|
||||
|
||||
Command (m for help): w
|
||||
The partition table has been altered.
|
||||
Calling ioctl() to re-read partition table.
|
||||
Syncing disks.
|
||||
```
|
||||
|
||||
- lsblk 查看当前分区情况
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─nvme0n2p1 259:8 0 2G 0 part
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
```
|
||||
|
||||
- 格式化分区的文件系统
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkfs.ext4 /dev/nvme0n2p1
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 524288 4k blocks and 131072 inodes
|
||||
Filesystem UUID: da4f8f5c-6867-4cf8-8486-333a16adbcdb
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
```
|
||||
|
||||
- 创建目录并挂载
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkdir /mnt/mountpoint
|
||||
[root@localhost ~]# mount /dev/nvme0n2p1 /mnt/mountpoint
|
||||
[root@localhost ~]# df -Th
|
||||
Filesystem Type Size Used Avail Use% Mounted on
|
||||
devtmpfs devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root xfs 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 xfs 960M 261M 700M 28% /boot
|
||||
tmpfs tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/nvme0n2p1 ext4 2.0G 24K 1.8G 1% /mnt/mountpoint
|
||||
```
|
||||
|
||||
### 准备用户
|
||||
|
||||
```bash
|
||||
[root@atopos ~]# setenforce 0
|
||||
# 临时关闭SELinux
|
||||
[root@atopos ~]# getenforce
|
||||
Permissive
|
||||
[root@atopos ~]# groupadd usergrp
|
||||
[root@atopos ~]# for i in {1..5}; do useradd -g usergrp -b /mnt/mountpoint user$i; done
|
||||
```
|
||||
|
||||
### 确保文件系统支持
|
||||
|
||||
- 检查挂载点是否支持quota配置
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mount | grep mountpoint
|
||||
/dev/nvme0n2p1 on /mnt/mountpoint type ext4 (rw,relatime,seclabel)
|
||||
```
|
||||
|
||||
- 重新挂载,让文件系统支持quota配置
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mount -o remount,usrquota,grpquota /mnt/mountpoint/
|
||||
[root@localhost ~]# mount | grep mountpoint
|
||||
/dev/nvme0n2p1 on /mnt/mountpoint type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota)
|
||||
```
|
||||
|
||||
### 安装 quota
|
||||
|
||||
- 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
|
||||
- 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
|
||||
|
||||
quotacheck主要参数
|
||||
|
||||
- -a:扫描所有在/etc/mtab内含有quota参数的文件系统
|
||||
- -u:针对用户扫描文件与目录的使用情况,会新建一个aquota.user文件
|
||||
- -g:针对用户组扫描文件与目录的使用情况,会新增一个aquota.group文件
|
||||
- -v:显示扫描过程的信息
|
||||
|
||||
```bash
|
||||
[root@atopos ~]# yum install -y quota
|
||||
```
|
||||
|
||||
### 开启 quota
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# quotacheck -avug
|
||||
quotacheck: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
|
||||
quotacheck: Scanning /dev/nvme0n2p1 [/mnt/mountpoint] done
|
||||
quotacheck: Cannot stat old user quota file /mnt/mountpoint/aquota.user: No such file or directory. Usage will not be subtracted.
|
||||
quotacheck: Cannot stat old group quota file /mnt/mountpoint/aquota.group: No such file or directory. Usage will not be subtracted.
|
||||
quotacheck: Cannot stat old user quota file /mnt/mountpoint/aquota.user: No such file or directory. Usage will not be subtracted.
|
||||
quotacheck: Cannot stat old group quota file /mnt/mountpoint/aquota.group: No such file or directory. Usage will not be subtracted.
|
||||
quotacheck: Checked 8 directories and 15 files
|
||||
quotacheck: Old file not found.
|
||||
quotacheck: Old file not found.
|
||||
[root@localhost ~]# quotaon -avug
|
||||
quotaon: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
|
||||
/dev/nvme0n2p1 [/mnt/mountpoint]: group quotas turned on
|
||||
/dev/nvme0n2p1 [/mnt/mountpoint]: user quotas turned on
|
||||
```
|
||||
|
||||
### 编辑配额配置
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# edquota -u user1
|
||||
```
|
||||
|
||||

|
||||
|
||||
- 可以将针对user1的限制复制给user2
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# edquota -p user1 -u user2
|
||||
```
|
||||
|
||||
- 查看限制情况
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# repquota -as
|
||||
*** Report for user quotas on device /dev/nvme0n2p1
|
||||
Block grace time: 7days; Inode grace time: 7days
|
||||
Space limits File limits
|
||||
User used soft hard grace used soft hard grace
|
||||
----------------------------------------------------------------------
|
||||
root -- 20K 0K 0K 2 0 0
|
||||
user1 -- 16K 245M 293M 4 0 0
|
||||
user2 -- 16K 245M 293M 4 0 0
|
||||
user3 -- 16K 0K 0K 4 0 0
|
||||
user4 -- 16K 0K 0K 4 0 0
|
||||
user5 -- 16K 0K 0K 4 0 0
|
||||
```
|
||||
|
||||
### 测试
|
||||
|
||||
```bash
|
||||
# user1用户测试
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
|
||||
nvme0n2p1: warning, user block quota exceeded.
|
||||
nvme0n2p1: write failed, user block limit reached.
|
||||
dd: error writing 'bigfile': Disk quota exceeded
|
||||
30+0 records in
|
||||
29+0 records out
|
||||
307179520 bytes (307 MB, 293 MiB) copied, 1.1834 s, 260 MB/s
|
||||
[user1@localhost ~]$ du -sh
|
||||
293M .
|
||||
|
||||
# user2用户测试
|
||||
[root@localhost ~]# su - user2
|
||||
[user2@localhost ~]$ dd if=/dev/zero of=bigfile bs=10M count=50
|
||||
nvme0n2p1: warning, user block quota exceeded.
|
||||
nvme0n2p1: write failed, user block limit reached.
|
||||
dd: error writing 'bigfile': Disk quota exceeded
|
||||
30+0 records in
|
||||
29+0 records out
|
||||
307183616 bytes (307 MB, 293 MiB) copied, 1.43269 s, 214 MB/s
|
||||
[user2@localhost ~]$ du -sh
|
||||
293M .
|
||||
```
|
||||
|
||||
### quota 命令
|
||||
|
||||
Linux quota命令用于显示磁盘已使用的空间与限制。
|
||||
|
||||
执行quota指令,可查询磁盘空间的限制,并得知已使用多少空间
|
||||
|
||||
选项:
|
||||
|
||||
- -g 列出群组的磁盘空间限制。
|
||||
- -q 简明列表,只列出超过限制的部分。
|
||||
- -u 列出用户的磁盘空间限制。
|
||||
- -v 显示该用户或群组,在所有挂入系统的存储设备的空间限制。
|
||||
- -V 显示版本信息。
|
||||
|
||||
## xfs_quota
|
||||
|
||||
专门针对XFS文件系统来管理quota磁盘容量配额服务
|
||||
|
||||
`xfs_quota [参数] 配额 文件系统`
|
||||
|
||||
- \-c参数用于以参数的形式设置要执行的命令
|
||||
|
||||
- \-x参数是专家模式
|
||||
|
||||
硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 test' /boot
|
||||
[root@localhost ~]# xfs_quota -x -c report /boot
|
||||
User quota on /boot (/dev/sda1)
|
||||
Blocks
|
||||
User ID Used Soft Hard Warn/Grace
|
||||
---------- --------------------------------------------------
|
||||
root 115516 0 0 00 [--------]
|
||||
test 0 3072 6144 00 [--------]
|
||||
```
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# su - test
|
||||
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
|
||||
1+0 records in
|
||||
1+0 records out
|
||||
5242880 bytes (5.2 MB) copied, 0.00350676 s, 1.5 GB/s
|
||||
[test@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
|
||||
dd: error writing ‘/boot/tom’: Disk quota exceeded
|
||||
1+0 records in
|
||||
0+0 records out
|
||||
4194304 bytes (4.2 MB) copied, 0.00760235 s, 552 MB/s
|
||||
```
|
||||
|
||||
# 软硬方式链接
|
||||
|
||||
在Linux系统中存在硬链接和软连接两种文件。
|
||||
|
||||
- 硬链接(hard link):
|
||||
- 可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
|
||||
- 软链接(也称为符号链接[symbolic link]):
|
||||
- 仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。
|
||||
|
||||
## ln
|
||||
|
||||
用于创建链接文件
|
||||
|
||||
`ln [选项] 目标`
|
||||
|
||||
ln命令中可用的参数以及作用
|
||||
|
||||
| 参数 | 作用 |
|
||||
| ---- | -------------------------------------------------- |
|
||||
| -s | 创建“符号链接”(如果不带-s参数,则默认创建硬链接) |
|
||||
| -f | 强制创建文件或目录的链接 |
|
||||
| -i | 覆盖前先询问 |
|
||||
| -v | 显示创建链接的过程 |
|
||||
|
||||
### 软链接演示
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# echo "hello linux" > testfile
|
||||
[root@localhost ~]# ln -s testfile linkfile # 创建软连接
|
||||
[root@localhost ~]# ll
|
||||
total 8
|
||||
-rw-------. 1 root root 905 Nov 9 10:57 anaconda-ks.cfg
|
||||
lrwxrwxrwx. 1 root root 8 Nov 15 20:41 linkfile -> testfile
|
||||
-rw-r--r--. 1 root root 12 Nov 15 20:40 testfile
|
||||
[root@localhost ~]# cat linkfile
|
||||
hello linux
|
||||
[root@localhost ~]# ls -l linkfile
|
||||
lrwxrwxrwx. 1 root root 8 Nov 15 20:41 linkfile -> testfile
|
||||
[root@localhost ~]# rm -f testfile
|
||||
[root@localhost ~]# cat linkfile
|
||||
cat: linkfile: No such file or directory
|
||||
```
|
||||
|
||||
### 硬链接演示
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# echo "hello linux" > testfile
|
||||
[root@localhost ~]# ln testfile linkfile
|
||||
[root@localhost ~]# cat linkfile
|
||||
hello linux
|
||||
[root@localhost ~]# ls -l linkfile
|
||||
-rw-r--r--. 2 root root 12 Nov 15 20:42 linkfile
|
||||
[root@localhost ~]# rm -f testfile
|
||||
[root@localhost ~]# cat linkfile
|
||||
hello linux
|
||||
```
|
||||
|
BIN
Linux基础/存储管理/MBR分区表.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
Linux基础/存储管理/gpt分区表.png
Normal file
After Width: | Height: | Size: 262 KiB |
BIN
Linux基础/存储管理/分区操作.gif
Normal file
After Width: | Height: | Size: 854 KiB |
BIN
Linux基础/存储管理/分区演示.png
Normal file
After Width: | Height: | Size: 98 KiB |
BIN
Linux基础/存储管理/固态硬盘ssd.png
Normal file
After Width: | Height: | Size: 182 KiB |
BIN
Linux基础/存储管理/固态硬盘设计1.png
Normal file
After Width: | Height: | Size: 528 KiB |
BIN
Linux基础/存储管理/固态硬盘设计2.png
Normal file
After Width: | Height: | Size: 773 KiB |
BIN
Linux基础/存储管理/固态硬盘设计3.png
Normal file
After Width: | Height: | Size: 146 KiB |
BIN
Linux基础/存储管理/日志文件系统1.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
Linux基础/存储管理/日志文件系统2.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
Linux基础/存储管理/机械硬盘hdd.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
Linux基础/存储管理/磁盘容量配额1.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
Linux基础/存储管理/虚拟文件接口.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Linux基础/存储管理/设备命名规则.png
Normal file
After Width: | Height: | Size: 19 KiB |
272
Linux基础/文件基本属性与文件查找.md
Normal file
@@ -0,0 +1,272 @@
|
||||
# 文件时间
|
||||
|
||||
任何一个操作系统都有时间的概念,时间的概念主要用于对文件和系统中发生的时间进行记录,在 Linux 中,可以使用 stat 查看 Linux 系统中文件的时间。
|
||||
|
||||
## stat
|
||||
|
||||
用于显示文件时间和 inode 内容,inode相关的知识会在后面的磁盘管理章节详细讲解,这边主要来看文件的时间
|
||||
|
||||
```shell
|
||||
stat [选项]... 文件...
|
||||
```
|
||||
|
||||
**案例演示**
|
||||
|
||||
stat查看文件时间,这边为了我们方便看得懂,建议改为英文系统环境
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# export LANG="en_US.UTF-8"
|
||||
# 改回中文是LANG="zh_CN.UTF-8"
|
||||
[root@localhost ~]# stat anaconda-ks.cfg
|
||||
File: ‘anaconda-ks.cfg’
|
||||
Size: 1241 Blocks: 8 IO Block: 4096 regular file
|
||||
Device: fd00h/64768d Inode: 33574979 Links: 1
|
||||
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
|
||||
Context: system_u:object_r:admin_home_t:s0
|
||||
Access: 2021-04-04 17:54:09.700844151 +0800
|
||||
Modify: 2021-04-04 16:53:30.524854041 +0800
|
||||
Change: 2021-04-04 16:53:30.524854041 +0800
|
||||
Birth: -
|
||||
```
|
||||
|
||||
- **Access:访问时间,也叫 atime**
|
||||
- 当文件被访问的时候,这个时间就会发生改变
|
||||
- Linux文件运行的时候查看文件又频繁数量又大,如果每次 atime 发生变化的时候都记入硬盘,或造成很大的压力。必须满足其中一个条件:
|
||||
- 自上次 atime 修改后,已达到 86400 秒
|
||||
- 发生写操作时
|
||||
- **Modify:修改时间,也叫 mtime**
|
||||
- 当文件内容发生变化的时候,这个时间就会发生改变
|
||||
- **Change:改变时间,也叫 ctime**
|
||||
- 当文件状态被改变的时候,这个时间就会发生修改
|
||||
|
||||
# 文件类型
|
||||
|
||||
Linux 系统和 Windows 系统有很大的区别,Windows 系统查看文件的后缀名就可以知道这个是什么类型的文件,比如:`test.jpg` 这个是一个图片,如果你在 Windows 上双击打开,就会使用支持查看图片的软件打开。
|
||||
|
||||
Linux 系统就根本不看文件的后缀名,你认为这个是什么文件,你就使用什么工具打开这个文件,如果打开错误,就会报错,看下面的案例
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# cat file
|
||||
cat: file: Is a directory
|
||||
```
|
||||
|
||||
当你以为 file 是个文件,使用 cat 命令查看的时候,cat 会提示你这个是个文件夹,你才反应过来,应该使用 cd 命令打开。
|
||||
所以在 Linux 中,我们需要使用和 windows 不一样的方法来判断这个文件的类型。
|
||||
|
||||
## 方式一:ls
|
||||
|
||||
通过 `ls -l` 查看第一个字母:
|
||||
|
||||
| 标识符 | 文件类型 |
|
||||
| `-` | 普通文件(文本文档,二进制文件,压缩文件,电影,图片等等)|
|
||||
| `d` | 目录文件 |
|
||||
| `b` | 块设备文件(块设备)存储设备硬盘,U盘 `/dev/sda` 和 `/dev/sda1` |
|
||||
| `c` | 字符设备文件(字符设备)打印机,终端 `/dev/tty1` 和 `/dev/zero` |
|
||||
| `s` | 套接字文件 |
|
||||
| `p` | 管道文件 |
|
||||
| `l` | 链接文件 |
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# type ll
|
||||
[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/nvme0n1 /dev/tty1 /etc/grub2.cfg /dev/log
|
||||
-rwxr-xr-x. 1 root root 140872 4月 21 2024 /bin/ls
|
||||
lrwxrwxrwx. 1 root root 28 11月 8 21:42 /dev/log -> /run/systemd/journal/dev-log
|
||||
brw-rw----. 1 root disk 259, 0 11月 8 21:42 /dev/nvme0n1
|
||||
crw--w----. 1 root tty 4, 1 11月 8 21:42 /dev/tty1
|
||||
lrwxrwxrwx. 1 root root 22 9月 5 03:00 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
|
||||
-rw-r--r--. 1 root root 158 6月 23 2020 /etc/hosts
|
||||
drwxr-xr-x. 10 root root 124 11月 8 09:57 /home
|
||||
```
|
||||
|
||||
对于初学者而言,我们现在只要知道可以通过这样的方式查看文件的类型,并且能够知道 `-` 和 `d` 的意思即可。后面在学习的过程中,会慢慢的将所有文件类型都掌握的。
|
||||
|
||||
## 方法二:file
|
||||
|
||||
file 是专门用来查看文件的类型的命令,有时候也可以使用
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# file /etc/hosts
|
||||
/etc/hosts: ASCII text
|
||||
[root@localhost ~]# file /bin/ls
|
||||
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
|
||||
[root@localhost ~]# file /dev/nvme0n1
|
||||
/dev/nvme0n1: block special (259/0)
|
||||
[root@localhost ~]# file /dev/tty1
|
||||
/dev/tty1: character special
|
||||
[root@localhost ~]# file /etc/grub2.cfg
|
||||
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
|
||||
[root@localhost ~]# file /home
|
||||
/home: directory
|
||||
[root@localhost ~]# file /run/dmeventd-client
|
||||
/run/dmeventd-client: fifo (named pipe)
|
||||
```
|
||||
|
||||
## 方法三:stat
|
||||
|
||||
这个命令上面已经介绍过了,在输出结果中也是可以看到文件的类型
|
||||
|
||||
# 文件查找
|
||||
|
||||
在 windows 中可以在文件管理器中很方便的输入文件名查找文件,然而 Linux 的文件查找功能更加的方便,并且功能更加的强大。
|
||||
|
||||
find 命令实时查找工具,通过遍历指定路径下的文件系统完成文件查找
|
||||
|
||||
工作特点:
|
||||
- 查找速度略慢
|
||||
- 精确查找
|
||||
- 实时查找
|
||||
- 可以满足多种条件匹配
|
||||
|
||||
```shell
|
||||
find [选项] [路径] [查找条件 + 处理动作]
|
||||
查找路径:指定具体目录路径,默认是当前文件夹
|
||||
查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
|
||||
处理动作:对符合条件的文件做什么操作,默认输出屏幕
|
||||
```
|
||||
|
||||
## 查找条件
|
||||
|
||||
根据文件名查找
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -name "ens160.nmconnection"
|
||||
[root@localhost ~]# find /etc -iname "ens160.nmconnection" # 忽略大小写
|
||||
[root@localhost ~]# find /etc -iname "ens*"
|
||||
```
|
||||
|
||||
按文件大小
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -size +5M # 大于5M
|
||||
[root@localhost ~]# find /etc -size 5M # 等于5M
|
||||
[root@localhost ~]# find /etc -size -5M # 小于5M
|
||||
[root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
|
||||
```
|
||||
|
||||
指定查找的目录深度
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find / -maxdepth 3 -a -name "ens160.nmconnection" # 最大查找深度
|
||||
# -a是同时满足,-o是或
|
||||
[root@localhost ~]# find / -mindepth 3 -a -name "ens160.nmconnection" # 最小查找深度
|
||||
```
|
||||
|
||||
按时间找
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天
|
||||
[root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天
|
||||
[root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内
|
||||
```
|
||||
|
||||
按照文件属主、属组找,文件的属主和属组,会在下一篇详细讲解。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /home -user xwz # 属主是xwz的文件
|
||||
[root@localhost ~]# find /home -group xwz
|
||||
[root@localhost ~]# find /home -user xwz -group xwz
|
||||
[root@localhost ~]# find /home -user xwz -a -group root
|
||||
[root@localhost ~]# find /home -user xwz -o -group root
|
||||
[root@localhost ~]# find /home -nouser # 没有属主的文件
|
||||
[root@localhost ~]# find /home -nogroup # 没有属组的文件
|
||||
```
|
||||
|
||||
按文件类型
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /dev -type d
|
||||
```
|
||||
|
||||
按文件权限,文件权限会在下一篇详细讲解
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find / -perm 644 -ls
|
||||
[root@localhost ~]# find / -perm -644 -ls # 权限大于等于/包含644的
|
||||
```
|
||||
|
||||
按正则表达式
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -regex '.*ens[0-9][0-9][0-9].*'
|
||||
# .* 任意多个字符
|
||||
# [0-9] 任意一个数字
|
||||
```
|
||||
|
||||
* 条件组合
|
||||
* **-a**:多个条件and并列
|
||||
* **-o**:多个条件or并列
|
||||
* **-not**:条件取反
|
||||
|
||||
## 处理动作
|
||||
|
||||
| 动作 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `‐print` | 默认的处理动作,显示至屏幕 |
|
||||
| `-ls` | 对查找到的文件执行 `ls ‐l` 命令 |
|
||||
| `-delete` | 删除查找到的文件 |
|
||||
| `-fls /path/to/filename` | 查找到的所有文件的长格式信息保存至指定文件中 |
|
||||
| `{}` | 用于引用查找到的文件名称自身 |
|
||||
| `-exec` | 允许对找到的每个文件执行一个命令|
|
||||
|
||||
下面的相关案例大家学习完后续用户权限管理之后,就可以完全看的懂了
|
||||
|
||||
## 相关案例
|
||||
|
||||
- 查找到root目录下面以.log结尾的文件,并且复制到/home/dir1中
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /root -name "*.log" -exec mv {} /home/dir1 \;
|
||||
```
|
||||
|
||||
* 查找/var目录下属主为root,且属组为mail的所有文件或目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /var -user root -group mail
|
||||
```
|
||||
|
||||
* 查找/usr目录下不属于root,bin或ftp用户的所有文件或目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /usr -not -user root -a -not -user bin -a -not -user ftp
|
||||
[root@localhost ~]# find /usr -not \( -user root -o -user bin -o -user ftp \)
|
||||
```
|
||||
|
||||
* 查找/etc目录下最近一周内容曾被修改过的文件或目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -mtime -7
|
||||
```
|
||||
|
||||
* 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find / \( -nouser -o -nogroup \) -a -atime -7
|
||||
```
|
||||
|
||||
* 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -size +1M -type f
|
||||
```
|
||||
|
||||
* 查找/etc目录下所有用户都没有写权限的文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -not -perm /222
|
||||
```
|
||||
|
||||
* 查找/etc目录下至少一类用户没有执行权限的文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc -not -perm -111
|
||||
```
|
||||
|
||||
* 查找/etc/init.d目录下,所有用户都有执行权限,且其它用户写权限的文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# find /etc/init.d -perm -113
|
||||
```
|
543
Linux基础/文件权限管理.md
Normal file
@@ -0,0 +1,543 @@
|
||||
# 文件权限
|
||||
|
||||
文件权限设置:可以赋予某个用户或组,能够以何种方式,访问某个文件
|
||||
|
||||
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
|
||||
|
||||
为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
|
||||
|
||||
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:
|
||||
|
||||
* chown (change ownerp) : 修改所属用户与组。
|
||||
* chmod (change mode) : 修改用户的权限。
|
||||
|
||||
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组
|
||||
|
||||

|
||||
|
||||
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
|
||||
|
||||

|
||||
|
||||
从左至右用 0-9 这些数字来表示。
|
||||
|
||||
* 第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
|
||||
* 第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
|
||||
* 其中,第 1、4、7 位表示读权限,如果用`r`字符表示,则有读权限,如果用`-`字符表示,则没有读权限;
|
||||
* 第 2、5、8 位表示写权限,如果用`w`字符表示,则有写权限,如果用`-`字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用`x`字符表示,则有执行权限,如果用`-`字符表示,则没有执行权限。
|
||||
|
||||
# 修改文件属主chown
|
||||
|
||||
chown用于设置文件所有者和文件关联组的命令
|
||||
|
||||
chown 需要超级用户`root`的权限才能执行此命令
|
||||
|
||||
```shell
|
||||
chown [选项]... [所有者][:[组]] 文件...
|
||||
```
|
||||
|
||||
## 选项
|
||||
|
||||
* **-R**: 处理指定目录以及其子目录下的所有文件
|
||||
* **-v**: 显示详细的处理信息
|
||||
|
||||
## 实例
|
||||
|
||||
* 设置所有者为root
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chown root anaconda-ks.cfg
|
||||
```
|
||||
|
||||
* 将文件的拥有者设置为user01,允许使用的组设置为it
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chown user01:it file.txt
|
||||
```
|
||||
|
||||
* 将目录下的所有文件拥有者设置为user01,允许使用的组设置为it
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chown -R user01:it dir/*
|
||||
```
|
||||
|
||||
# 修改文件权限chmod
|
||||
|
||||
chmod是控制用户对文件的权限的命令
|
||||
|
||||
```shell
|
||||
chmod [选项]... 模式[,模式]... 文件...
|
||||
```
|
||||
|
||||
## 模式
|
||||
|
||||
mode : 权限设定字串,格式如下 :
|
||||
|
||||
```shell
|
||||
[ugoa...][[+-=][rwx]...][,...]
|
||||
```
|
||||
|
||||
* `u`表示该文件的拥有者,`g`表示与该文件的拥有者属于同一个群体(group)者,`o`表示其他以外的人,`a`表示这三者皆是。
|
||||
* `+`表示增加权限、`-`表示取消权限、`=`表示唯一设定权限。
|
||||
* `r`表示可读取,`w`表示可写入,`x`表示可执行
|
||||
* `r``w``x`权限对文件和目录的意义
|
||||
|
||||
| 权限 | 对文件的影响 | 对目录的影响 |
|
||||
| :-------- | :------------------- | :--------------------------------------------------------- |
|
||||
| r(读取) | 可以读取文件的内容 | 可以列出目录的内容(文件名),可以使用ls命令 |
|
||||
| w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件,可以使用touch、rm命令 |
|
||||
| x(可执行) | 可以作为命令执行文件 | 可以访问目录的内容(取决于目录中文件的权限),可以使用cd命令 |
|
||||
|
||||
## 八进制语法
|
||||
|
||||
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
|
||||
|
||||
| # | 权限 | rwx | 二进制 |
|
||||
| :--- | :------------- | :--- | :----- |
|
||||
| 7 | 读 + 写 + 执行 | rwx | 111 |
|
||||
| 6 | 读 + 写 | rw- | 110 |
|
||||
| 5 | 读 + 执行 | r-x | 101 |
|
||||
| 4 | 只读 | r-- | 100 |
|
||||
| 3 | 写 + 执行 | -wx | 011 |
|
||||
| 2 | 只写 | -w- | 010 |
|
||||
| 1 | 只执行 | --x | 001 |
|
||||
| 0 | 无 | --- | 000 |
|
||||
|
||||
例如, 765 将这样解释:
|
||||
|
||||
* 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
|
||||
* 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
|
||||
* 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
|
||||
|
||||
## 选项
|
||||
|
||||
* **-f**: 若该文件权限无法被更改也不要显示错误讯息
|
||||
* **-v**: 显示权限变更的详细资料
|
||||
* **-R**: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
|
||||
|
||||
## 实例
|
||||
|
||||
* 限制用户user1对`file`文件的写入
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chmod a-w /home/user1/file
|
||||
[root@localhost ~]# ls -lh /home/user1/file
|
||||
-r--r--r--. 1 user1 user1 0 4月 13 10:56 /home/user1/file
|
||||
[root@localhost ~]# su - user1
|
||||
上一次登录:二 4月 13 10:47:41 CST 2021pts/1 上
|
||||
[user1@localhost ~]$ echo "hello world" >> file
|
||||
-bash: file: 权限不够
|
||||
```
|
||||
|
||||
* 限制所有用户删除dir目录下的文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chmod a-w /home/user1/dir/
|
||||
[root@localhost ~]# ls -lhd /home/user1/dir
|
||||
dr-xr-xr-x. 2 user1 user1 18 4月 13 10:58 /home/user1/dir
|
||||
[root@localhost ~]# su - user1
|
||||
上一次登录:二 4月 13 10:57:11 CST 2021pts/1 上
|
||||
[user1@localhost ~]$ cd dir/
|
||||
[user1@localhost dir]$ rm -rf test
|
||||
rm: 无法删除"test": 权限不够
|
||||
```
|
||||
|
||||
# 文件访问控制列表
|
||||
|
||||
文件访问控制列表(Access Control Lists,ACL)是Linux开的一套新的文件系统权限管理方法。
|
||||
|
||||
传统的Linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。
|
||||
|
||||
文件访问控制列表可以针对文件单独设置某个用户或者用户组队文件的管理权限。
|
||||
|
||||
## getfacl命名
|
||||
|
||||
获取文件访问控制列表的详细内容
|
||||
|
||||
```shell
|
||||
getfacl [-aceEsRLPtpndvh] file ...
|
||||
```
|
||||
|
||||
### 选项
|
||||
|
||||
* **-a**:仅显示文件访问控制列表
|
||||
* **-d**:仅显示默认的访问控制列表
|
||||
* **-c**:不显示注释表头
|
||||
* **-e**:显示所有的有效权限
|
||||
* **-E**:显示无效权限
|
||||
* **-R**:递归显示子目录
|
||||
* **-t**:使用制表符分隔的输出格式
|
||||
|
||||
### 实例
|
||||
|
||||
* 查看acl权限列表
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# getfacl anaconda-ks.cfg
|
||||
# file: anaconda-ks.cfg
|
||||
# owner: root
|
||||
# group: root
|
||||
user::rwx
|
||||
group::r-x
|
||||
other::r-x
|
||||
```
|
||||
|
||||
* 查看acl权限列表,不显示注释表头
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# getfacl -c anaconda-ks.cfg
|
||||
user::rwx
|
||||
group::r-x
|
||||
other::r-x
|
||||
```
|
||||
|
||||
## setfacl命令
|
||||
|
||||
用来设置更精确的文件权限
|
||||
|
||||
```shell
|
||||
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
|
||||
```
|
||||
|
||||
### 选项
|
||||
|
||||
* **-m**:更改文件的访问控制列表
|
||||
* **-M**:从文件读取访问控制列表条目更改
|
||||
* **-x**:根据文件中访问控制列表移除条目
|
||||
* **-X**:从文件读取访问控制列表条目并删除
|
||||
* **-b**:删除所有扩展访问控制列表条目
|
||||
* **-k**:移除默认访问控制列表
|
||||
* **-d**:应用到默认访问控制列表的操作
|
||||
* **-R**:递归操作子目录
|
||||
|
||||
### 实例
|
||||
|
||||
* 给指定用户添加acl权限
|
||||
* 首先用户user1是没有`/workdir`的权限的
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# groupadd worker
|
||||
[root@localhost ~]# mkdir /workdir
|
||||
[root@localhost ~]# chown root:worker /workdir
|
||||
[root@localhost ~]# chmod 770 /workdir # 不允许其他用户对目录的权限
|
||||
[root@localhost ~]# ll -d /workdir/
|
||||
drwxrwx---. 2 root worker 6 4月 14 09:14 /workdir/
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ cd /workdir/
|
||||
-bash: cd: /workdir/: 权限不够
|
||||
```
|
||||
|
||||
* 单独给予user1的可读和可进入权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# setfacl -m u:user1:rx /workdir/
|
||||
[root@localhost ~]# getfacl -c /workdir
|
||||
user::rwx
|
||||
user:user1:r-x # 成功添加user1对workdir的权限
|
||||
group::rwx
|
||||
mask::rwx
|
||||
other::---
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ cd /workdir/
|
||||
[user1@localhost workdir]$ ll -d
|
||||
drwxrwx---+ 2 root worker 6 4月 14 09:14 . # 权限位后面多了一个"+",表示存在ACL权限
|
||||
[user1@localhost workdir]$ touch file
|
||||
touch: 无法创建"file": 权限不够
|
||||
```
|
||||
|
||||
* 移除user1的访问控制列表权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# setfacl -x u:user1 /workdir/
|
||||
[root@localhost ~]# getfacl -c /workdir/
|
||||
user::rwx
|
||||
group::rwx
|
||||
mask::rwx
|
||||
other::---
|
||||
```
|
||||
|
||||
* 创建worker2组,然后给这个组访问acl的权限,将user1加入worker2组验证是否成功
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# groupadd worker2
|
||||
[root@localhost ~]# setfacl -m g:worker2:rwx /workdir
|
||||
[root@localhost ~]# usermod -aG worker2 user1
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ cd /workdir/
|
||||
[user1@localhost workdir]$ touch file
|
||||
```
|
||||
|
||||
* 对workdir设置的acl权限并不会被之后在workdir下创建的子文件和子目录继承,可以设置默认ACL权限,来让目录下面的新建文件和文件夹都继承父目录的权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# setfacl -b /workdir
|
||||
[root@localhost ~]# setfacl -m d:u:user1:rx /workdir
|
||||
# 在前面加上一个d,就可以设置默认facl权限
|
||||
[root@localhost ~]# getfacl -c /workdir
|
||||
user::rwx
|
||||
group::rwx
|
||||
other::---
|
||||
default:user::rwx # 前面多出来了default
|
||||
default:user:user1:r-x
|
||||
default:group::rwx
|
||||
default:mask::rwx
|
||||
default:other::---
|
||||
[root@localhost ~]# touch /workdir/newfile
|
||||
[root@localhost ~]# getfacl -c /workdir/newfile
|
||||
user::rw-
|
||||
user:user1:r-x #effective:r-- # 新建的文件会自动继承
|
||||
group::rwx #effective:rw-
|
||||
mask::rw-
|
||||
other::---
|
||||
```
|
||||
|
||||
# mask有效权限
|
||||
|
||||
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
|
||||
|
||||
注意上面的案例,在newfile的facl中,有一个mask权限是`rw-`,所以我们即使给了user1`r-x`权限,在实际生效的时候,`x`也不会有的,注意后面的提示`#effective:r--`表示`x`权限并没有赋予。
|
||||
|
||||
## 实例
|
||||
|
||||
* 修改上面案例中的newfile的mask权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# setfacl -m m::rwx /workdir/newfile
|
||||
[root@localhost ~]# getfacl -c /workdir/newfile
|
||||
user::rw-
|
||||
user:user1:r-x
|
||||
group::rwx
|
||||
mask::rwx
|
||||
other::---
|
||||
```
|
||||
|
||||
# 特殊权限
|
||||
|
||||
文件除了上述的`r`,`w`,`x`权限以外,还有三个特殊权限:suid,sgid,sticky
|
||||
|
||||
## suid
|
||||
|
||||
suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加suid权限,则会显示大写S,属于无效。
|
||||
|
||||
普通用户能够执行`passwd`命令修改自己的密码,修改密码其实就是修改`/etc/shadow`这个文件,查看`/etc/passwd`这个文件的权限,发现除了`root`其他人没有写权限,但是普通用户能够成功执行`passwd`,其原因就在于`passwd`这个命令的权限是`-rwsr-xr-x`,其中`s`的作用就是让执行命令的人具有和该命令拥有者相同的权限。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# ll /usr/bin/passwd
|
||||
-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
|
||||
```
|
||||
|
||||
### 实例
|
||||
|
||||
* 切换成普通用户输入修改密码命令
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ passwd
|
||||
更改用户 user1 的密码 。
|
||||
为 user1 更改 STRESS 密码。
|
||||
(当前)UNIX 密码:
|
||||
```
|
||||
|
||||
* 保持这个会话别端口,新建一个ssh会话,查看系统进程,可以看到当前是调用root用户执行的passwd命令
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# ps -aux |grep passwd
|
||||
root 2031 0.0 0.3 14904 6656 pts/2 S+ 22:30 0:00 passwd
|
||||
root 2034 0.0 0.1 3876 2048 pts/1 S+ 22:31 0:00 grep --color=auto passwd
|
||||
```
|
||||
|
||||
* 如果想某个文件添加suid权限,可以输入下面两个命令
|
||||
|
||||
```shell
|
||||
chmod u+s file
|
||||
chmod 4765 file
|
||||
```
|
||||
|
||||
要设置特殊权限,可以使用`chmod`命令的4位数字表示法,其中第一位用于特殊权限,后三位分别代表所有者、组和其他用户的权限。特殊权限的设置如下:
|
||||
|
||||
\- `4`: 设置setuid。
|
||||
\- `2`: 设置setgid。
|
||||
\- `1`: 设置sticky bit。
|
||||
|
||||
以下是一些设置特殊权限的例子:
|
||||
|
||||
\- 设置setuid: `chmod u+s file`
|
||||
\- 设置setgid: `chmod g+s file`
|
||||
\- 设置sticky bit: `chmod o+t /dir`
|
||||
|
||||
如果你想要将特殊权限与其他权限组合使用,可以这样:
|
||||
|
||||
\- 设置文件的setuid和可读可执行权限:`chmod 4555 file`
|
||||
\- 设置目录的setgid和可读可执行可进入权限:`chmod 2775 /dir`
|
||||
|
||||
请注意,特殊权限的设置需要谨慎,因为它们可能会影响系统的安全性和文件的访问控制。通常,只有系统管理员或有经验的用户才会设置这些权限。
|
||||
|
||||
## sgid
|
||||
|
||||
sgid 属性可运用于二进制文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加sgid权限,则会显示大写S,属于无效。
|
||||
|
||||
运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如果`/home/user1`目录具有sgid权限,且所属组是`user1`,则任何用户在`/home/user1`下创建的子目录或者文件的所属组都是`user1`。
|
||||
|
||||
### 实例
|
||||
|
||||
* 设置sgid,让用户在workdir下创建的文件都属于worker组
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# mkdir /workdir
|
||||
[root@localhost ~]# groupadd worker
|
||||
[root@localhost ~]# chown .worker /workdir/
|
||||
[root@localhost ~]# ll -d /workdir/
|
||||
drwxr-xr-x. 2 root worker 6 Nov 15 22:42 /workdir/
|
||||
[root@localhost ~]# chmod g+s /workdir/
|
||||
[root@localhost ~]# cd /workdir/
|
||||
[root@localhost workdir]# touch file
|
||||
[root@localhost workdir]# ll
|
||||
total 0
|
||||
-rw-r--r--. 1 root worker 0 Nov 15 22:44 file
|
||||
```
|
||||
|
||||
## sticky
|
||||
|
||||
sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777或者其他。一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)。
|
||||
|
||||
### 实例
|
||||
|
||||
* 设置sticky,让普通用户只能创建文件,不能删除文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# mkdir /workdir
|
||||
[root@localhost ~]# chmod 1777 /workdir/
|
||||
[root@localhost ~]# ll -d /workdir/
|
||||
drwxrwxrwt. 2 root root 6 Nov 15 22:47 /workdir/
|
||||
[root@localhost ~]# su - user1
|
||||
[user1@localhost ~]$ cd /workdir/
|
||||
[user1@localhost workdir]$ touch user1file
|
||||
[user1@localhost workdir]$ exit
|
||||
logout
|
||||
[root@localhost ~]# useradd user2
|
||||
[root@localhost ~]# su - user2
|
||||
[user2@localhost ~]$ cd /workdir/
|
||||
[user2@localhost workdir]$ rm -rf user1file # 不能删除别人的创建的文件
|
||||
rm: cannot remove 'user1file': Operation not permitted
|
||||
[user2@localhost workdir]$ touch user2file
|
||||
[user2@localhost workdir]$ rm -rf user2file # 只能删除自己创建的文件
|
||||
[user2@localhost workdir]$ ll
|
||||
total 0
|
||||
-rw-r--r--. 1 user1 user1 0 Nov 15 22:48 user1file
|
||||
```
|
||||
|
||||
# chattr文件属性
|
||||
|
||||
chattr命令用于改变文件属性。
|
||||
|
||||
这项指令可改变存放在文件或目录属性,这些属性共有以下8种模式:
|
||||
|
||||
* **a**:让文件或目录仅供追加用途
|
||||
* **b**:不更新文件或目录的最后存取时间
|
||||
* **c**:将文件或目录压缩后存放
|
||||
* **i**:不得任意更动文件或目录
|
||||
* **s**:保密性删除文件或目录
|
||||
* **S**:即时更新文件或目录
|
||||
* **u**:预防意外删除
|
||||
|
||||
```shell
|
||||
chattr [-RV][+/-/=<属性>][文件或目录...]
|
||||
```
|
||||
|
||||
## 选项
|
||||
|
||||
* **-R**:递归处理,将指定目录下的所有文件及子目录一并处理
|
||||
* **-v <版本编号>**:设置文件或目录版本
|
||||
* **-V**:显示指令执行过程
|
||||
* **+ <属性>**:开启文件或目录的该项属性
|
||||
* **- <属性>**:关闭文件或目录的该项属性
|
||||
* **= <属性>**:指定文件或目录的该项属性
|
||||
|
||||
## 实例
|
||||
|
||||
* 用chattr命令防止系统中某个关键文件被修改
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chattr +i /etc/resolv.conf
|
||||
[root@localhost ~]# lsattr /etc/resolv.conf
|
||||
----i----------- /etc/resolv.conf
|
||||
[root@localhost ~]# echo test >> /etc/resolv.conf
|
||||
-bash: /etc/resolv.conf: 权限不够
|
||||
```
|
||||
|
||||
* 让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chattr +a /var/log/messages
|
||||
[root@localhost ~]# lsattr /var/log/messages
|
||||
-----a---------- /var/log/messages
|
||||
[root@localhost ~]# echo > /var/log/messages # 不允许清空日志
|
||||
-bash: /var/log/messages: 不允许的操作
|
||||
```
|
||||
|
||||
# umask
|
||||
|
||||
umask命令指定在建立文件时预设的权限掩码,进程、新建文件、目录的默认权限会收到umask的影响,umask表示要减掉得到权限。
|
||||
|
||||
umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
|
||||
|
||||
```shell
|
||||
umask [选项][权限掩码]
|
||||
```
|
||||
|
||||
## 选项
|
||||
|
||||
* **-S**:以文字的方式来表示权限掩码
|
||||
|
||||
## 实例
|
||||
|
||||
* 查看当前用户的umask权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# umask
|
||||
0022
|
||||
```
|
||||
|
||||
* 查看最终有的权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# umask -S
|
||||
u=rwx,g=rx,o=rx
|
||||
```
|
||||
|
||||
* 修改umask的数值(临时)
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# umask 0000
|
||||
[root@localhost ~]# mkdir dir
|
||||
[root@localhost ~]# ll
|
||||
总用量 4
|
||||
drwxrwxrwx. 2 root root 6 4月 14 11:25 dir
|
||||
-rw-rw-rw-. 1 root root 0 4月 14 11:25 file
|
||||
```
|
||||
|
||||
* 修改umask的数值(永久)
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# vim /etc/profile
|
||||
--------------
|
||||
59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
|
||||
60 umask 002
|
||||
61 else
|
||||
62 umask 022
|
||||
63 fi
|
||||
---------------
|
||||
[root@localhost ~]# source /etc/profile # 立即在当前shell中生效
|
||||
```
|
||||
|
||||
* 通过umask决定新建用户`HOME`目录的权限
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# vim /etc/login.defs
|
||||
-----------------
|
||||
61 # The permission mask is initialized to this value. If not specified,
|
||||
62 # the permission mask will be initialized to 022.
|
||||
63 UMASK 077
|
||||
------------------
|
||||
```
|
||||
|
BIN
Linux基础/文件权限管理/文件ugo权限解释.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
Linux基础/文件权限管理/文件权限介绍.png
Normal file
After Width: | Height: | Size: 28 KiB |
526
Linux基础/文件管理.md
Normal file
@@ -0,0 +1,526 @@
|
||||
我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。
|
||||
|
||||
其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
|
||||
|
||||
在开始本教程前我们需要先知道什么是绝对路径与相对路径。
|
||||
|
||||
* 绝对路径
|
||||
* 路径的写法,由根目录`/`写起,例如:`/usr/share/doc`这个目录
|
||||
* 相对路径
|
||||
* 路径的写法,不是由`/`写起,例如由`/usr/share/doc`要到`/usr/share/man`底下时,可以写成:`cd ../man`这就是相对路径的写法。
|
||||
|
||||
# 文件管理命令
|
||||
|
||||
几个常见的处理目录的命令
|
||||
|
||||
* ls(英文全拼:list files): 列出目录及文件名
|
||||
* cd(英文全拼:change directory):切换目录
|
||||
* pwd(英文全拼:print work directory):显示目前的目录
|
||||
* mkdir(英文全拼:make directory):创建一个新的目录
|
||||
* rmdir(英文全拼:remove directory):删除一个空的目录
|
||||
* cp(英文全拼:copy file): 复制文件或目录
|
||||
* rm(英文全拼:remove): 删除文件或目录
|
||||
* mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
|
||||
* touch: 用于创建一个新的文件
|
||||
|
||||
## touch
|
||||
|
||||
创建新文件:用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
|
||||
|
||||
```shell
|
||||
touch 文件名
|
||||
```
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 创建新空白文件
|
||||
[root@localhost ~]# touch newfile
|
||||
```
|
||||
|
||||
## mkdir
|
||||
|
||||
创建新目录
|
||||
|
||||
```shell
|
||||
mkdir [-mpv] 目录名称
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-m` | 配置文件的权限,直接配置,不需要看默认权限 (umask) |
|
||||
| `-p` | 帮助你直接将所需要的目录(包含上一级目录)递归创建起来 |
|
||||
| `-v` | 显示目录创建的过程 |
|
||||
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 创建一个新的文件夹叫dir
|
||||
[root@localhost ~]# mkdir dir
|
||||
# 无法直接创建多层目录
|
||||
[root@localhost ~]# mkdir a/b/c
|
||||
mkdir: 无法创建目录"a/b/c": 没有那个文件或目录
|
||||
# 加上-p选项之后可以自动创建父级目录
|
||||
[root@localhost ~]# mkdir -p a/b/c
|
||||
# 显示详细的创建过程
|
||||
[root@localhost ~]# mkdir -pv dir1/dir2
|
||||
mkdir: 已创建目录 "dir1"
|
||||
mkdir: 已创建目录 "dir1/dir2"
|
||||
|
||||
```
|
||||
|
||||
## cp
|
||||
|
||||
拷贝文件和目录
|
||||
|
||||
```shell
|
||||
cp [选项]... 源文件... 目录
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-a` | 相当于`-pdr `的意思,至于` pdr` 请参考下列说明 |
|
||||
| `-d` | 如果源文件是符号链接,则复制链接本身,而不是链接指向的文件 |
|
||||
| `-f` | 为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次 |
|
||||
| `-i` | 若目标档(destination)已经存在时,在覆盖时会先询问动作的进行 |
|
||||
| `-l` | 复制符号链接指向的文件,而不是链接本身 |
|
||||
| `-p` | 连同文件的属性一起复制过去,保持文件的原始属性(如时间戳、权限等) |
|
||||
| `-r` | 递归持续复制,用於目录的复制行为 |
|
||||
| `-u` | 仅在源文件比目标文件新或目标文件不存在时进行复制 |
|
||||
| `-v` | 显示复制的详细过程 |
|
||||
|
||||
|
||||
**案例演示***
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# mkdir /home/dir{1,2}
|
||||
[root@localhost ~]# touch install.log
|
||||
# 复制文件到目录下
|
||||
[root@localhost ~]# cp -v install.log /home/dir1
|
||||
# 复制文件到目录下,并且重命名为abc.txt
|
||||
[root@localhost ~]# cp -v install.log /home/dir1/abc.txt
|
||||
# 复制目录
|
||||
[root@localhost ~]# cp -rv /etc /home/dir1
|
||||
# 将多个文件复制到同一个目录
|
||||
[root@localhost ~]# cp -rv /etc/passwd /etc/hostname /home/dir2
|
||||
# 将多个文件复制到当前目录
|
||||
[root@localhost ~]# cp -rv /etc/passwd /etc/hostname .
|
||||
# 备份文件
|
||||
[root@localhost ~]# cp -rv install.log{,-old}
|
||||
|
||||
```
|
||||
|
||||
## mv
|
||||
|
||||
移动文件与目录,或修改名称
|
||||
|
||||
```shell
|
||||
mv [选项]... 源文件... 目录
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-f` | force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖 |
|
||||
| `-i` | 若目标文件 (destination) 已经存在时,就会询问是否覆盖 |
|
||||
| `-u` | 若目标文件已经存在,且 source 比较新,才会升级 (update) |
|
||||
| `-v` | 显示复制的详细过程 |
|
||||
|
||||
|
||||
**常用实例**
|
||||
|
||||
```shell
|
||||
# 将file1移动到/home/dir2
|
||||
[root@localhost ~]# touch file1
|
||||
[root@localhost ~]# mv file1 /home/dir2
|
||||
# 将file2移动到/home/dir2,并且改名file20
|
||||
[root@localhost ~]# touch file2
|
||||
[root@localhost ~]# mv file2 /home/dir2/file20
|
||||
# 将file改名为file.txt
|
||||
[root@localhost ~]# mv file file.txt
|
||||
|
||||
```
|
||||
|
||||
## rm
|
||||
|
||||
删除文件或目录
|
||||
|
||||
```shell
|
||||
rm [选项]... 文件...
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-f` | 就是 force 的意思,忽略不存在的文件,不会出现警告信息 |
|
||||
| `-i` | 互动模式,在删除前会询问使用者是否动作 |
|
||||
| `-r` | 递归删除啊!最常用在目录的删除了!这是非常危险的选项!|
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# cd /home
|
||||
[root@localhost home]# rm -rf dir1
|
||||
```
|
||||
|
||||
## 禁忌命令
|
||||
|
||||
如下命令会从根目录开始删除Linux系统中所有的文件,包括系统文件。严令禁止在任何服务器上输入如下命令
|
||||
|
||||
```sh
|
||||
# 不要操作!!!
|
||||
[root@localhost ~]# rm -rf /*
|
||||
```
|
||||
|
||||
# 文本文件查看
|
||||
|
||||
在Linux中一切皆文件,说的就是Linux利用文本文件来保存系统所有的设置。
|
||||
|
||||
我们在Linux中想实现一个功能,不可避免的需要查看文本文件,修改文本文件。
|
||||
|
||||
## cat
|
||||
|
||||
用于打开文本文件并显示出来
|
||||
|
||||
```shell
|
||||
cat [选项]... [文件]...
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-n` | 由 1 开始对所有输出的行数编号 |
|
||||
| `-b` | 和 -n 相似,只不过对于空白行不编号 |
|
||||
| `-s` | 当遇到有连续两行以上的空白行,就代换为一行的空白行 |
|
||||
| `-A` | 显示控制字符 |
|
||||
|
||||
**案例演示***
|
||||
|
||||
```shell
|
||||
# 查看anaconda-ks.cfg文件
|
||||
[root@localhost ~]# cat anaconda-ks.cfg
|
||||
# 查看anaconda-ks.cfg文件,并且显示行号
|
||||
```
|
||||
|
||||
## less
|
||||
|
||||
可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# less anaconda-ks.cfg
|
||||
```
|
||||
|
||||
## head
|
||||
|
||||
查看文件的开头部分的内容
|
||||
|
||||
```shell
|
||||
head [选项]... [文件]...
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-q` | 隐藏文件名,默认是隐藏 |
|
||||
| `-v` | 显示文件名 |
|
||||
| `-c N` | 显示的字节数 |
|
||||
| `-n N` | 显示的行数 |
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 查看文件的前6行
|
||||
[root@localhost ~]# head -n 6 anaconda-ks.cfg
|
||||
```
|
||||
|
||||
## tail
|
||||
|
||||
会把文本文件里的最尾部的内容显示在屏幕上
|
||||
|
||||
```shell
|
||||
tail [选项]... [文件]...
|
||||
```
|
||||
|
||||
**常用选项**
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-f` | 循环读取 |
|
||||
| `-q` | 隐藏文件名,默认隐藏 |
|
||||
| `-v` | 显示文件名 |
|
||||
| `-c N` | 显示的字节数 |
|
||||
| `-n N` | 显示文件的尾部 n 行内容 |
|
||||
| `-s` | 与-f合用,表示在每次反复的间隔休眠S秒 |
|
||||
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 查看文件anaconda-ks.cfg尾部的3行
|
||||
[root@localhost ~]# tail -n 3 anaconda-ks.cfg
|
||||
# 查看日志的实时更新情况
|
||||
[root@localhost ~]# tail -f /var/log/messages
|
||||
# ctrl+c退出
|
||||
# 查看文件anaconda-ks.cfg从第10行到结尾
|
||||
[root@localhost ~]# tail -n +10 anaconda-ks.cfg
|
||||
|
||||
```
|
||||
|
||||
## grep
|
||||
|
||||
针对文件内容进行过滤,本工具属于文本三剑客,后续会详细讲解,目前只要求初学者掌握最基本的实例即可
|
||||
|
||||
**案例演示**
|
||||
|
||||
```shell
|
||||
# 在/etc/passwd的文件中找出有root的行
|
||||
[root@xwz ~]# grep 'root' /etc/passwd
|
||||
# 在/etc/passwd中找出root开头的行
|
||||
[root@xwz ~]# grep '^root' /etc/passwd
|
||||
# 在/etc/passwd中找出bash结尾的行
|
||||
[root@xwz ~]# grep 'bash$' /etc/passwd
|
||||
|
||||
```
|
||||
|
||||
# 文本文件编辑
|
||||
|
||||
在 Linux 中只掌握文本查看是远远不够的,我们还需要掌握编辑文本文件。
|
||||
|
||||
Linux 上也有图形化的文本编辑器,类似于 Windows 的记事本,但是很多时候我们只能用命令行来管理 Linux 操作系统,所以必须要掌握命令行的文本编辑器软件。
|
||||
|
||||
目前常见的命令行文本编辑器
|
||||
|
||||
* **nano**:在 Debain 系列的系统上会比较常见,但是其他的 Linux 发行版也都可以安装
|
||||
* **vi**:所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。
|
||||
* **vim**:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
|
||||
|
||||
|
||||
## 什么是 Vim
|
||||
|
||||
Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
|
||||
|
||||
Vim 是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位。
|
||||
|
||||

|
||||
|
||||
## 使用方式
|
||||
|
||||
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和末行模式(Last line mode)。 这三种模式的作用分别是:
|
||||
|
||||
### 命令模式
|
||||
|
||||
用户刚刚启动 vi/vim,便进入了命令模式。
|
||||
|
||||
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下`i`,并不会输入一个字符,`i`被当作了一个命令。
|
||||
|
||||
以下是常用的几个命令:
|
||||
|
||||
| 命令 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `i` | 切换到输入模式,以输入字符 |
|
||||
| `x` | 删除当前光标所在处的字符 |
|
||||
|`:` | 切换到末行模式,以在最底一行输入命令 |
|
||||
|
||||
### 输入模式
|
||||
|
||||
在命令模式下按下 `i` 就进入了输入模式。
|
||||
|
||||
在输入模式中,可以使用以下按键:
|
||||
|
||||
| 命令 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `字符按键以及Shift组合` | 输入字符 |
|
||||
| `ENTER` | 回车键,换行 |
|
||||
| `BACK SPACE` | 退格键,删除光标前一个字符 |
|
||||
| `DEL` | 删除键,删除光标后一个字符 |
|
||||
| `方向键` | 在文本中移动光标 |
|
||||
| `HOME/END` | 移动光标到行首/行尾 |
|
||||
| `Page Up/Page Down` | 上/下翻页 |
|
||||
| `Insert` | 切换光标为输入/替换模式,光标将变成竖线/下划线 |
|
||||
| `ESC` | 退出输入模式,切换到命令模式 |
|
||||
|
||||
### 末行模式
|
||||
|
||||
在命令模式下按下 `:`(英文冒号)就进入了末行模式。
|
||||
|
||||
末行模式可以输入单个或多个字符的命令,可用的命令非常多。
|
||||
|
||||
在末行模式中,基本的命令有:
|
||||
|
||||
| 命令 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `q` | 退出程序 |
|
||||
| `w` | 保存文件 |
|
||||
|
||||
按 ESC 键可随时退出末行模式。
|
||||
|
||||
简单的说,我们可以将这三个模式的关系用下图来表示:
|
||||
|
||||

|
||||
|
||||
## 使用实例
|
||||
|
||||
有些 linux 发行套件上并没有安装 vim,我们可以安装一下,下面提供了 Rockylinux 的安装命令
|
||||
|
||||
```shell
|
||||
# yum是在线安装软件的命令,后面会有详细的介绍,这边直接使用
|
||||
[root@localhost ~]# yum -y install vim
|
||||
|
||||
```
|
||||
|
||||
vi和vim大部分的操作完全一模一样,所以会使用vim自然也会使用vi
|
||||
|
||||
**案例演示**
|
||||
|
||||
直接输入`vim 文件名`就能够进入 vim 的命令模式了。请注意,记得 vim 后面一定要加文件名,不管该文件存在与否!
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# vim file.txt
|
||||
```
|
||||
|
||||
输入这条命令之后,会看到如下画面
|
||||
|
||||

|
||||
|
||||
按下`i`进入输入模式(也称为编辑模式),开始编辑文字
|
||||
|
||||
在命令模式之中,只要按下`i`,`o`,`a`等字符就可以进入输入模式了!
|
||||
|
||||
在编辑模式当中,你可以发现在左下角状态栏中会出现`--INSERT--`的字样,那就是可以输入任意字符的提示。
|
||||
|
||||
这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。
|
||||
|
||||

|
||||
|
||||
好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角`--INSERT--`的不见了!
|
||||
|
||||

|
||||
|
||||
输入**:wq**后回车即可保存离开,注意其中的冒号必须是英文输入法下的冒号!
|
||||
|
||||

|
||||
|
||||
现在我们就成功创建了一个文件,查看文件的内容吧
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# ls -lh file.txt
|
||||
[root@localhost ~]# cat file.txt
|
||||
```
|
||||
|
||||
## 按键说明
|
||||
|
||||
下面将会列举出 vim 非常多的常用按键,初学者只需要浏览一遍,记住大概 vim 有哪些功能,等后面大量使用 vim 的时候,再来翻阅笔记,并且在多次使用中把这些功能记住。
|
||||
|
||||
### 命令模式
|
||||
|
||||
下面的操作都是在命令模式下进行的
|
||||
|
||||
**移动光标的方法**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `h 或 向左箭头键(←)` | 光标向左移动一个字符 |
|
||||
| `j 或 向下箭头键(↓)` | 光标向下移动一个字符 |
|
||||
| `k 或 向上箭头键(↑)` | 光标向上移动一个字符 |
|
||||
| `l 或 向右箭头键(→)` | 光标向右移动一个字符 |
|
||||
| `[Ctrl] + [f]`| 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
|
||||
| `[Ctrl] + [b]` | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
|
||||
| `[Ctrl] + [d]` | 屏幕『向下』移动半页 |
|
||||
| `[Ctrl] + [u]` | 屏幕『向上』移动半页 |
|
||||
| `+`| 光标移动到非空格符的下一行 |
|
||||
| `-` | 光标移动到非空格符的上一行 |
|
||||
| `n + [space]` | 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。 |
|
||||
| `0 或功能键[Home]` | 移动到这一行的最前面字符处 |
|
||||
| `$ 或功能键[End]` | 移动到这一行的最后面字符处 |
|
||||
| `H ` | 光标移动到这个屏幕的最上方那一行的第一个字符 |
|
||||
| `M` | 光标移动到这个屏幕的中央那一行的第一个字符 |
|
||||
| `L` | 光标移动到这个屏幕的最下方那一行的第一个字符 |
|
||||
| `G` | 移动到这个档案的最后一行(常用) |
|
||||
| `nG` | n 为数字。移动到这个文档的第 n 行。例如 20G 则会移动到这个档案的第 20 行 |
|
||||
| `gg` | 移动到这个档案的第一行,相当于 1G |
|
||||
| `n + [Enter]` | n 为数字。光标向下移动 n行 |
|
||||
|
||||
**文本的搜索与替换**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `/word ` | 向光标之下寻找一个名称为 word 的字符串。 |
|
||||
| `?word` | 向光标之上寻找一个字符串名称为 word 的字符串。 |
|
||||
| `n` | 这个 n 是英文按键。代表重复前一个搜寻的动作。 |
|
||||
| `N` | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 |
|
||||
| `:n1,n2s/word1/word2/g` | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 |
|
||||
| `:1,$s/word1/word2/g` 或 `:%s/word1/word2/g` | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 ! |
|
||||
| `:1,$s/word1/word2/gc` 或 `:%s/word1/word2/gc` | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代! |
|
||||
|
||||
**删除/剪切、复制与粘贴**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `x, X` | 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) |
|
||||
| `nx` | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 |
|
||||
| `dd` | 删除/剪切光标所在的那一整行(常用) |
|
||||
| `ndd` | n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 |
|
||||
| `d1G` | 删除光标所在到第一行的所有数据 |
|
||||
| `dG` | 删除光标所在到最后一行的所有数据 |
|
||||
| `d$` | 删除游标所在处,到该行的最后一个字符 |
|
||||
| `d0` | 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符 |
|
||||
| `yy` | 复制游标所在的那一行 |
|
||||
| `nyy` | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行 |
|
||||
| `y1G` | 复制游标所在行到第一行的所有数据 |
|
||||
| `yG` | 复制游标所在行到最后一行的所有数据 |
|
||||
| `y0` | 复制光标所在的那个字符到该行行首的所有数据 |
|
||||
| `y$` | 复制光标所在的那个字符到该行行尾的所有数据 |
|
||||
| `p, P` | p 为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 |
|
||||
| `J` | 将光标所在行与下一行的数据结合成同一行 |
|
||||
| `c` | 重复删除多个数据,例如向下删除 10 行,[ 10c ] |
|
||||
| `u` | 复原前一个动作。 |
|
||||
| `[Ctrl]+r` | 重做上一个动作。 |
|
||||
| `.` | 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! |
|
||||
|
||||
**进入输入或取代的编辑模式**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `i, I` | 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 |
|
||||
| `a, A` | 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。 |
|
||||
| `o, O` | 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行! |
|
||||
| `r, R` | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止 |
|
||||
| `[Esc]` | 退出编辑模式,回到一般模式中 |
|
||||
|
||||
### 末行模式
|
||||
|
||||
**末行模式下的储存、离开等指令**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `:w` | 将编辑的数据写入硬盘中 |
|
||||
| `:w!` | 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权限有关 |
|
||||
| `:q` | 离开 vim |
|
||||
| `:q!` | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。 |
|
||||
| `:wq` | 保存后离开,若为 `:wq!` 则为强制保存退出 |
|
||||
| `ZZ` | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) |
|
||||
| `:x` | 效果等同于(保存并退出) |
|
||||
| `:X` | 大写的X,用于加密文件 |
|
||||
| `ZQ`| 不保存,强制退出。效果等同于 `:q!` |
|
||||
| `:w [filename]` | 将编辑的数据储存成另一个文件(类似文件另存为) |
|
||||
| `:r [filename]` | 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在行后面 |
|
||||
| `:n1,n2 w [filename]` | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
|
||||
| `:!command` | 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息 |
|
||||
|
||||
**vim环境变量修改**
|
||||
|
||||
| 方法 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `:set nu` | 显示行号,设定之后,会在每一行的前缀显示该行的行号 |
|
||||
| `:set nonu` | 与 set nu 相反,为取消行号 |
|
BIN
Linux基础/文件管理/vim内容编辑.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
Linux基础/文件管理/vim命令模式.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Linux基础/文件管理/vim末行模式.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
Linux基础/文件管理/vim模式关系.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
Linux基础/文件管理/vim编辑模式.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
Linux基础/文件管理/vim键盘图.png
Normal file
After Width: | Height: | Size: 319 KiB |
647
Linux基础/用户权限管理.md
Normal file
@@ -0,0 +1,647 @@
|
||||
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
|
||||
|
||||
为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组:
|
||||
|
||||
* 系统上的每个进程(运行的程序)都是作为特定用户运行
|
||||
* 每个文件是由一个特定的用户拥有
|
||||
* 访问文件和目录受到用户的限制
|
||||
* 与正在运行的进程相关联的用户确定该进程可访问的文件和目录
|
||||
|
||||
实现用户账号的管理,要完成的工作主要有如下几个方面:
|
||||
|
||||
* 用户账号的添加、删除与修改
|
||||
* 用户口令的管理
|
||||
* 用户组的管理
|
||||
|
||||
# 用户和用户组查看
|
||||
|
||||
## id
|
||||
|
||||
用于显示用户的ID,以及所属群组的 ID
|
||||
|
||||
id会显示用户以及所属群组的实际与有效 ID。若两个 ID 相同,则仅显示实际 ID。若仅指定用户名称,则显示目前用户的 ID。
|
||||
|
||||
```shell
|
||||
id [OPTION]... [USER]
|
||||
```
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-g` | 显示用户所属群组的 ID |
|
||||
| `-G` | 显示用户所属附加群组的 ID |
|
||||
| `-n` | 显示用户,所属群组或附加群组的名称 |
|
||||
| `-r` | 显示用户真实 ID,用户真实的 uid |
|
||||
| `-u` | 显示用户有效 ID,可以都某些高权限用户,通过有效 id 限制权限 |
|
||||
|
||||
### uid 约定
|
||||
|
||||
Linux 操作系统会依据用户的 uid 数值来判定这个用户的角色,分别如下
|
||||
|
||||
- **0**:超级管理员,也就是root,在linux系统中拥有所有权力
|
||||
- **1~999**:系统用户,系统用户往往是用来约束系统中的服务的
|
||||
- **1000+**:普通用户,可以用来登陆和使用Linux操作系统
|
||||
|
||||
关于root用户
|
||||
- uid是0
|
||||
- 拥有操作系统所有权力
|
||||
- 该用户有权力覆盖文件系统上的普通权限
|
||||
- 安装或删除软件并管理系统文件和目录
|
||||
- 大多数设备只能由root控制
|
||||
|
||||
### 案例演示
|
||||
|
||||
查看当前登陆的用户信息
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# id
|
||||
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
|
||||
```
|
||||
|
||||
查看文件的拥有者
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# ll anaconda-ks.cfg
|
||||
-rw-------. 1 root root 1241 4月 4 16:53 anaconda-ks.cfg
|
||||
```
|
||||
|
||||

|
||||
|
||||
查看运行进程的用户名,ps命令会在后面进程管理部分讲解
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# ps aux
|
||||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 2 0.0 0.0 0 0 ? S 09:06 0:00 [kthreadd]
|
||||
root 3 0.0 0.0 0 0 ? S 09:06 0:01 [ksoftirqd/0]
|
||||
root 4 0.1 0.0 0 0 ? R 09:06 0:09 [kworker/0:0]
|
||||
root 5 0.0 0.0 0 0 ? S< 09:06 0:00 [kworker/0:0H]
|
||||
```
|
||||
|
||||
## 相关的文件
|
||||
|
||||
之前说过 Linux 一切皆文件,所以用户和用户组相关的信息也都是保存在文本文件中的,下面列举出相关的文件。
|
||||
|
||||
### passwd 文件
|
||||
|
||||
用于保存用户的信息,一般第一行是 root 用户,下面都是其他用户
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# head -n 1 /etc/passwd
|
||||
root:x:0:0:root:/root:/bin/bash
|
||||
# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令
|
||||
```
|
||||
|
||||
### shadow 文件
|
||||
|
||||
格式中密码占位置太长了,所以使用x来替代,Linux系统会到shadow中查找x部分的的密码内容
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# head -n 1 /etc/shadow
|
||||
root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
|
||||
# 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
|
||||
```
|
||||
|
||||
格式不需要大家记住,只需要知道关于这个用户的密码和有效期都在这个文件中即可。
|
||||
|
||||
密码在`passwd`文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是`$6`,这个类型6的加密算法是sha-512。我们也可以在man手册中看到对shadow文件的详细解释。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# man 5 shadow
|
||||
# man手册一个有9个章节,其中第5个章节是对文件格式的说明
|
||||
# 对man手册感兴趣的同学,也可以自己在网上查找学习man手册的更多内容
|
||||
```
|
||||
|
||||
### group文件
|
||||
|
||||
用户和组的对应关系,会保存在group文件中
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# head -n 1 /etc/group
|
||||
root:x:0:
|
||||
# 这个格式是组名:口令:组标识号:组内用户列表
|
||||
```
|
||||
|
||||
# 用户组管理
|
||||
|
||||
## 添加用户组
|
||||
|
||||
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
|
||||
|
||||
```shell
|
||||
groupadd [选项] 组
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
| 选项 | 含义 |
|
||||
| :--- | :--- |
|
||||
| `-g` | 指定新建工作组的 id |
|
||||
| `-r` | 创建系统工作组,系统工作组的组ID小于 500 |
|
||||
| `-K` | 覆盖配置文件`/etc/login.defs` |
|
||||
| `-o` | 允许添加组 ID 号不唯一的工作组 |
|
||||
| `-f` | 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭) |
|
||||
|
||||
### 案例演示
|
||||
|
||||
按照下图创建组,并且指定gid,并且检查是否成功
|
||||
|
||||

|
||||
|
||||
```shell
|
||||
[root@localhost ~]# groupadd hr -g 1000
|
||||
[root@localhost ~]# groupadd sale -g 2000
|
||||
[root@localhost ~]# groupadd it -g 3000
|
||||
[root@localhost ~]# groupadd fd -g 4000
|
||||
[root@localhost ~]# tail -n 4 /etc/group
|
||||
hr:x:1000:
|
||||
sale:x:2000:
|
||||
it:x:3000:
|
||||
fd:x:4000:
|
||||
```
|
||||
|
||||
## 修改用户组
|
||||
|
||||
groupmod命令用于更改群组识别码或名称
|
||||
|
||||
```shell
|
||||
groupmod [选项] 组
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-g**:将组 ID 改为 GID
|
||||
- **-n**:改名为 NEW_GROUP
|
||||
- **-o**:允许使用重复的 GID
|
||||
|
||||
### 案例演示
|
||||
|
||||
* 修改fd组的名字为finance
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# groupmod -n finance fd
|
||||
[root@localhost ~]# tail -n 1 /etc/group
|
||||
finance:x:4000:
|
||||
```
|
||||
|
||||
## 删除用户组
|
||||
|
||||
groupdel命令用于删除群组
|
||||
|
||||
需要从系统上删除群组时,可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
|
||||
|
||||
```shell
|
||||
groupdel [组名]
|
||||
```
|
||||
|
||||
### 案例演示
|
||||
|
||||
* 删除一个用户组
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# groupadd test
|
||||
[root@localhost ~]# groupdel test
|
||||
```
|
||||
|
||||
## 用户组成员管理
|
||||
|
||||
gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除
|
||||
|
||||
```shell
|
||||
gpasswd [选项] 组
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-a**:添加用户到组;
|
||||
- **-d**:从组删除用户;
|
||||
- **-A**:指定管理员,可以执行添加或者删除组员;
|
||||
- **-M**:替换组中的全部用户列表,不包含在内的用户将会从组中删除;
|
||||
- **-R**:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
|
||||
|
||||
### 案例演示
|
||||
|
||||
创建用户 itadmin,并且将其加入 it 组
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd itadmin
|
||||
[root@localhost ~]# gpasswd -a itadmin it
|
||||
正在将用户“itadmin”加入到“it”组中
|
||||
[root@localhost ~]# cat /etc/group |grep it:
|
||||
it:x:3000:itadmin
|
||||
# 在组文件中,可以看到这个组的成员
|
||||
[root@localhost ~]# id itadmin
|
||||
uid=6667(itadmin) gid=6667(itadmin) 组=6667(itadmin),3000(it)
|
||||
# 在用户的信息中,可以看到这个用户的所属组
|
||||
```
|
||||
|
||||
# 用户管理
|
||||
|
||||
## 添加用户
|
||||
|
||||
useradd 可以用来添加新的用户账号
|
||||
|
||||
```shell
|
||||
useradd [选项] 用户名
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
* **-c comment**:指定一段注释性描述。
|
||||
* **-d 目录**:指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
|
||||
* **-m**:创建用户的主目录
|
||||
* **-g 用户组**:指定用户所属的用户组,默认会创建一个和用户名同名的用户组。
|
||||
* **-G 用户组**:用户组 指定用户所属的附加组,一个用户可以属于多个附加组。
|
||||
* **-s Shell文件**:指定用户的登录Shell。
|
||||
* **-u 用户号**:指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
|
||||
|
||||
### 案例演示
|
||||
|
||||
* 添加一般用户
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd user01
|
||||
```
|
||||
|
||||
* 为添加的用户指定相应的用户组
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd -g root user02
|
||||
```
|
||||
|
||||
* 为新添加的用户指定home目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd -d /home/test user03
|
||||
```
|
||||
|
||||
* 建立一个不给登录的用户
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd -s /sbin/nologin user04
|
||||
```
|
||||
|
||||
- 查看用户描述信息
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# useradd -c "this is python_developmer user" python-developmer
|
||||
[root@localhost ~]# cat /etc/passwd |grep python-developmer
|
||||
python-developmer:x:1005:1005:this is python_developmer user:/home/python-developmer:/bin/bash
|
||||
```
|
||||
|
||||
## 切换用户
|
||||
|
||||
su命令用户Linux系统中的用户切换
|
||||
|
||||
```BASH
|
||||
su [选项] 用户名
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- `-`:以目标用户的环境变量启动新会话。这将模拟用户完全登录到新用户账户,包括其家目录、环境变量等。
|
||||
- `-c 命令`:执行指定的命令,并在执行完毕后返回原始用户。
|
||||
- `-s shell`:使用指定的 shell 替代目标用户的默认 shell。
|
||||
|
||||
## 修改用户:usermod
|
||||
|
||||
usermod命令用于修改用户帐号
|
||||
|
||||
usermod可用来修改用户帐号的各项设定
|
||||
|
||||
```shell
|
||||
usermod [选项] 登录
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-c<备注>**:修改用户帐号的备注文字。
|
||||
- **-a**:追加,默认的修改是覆盖
|
||||
- **-d登入目录>**:修改用户登入时的目录。
|
||||
- **-e<有效期限>**:修改帐号的有效期限。
|
||||
- **-f<缓冲天数>**:修改在密码过期后多少天即关闭该帐号。
|
||||
- **-g<群组>**:修改用户所属的群组。
|
||||
- **-G<群组>**:修改用户所属的附加群组。
|
||||
- **-l<帐号名称>**:修改用户帐号名称。
|
||||
- **-L**:锁定用户密码,使密码无效。
|
||||
- **-s**:修改用户登入后所使用的shell。
|
||||
- **-u**:修改用户ID。
|
||||
- **-U**:解除密码锁定。
|
||||
|
||||
### 案例演示
|
||||
|
||||
* 更改登录的目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# usermod -d /home user01
|
||||
[root@localhost ~]# su - user01
|
||||
[user01@localhost ~]$ pwd
|
||||
/home
|
||||
```
|
||||
|
||||
* 改变用户的uid
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# usermod -u 6666 user02
|
||||
```
|
||||
|
||||
## 删除用户:userdel
|
||||
|
||||
userdel命令用于删除用户帐号
|
||||
|
||||
userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件
|
||||
|
||||
```shell
|
||||
userdel [-r][用户帐号]
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-r**:删除用户登入目录以及目录中所有文件
|
||||
|
||||
### 案例演示
|
||||
|
||||
删除用户账号
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# userdel user04
|
||||
```
|
||||
|
||||
删除用户账户和家目录
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# userdel -r user03
|
||||
```
|
||||
|
||||
# passwd 文件中的 shell
|
||||
|
||||
查看`/etc/passwd`文件会发现在每行的最后是登录成功之后执行的命令,有两种是使用最为频繁的:
|
||||
|
||||
- /bin/bash:这个是 Linux 的命令行工具,我们正常登陆之后默认就是进入命令行
|
||||
- /sbin/nologin:如果写成 nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需要登录。如果提供登录的功能反而不安全,所以写成 nologin
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# cat /etc/passwd
|
||||
root:x:0:0:root:/root:/bin/bash
|
||||
bin:x:1:1:bin:/bin:/sbin/nologin
|
||||
daemon:x:2:2:daemon:/sbin:/sbin/nologin
|
||||
adm:x:3:4:adm:/var/adm:/sbin/nologin
|
||||
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
|
||||
```
|
||||
|
||||
我们可以新建一个用户,然后尝试自定义登录成功之后执行的命令,用来加深印象。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd test01
|
||||
[root@localhost ~]# tail -n 1 /etc/passwd
|
||||
test01:x:1000:1000::/home/test01:/bin/vi
|
||||
```
|
||||
|
||||
切换到test01用户,会发现自动进入vi的界面,说明最后的这个段内容就是用户登录之后会运行的程序
|
||||
|
||||

|
||||
|
||||
# 用户密码管理
|
||||
|
||||
root用户可以直接设置普通用户密码,普通用户必须要提供原密码,才可以修改自己密码。
|
||||
|
||||
## passwd
|
||||
|
||||
passwd命令用来更改使用者的密码
|
||||
|
||||
```shell
|
||||
passwd [选项...] <帐号名称>
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-k**:保持身份验证令牌不过期
|
||||
- **-d**:删除已命名帐号的密码(只有根用户才能进行此操作)
|
||||
- **-l**:锁定指名帐户的密码(仅限 root 用户)
|
||||
- **-u**:解锁指名账户的密码(仅限 root 用户)
|
||||
- **-x**:密码的最长有效时限(只有根用户才能进行此操作)
|
||||
- **-n**:密码的最短有效时限(只有根用户才能进行此操作)
|
||||
- **-w**:在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
|
||||
- **-i**:当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
|
||||
- **-S**:报告已命名帐号的密码状态(只有根用户才能进行此操作)
|
||||
- **--stdin**:从标准输入读取令牌(只有根用户才能进行此操作)
|
||||
|
||||
### 案例演示
|
||||
|
||||
修改test01用户密码
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# passwd test01
|
||||
更改用户 test01 的密码 。
|
||||
新的 密码:
|
||||
重新输入新的 密码:
|
||||
passwd:所有的身份验证令牌已经成功更新。
|
||||
```
|
||||
|
||||
使用管道符设置用户密码
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# echo 123456 | passwd --stdin test01
|
||||
更改用户 test01 的密码 。
|
||||
passwd:所有的身份验证令牌已经成功更新。
|
||||
```
|
||||
|
||||
## login.defs文件
|
||||
|
||||
`/etc/login.defs`文件是用来创建用户时进行一定的限制,但是优先级低于`/etc/passwd`和`/etc/shadow`,如果有冲突的地方,系统会以`/etc/passwd`和`/etc/shadow`为准
|
||||
|
||||
下面是这个文件的内容,egrep命令我们后续会讲到,这边可以理解为不看文件的注释和空行。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# egrep -v '^[ ]*$|^#' /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 1000 # 用户UID最小1000
|
||||
UID_MAX 60000 # 用户UID最大60000
|
||||
SYS_UID_MIN 201 # 系统用户UID最小201
|
||||
SYS_UID_MAX 999 # 系统用户UID最大999
|
||||
GID_MIN 1000 # 用户组GID最小1000
|
||||
GID_MAX 60000 # 用户组GID最大60000
|
||||
SYS_GID_MIN 201
|
||||
SYS_GID_MAX 999
|
||||
CREATE_HOME yes # 创建家目录
|
||||
UMASK 077 # 创建文件/目录的权限掩码
|
||||
USERGROUPS_ENAB yes # 创建用户时同时生成组是 如果此处是no 创建的用户 会是gid=100(users)groups=100(users)
|
||||
ENCRYPT_METHOD SHA512 # 加密 方法 sha 512 这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头
|
||||
```
|
||||
|
||||
## chage
|
||||
|
||||
chage是用于更改用户密码过期信息
|
||||
|
||||
```shell
|
||||
chage [选项] 登录
|
||||
```
|
||||
|
||||
### 常用选项
|
||||
|
||||
- **-d**:设置密码的最后更改日期
|
||||
- **-E 过期日期**:设置账号的过期日期
|
||||
- **-I INACITVE**:设置密码过期后若未更改,多少天后用户账号被禁用。
|
||||
- **-l**:显示用户账号的密码过期信息。
|
||||
- **-m 最小天数**:设置两次改变密码之间相距的最小天数
|
||||
- **-M 最大天数**:设置将两次改变密码之间相距的最大天数
|
||||
- **-W 警告天数**:设置密码过期前的警告天数
|
||||
|
||||
### 案例演示
|
||||
|
||||
强制用户在下次登录的时候换密码
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# chage -d 0 test01
|
||||
[root@localhost ~]# logout
|
||||
You must change your password now and login again!
|
||||
更改用户 test01 的密码 。
|
||||
为 test01 更改 STRESS 密码。
|
||||
(当前)UNIX 密码:
|
||||
|
||||
[root@localhost ~]# chage -l root
|
||||
最近一次密码修改时间 :从不
|
||||
密码过期时间 :从不
|
||||
密码失效时间 :从不
|
||||
帐户过期时间 :从不
|
||||
两次改变密码之间相距的最小天数 :0
|
||||
两次改变密码之间相距的最大天数 :99999
|
||||
在密码过期之前警告的天数 :7
|
||||
|
||||
# 设置用户 user01 的密码过期前7天提醒用户修改密码
|
||||
[root@localhost ~]# chage -W 7 user01
|
||||
|
||||
# 设置用户 user01 的密码最短使用天数为7天,即密码修改后7天内不能再次修改
|
||||
[root@localhost ~]# chage -m 7 user01
|
||||
[root@localhost ~]# chage -l user01
|
||||
最近一次密码修改时间 :11月 08, 2024
|
||||
密码过期时间 :从不
|
||||
密码失效时间 :从不
|
||||
帐户过期时间 :从不
|
||||
两次改变密码之间相距的最小天数 :7
|
||||
两次改变密码之间相距的最大天数 :99999
|
||||
在密码过期之前警告的天数 :7
|
||||
```
|
||||
|
||||
**小知识:** 当你新建用户的时候,用户的home目录下会有一些默认的隐藏文件,这些隐藏文件是在创建用户的时候从`/etc/skel/`中复制过去的。
|
||||
|
||||
# sudoers
|
||||
|
||||
Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。
|
||||
|
||||
sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。
|
||||
|
||||
```shell
|
||||
sudo [选项] [用户名] [命令]
|
||||
```
|
||||
|
||||
## sudo 命令执行过程
|
||||
|
||||
1. 当用户执行sudo时,系统会主动寻找`/etc/sudoers`文件,判断该用户是否有执行sudo的权限
|
||||
2. 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
|
||||
3. 若密码输入成功,则开始执行sudo后续的命令
|
||||
|
||||
## 赋予用户 sudo 操作的权限
|
||||
|
||||
通过useradd添加的用户,并不具备sudo权限。在ubuntu/centos/RockyLinux等系统下, 需要将用户加入admin组或者wheel组或者sudo组。以root用户身份执行如下命令, 将用户加入wheel/admin/sudo组。
|
||||
|
||||
```shell
|
||||
usermod -a -G wheel <用户名>
|
||||
```
|
||||
|
||||
如果提示wheel组不存在, 则还需要先创建该组
|
||||
|
||||
```shell
|
||||
groupadd wheel
|
||||
```
|
||||
|
||||
## 配置文件
|
||||
|
||||
sudo 的权限控制可以在 `/etc/sudoers` 文件中查看到。一般来说,通过 `cat /etc/sudoers` 指令来查看该文件, 会看到如下几行代码。
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/sudoers
|
||||
=====省略=====
|
||||
root ALL=(ALL) ALL
|
||||
%wheel ALL=(ALL) ALL
|
||||
```
|
||||
|
||||
对/etc/sudoers文件进行编辑的代码公式可以概括为
|
||||
|
||||
```shell
|
||||
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
|
||||
字段1 字段2 =[(字段3)] [字段4] 字段5
|
||||
```
|
||||
|
||||
凡是[ ]中的内容, 都能省略; 命令和命令之间用`,`号分隔,字段3、字段4,是可以省略的。
|
||||
|
||||
* "字段1"不以%号开头的表示"将要授权的用户",以%号开头的表示"将要授权的组"。
|
||||
* "字段2"表示允许登录的主机, ALL表示所有,;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
|
||||
* "字段3"如果省略, 相当于(root:root),表示可以通过sudo提权到root,如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。
|
||||
* "字段4"的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。
|
||||
* 比如:`lucy ALL=(ALL) NOPASSWD: /bin/useradd`表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码
|
||||
* 比如:`peter ALL=(ALL) NOPASSWD: ALL`,表示: 普通用户peter可以在任何主机上, 通过sudo执行任何命令, 并且不需要输入密码。
|
||||
* "字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。
|
||||
* 如果你将授权写成如下安全性欠妥的格式:`lucy ALL=(ALL) chown,chmod,useradd`那么用户就有可能创建一个他自己的程序, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的程序"。这是相当危险的!
|
||||
|
||||
## 编辑配置文件
|
||||
|
||||
在实践中,去编辑`/etc/sudoers`文件,系统提示我没权限,这是因为`/etc/sudoers`的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚你知道自己正在做什么。
|
||||
|
||||
强烈建议通过`visudo`命令来修改该文件,通过`visudo`修改,如果配置出错,会有提示。
|
||||
|
||||
官方文档推荐的做法,不是直接修改`/etc/sudoers`文件,而是将修改写在`/etc/sudoers.d/`目录下的文件中。如果使用这种方式修改sudoers,需要在`/etc/sudoers`文件的最后行,加上`#includedir /etc/sudoers.d`一行(默认已有)。需要注意,这个`#includedir /etc/sudoers.d`中的`#`并不是注释,请勿修改。
|
||||
|
||||
## sudo 选项
|
||||
|
||||
* **-u**:以指定用户或 ID 运行命令(或编辑文件)
|
||||
* **-l**:显示出自己(执行 sudo 的使用者)的权限
|
||||
* **-b**:将要执行的指令放在后台执行
|
||||
* **-i**: 以目标用户身份运行一个登录 shell;可同时指定一条命令。相当于切换到root,不过只需要用户自己的密码即可。
|
||||
|
||||
## 案例演示
|
||||
|
||||
* 以管理员身份查看shadow文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# useradd user
|
||||
[root@localhost ~]# echo 123456 | passwd --stdin user
|
||||
[root@localhost ~]# usermod -a -G wheel user
|
||||
[root@localhost ~]# su - user
|
||||
[user@localhost ~]$ cat /etc/shadow
|
||||
cat: /etc/shadow: 权限不够
|
||||
[user@localhost ~]$ sudo -u root cat /etc/shadow
|
||||
[sudo] user 的密码:
|
||||
[user@localhost ~]$ sudo cat /etc/shadow
|
||||
# sudo -u root用的比较多,可以被精简为sudo
|
||||
```
|
||||
|
||||
* 查看下列示例
|
||||
|
||||
```shell
|
||||
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
|
||||
```
|
||||
|
||||
* 表示: 用户papi能在所有可能出现的主机上, 提权到root下执行`/bin/chown`, 不必输入密码; 但运行`/usr/sbin/useradd`命令时需要密码
|
||||
* 在具有sudo操作的用户下, 执行`sudo -l`可以查看到该用户被允许和被禁止运行的命令
|
||||
|
||||
* 查看下列示例
|
||||
|
||||
```shell
|
||||
papi ALL=/usr/sbin/,/sbin/,!/usr/sbin/fdisk
|
||||
```
|
||||
|
||||
* 命令前面加上!号表示取消该命令
|
||||
* 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外。
|
||||
|
||||
* 默认情况下输入一次sudo可以保持15分钟不再要求输入密码,如果想要延长这个时间,可以修改配置文件
|
||||
|
||||
```shell
|
||||
[root@localhost ~]# visudo
|
||||
Defaults env_reset,pwfeedback,timestamp_timeout=60
|
||||
# 这个是改成60分钟才会需要再次输入密码,并且输入密码的时候会显示*号
|
||||
```
|
||||
|
BIN
Linux基础/用户权限管理/文件属性介绍.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Linux基础/用户权限管理/用户创建实战示例1.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Linux基础/用户权限管理/用户创建实战示例2.png
Normal file
After Width: | Height: | Size: 23 KiB |
883
Linux基础/磁盘阵列RAID.md
Normal file
@@ -0,0 +1,883 @@
|
||||
# 磁盘阵列
|
||||
|
||||
磁盘阵列(RAID,**R**edundant **A**rray of **I**ndependent **D**isks)是一种将多个物理硬盘组合在一起形成一个逻辑硬盘组的技术。通过 RAID,可以实现数据冗余、性能提升或两者兼具。RAID 在存储系统中广泛使用,尤其是在服务器和大数据存储环境中,用于提升数据可靠性和性能。
|
||||
|
||||
## **RAID 0(条带化,Striping)**
|
||||
|
||||
- **特点**: 将数据分块并在多个磁盘上并行存储,提升读写性能。
|
||||
- **优点**: 极大提高了读写速度,因为数据在多个磁盘上并行操作。
|
||||
- **缺点**: 没有冗余,任何一个磁盘的损坏都会导致整个 RAID 失效,数据丢失。
|
||||
- **适用场景**: 需要高性能、数据安全性需求不高的场景,比如视频编辑、临时数据存储等。
|
||||
|
||||

|
||||
|
||||
## **RAID 1(镜像,Mirroring)**
|
||||
|
||||
- **特点**: 将数据完全复制到另一块磁盘上,提供 1:1 的数据冗余。
|
||||
- **优点**: 数据安全性高,任何一个磁盘损坏时,数据仍可以从镜像磁盘中恢复。
|
||||
- **缺点**: 存储效率较低,实际可用存储空间为所有磁盘容量的一半。
|
||||
- **适用场景**: 需要高数据可靠性和快速恢复的场合,比如数据库、操作系统磁盘等。
|
||||
|
||||

|
||||
|
||||
## **RAID 5(带奇偶校验的条带化,Striping with Parity)**
|
||||
|
||||
- **特点**: 将数据和奇偶校验数据分布在所有磁盘上,提供冗余的同时提升性能。
|
||||
- **优点**: 提供数据冗余,同时存储效率较高(磁盘数量越多,效率越好),能够在一个磁盘损坏的情况下恢复数据。
|
||||
- **缺点**: 写入性能稍差,尤其是在发生设备故障时,重建过程较慢。
|
||||
- **适用场景**: 需要兼顾性能和数据冗余的场景,如文件服务器和应用服务器。
|
||||
|
||||
- 写性能*1,读性能\*(N-1)
|
||||
|
||||
RAID5的核心思想是使用奇偶校验信息来提供数据的冗余备份。当其中一个硬盘驱动器发生故障时,剩余的硬盘驱动器可以通过计算奇偶校验信息来恢复丢失的数据。这种方式既提供了数据冗余和容错能力,又降低了整体存储成本。
|
||||
|
||||

|
||||
|
||||
## **RAID 10(RAID 1+0,镜像与条带化的组合)**
|
||||
|
||||
- **特点**: 将 RAID 1(镜像)和 RAID 0(条带化)结合使用,既提供数据冗余又提升了性能。
|
||||
- **优点**: 既有 RAID 0 的高性能,又有 RAID 1 的高安全性。能够快速恢复数据。
|
||||
- **缺点**: 存储效率较低,要求至少 4 块磁盘,实际可用空间为所有磁盘容量的一半。
|
||||
- **适用场景**: 需要高性能和高冗余的关键应用场景,如数据库、虚拟化环境等。
|
||||
|
||||
- 读写性能*N(N为RAID0的硬盘数,此例为2),不能同时坏数据块1a与2a
|
||||
|
||||
<img src="磁盘阵列RAID/RAID10.png" alt="RAID10" />
|
||||
|
||||
## **硬件磁盘阵列(Hardware RAID)**
|
||||
|
||||
### **特点**
|
||||
|
||||
- **专用硬件控制器**:硬件 RAID 使用专门的 RAID 控制器卡(RAID Controller),通常是插入主板的 PCIe 扩展卡或者集成在服务器主板上的芯片。该控制器管理磁盘阵列的所有操作并执行 RAID 级别的计算。
|
||||
- **独立于操作系统**:硬件 RAID 完全独立于操作系统,RAID 控制器负责所有 RAID 相关操作,操作系统只看到一个逻辑磁盘。
|
||||
- **硬件加速**:硬件 RAID 卡通常带有专用处理器(ASIC 或 FPGA)和缓存,用来加速 RAID 操作,提高性能
|
||||
|
||||
### 阵列卡
|
||||
|
||||
<img src="磁盘阵列RAID/阵列卡.png" alt="阵列卡" style="zoom:80%;" />
|
||||
|
||||
## **软件磁盘阵列(Software RAID)**
|
||||
|
||||
### **特点**
|
||||
|
||||
- **由操作系统实现**:软件 RAID 通过操作系统内核或专门的 RAID 软件来管理和实现 RAID 功能。Linux 的 `mdadm`、Windows 的动态磁盘管理和 macOS 的磁盘工具等都支持软件 RAID。
|
||||
- **没有专用硬件**:软件 RAID 不需要专用的 RAID 控制器,所有 RAID 计算和管理工作都由主机的 CPU 执行。
|
||||
- **灵活性高**:软件 RAID 通常可以在不同的硬件平台之间迁移,因为 RAID 配置数据存储在磁盘上,而不是特定的控制器中。
|
||||
|
||||
## **硬件 RAID 和软件 RAID 的对比**
|
||||
|
||||
| **对比项** | **硬件 RAID** | **软件 RAID** |
|
||||
| ------------ | ---------------------------------------- | ---------------------------------- |
|
||||
| **实现方式** | 专用 RAID 控制器 | 操作系统或软件实现 |
|
||||
| **性能** | 高,特别是在 RAID 5/6 等级别中 | 较低,占用主机 CPU 资源 |
|
||||
| **磁盘管理** | 独立于操作系统,系统只看到一个逻辑磁盘 | 依赖于操作系统的磁盘管理 |
|
||||
| **成本** | 高,需购买 RAID 控制器 | 低,无需额外硬件 |
|
||||
| **功能支持** | 支持热备盘、硬盘监控、电池缓存等高级功能 | 功能较少,依赖操作系统提供的功能 |
|
||||
| **灵活性** | 依赖特定硬件,不易迁移 | 容易迁移,跨硬件平台使用 |
|
||||
| **故障恢复** | 控制器损坏可能需要相同型号的控制器 | 可以在不同硬件上恢复 |
|
||||
| **适用场景** | 企业级、大型存储系统,数据中心 | 个人用户、小型服务器,开发测试环境 |
|
||||
|
||||
# 部署磁盘阵列
|
||||
|
||||
为了后续实验,我们先添加5块全新的磁盘。关机状态下,在虚拟机设置中新增磁盘即可。最好添加完成以后,拍个快照保存一下。方便我们后续多次实验恢复。
|
||||
|
||||
<img src="磁盘阵列RAID/部署磁盘阵列.png" alt="部署磁盘阵列" style="zoom:80%;" />
|
||||
|
||||
## mdadm磁盘整列
|
||||
|
||||
对于Linux上通过软件的形式构建磁盘整列,我们常用的方式是通过mdadm这个工具来完成。当然对于部分Linux发行版本,mdadm可能没有内置安装好,所以我们需要手动安装一下。
|
||||
|
||||
## 安装mdadm工具
|
||||
|
||||
yum是Linux中用于安装软件的工具,可以理解为应用商店
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# yum -y install mdadm
|
||||
```
|
||||
|
||||
## mdadm命令
|
||||
|
||||
常用参数以及作用
|
||||
|
||||
| 参数 | 作用 |
|
||||
| ---- | ---------------- |
|
||||
| -a | 检测设备名称 |
|
||||
| -n | 指定设备数量 |
|
||||
| -l | 指定RAID级别 |
|
||||
| -C | 创建 |
|
||||
| -v | 显示过程 |
|
||||
| -f | 模拟设备损坏 |
|
||||
| -r | 移除设备 |
|
||||
| -Q | 查看摘要信息 |
|
||||
| -D | 查看详细信息 |
|
||||
| -S | 停止RAID磁盘阵列 |
|
||||
| -x | 备份盘数量 |
|
||||
|
||||
## RAID 0阵列实验
|
||||
|
||||
### 部署
|
||||
|
||||
1. 创建RAID 0阵列
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 2 -l 0 /dev/nvme0n2 /dev/nvme0n3
|
||||
mdadm: chunk size defaults to 512K
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md0 started.
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─md0 9:0 0 10G 0 raid0
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
└─md0 9:0 0 10G 0 raid0
|
||||
nvme0n4 259:5 0 5G 0 disk
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
```
|
||||
|
||||
通过lsblk命令检查RAID 0阵列创建情况
|
||||
|
||||
2. 格式化文件系统
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mkfs.ext4 /dev/md0
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
/dev/md0 contains a ext4 file system
|
||||
last mounted on Wed Nov 13 15:48:49 2024
|
||||
Proceed anyway? (y,N) y
|
||||
Creating filesystem with 2618880 4k blocks and 655360 inodes
|
||||
Filesystem UUID: 8d1dcad6-2788-40db-8dbd-55b5b7105dbc
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
```
|
||||
|
||||
3. 创建挂载点,并对设备进行挂载
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mkdir /mnt/RAID0
|
||||
[root@localhost ~]# mount /dev/md0 /mnt/RAID0
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 24K 9.3G 1% /mnt/RAID0
|
||||
|
||||
# mount为临时挂载,也可以将挂载信息写入/etc/fstab文件中,进行永久挂载
|
||||
[root@localhost ~]# echo "/dev/md0 /mnt/RAID0 ext4 defaults 0 0" >> /etc/fstab
|
||||
[root@localhost ~]# mount -a
|
||||
mount: (hint) your fstab has been modified, but systemd still uses
|
||||
the old version; use 'systemctl daemon-reload' to reload.
|
||||
[root@localhost ~]# systemctl daemon-reload
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 24K 9.3G 1% /mnt/RAID0
|
||||
|
||||
# 确保fstab文件中的内容格式正确
|
||||
```
|
||||
|
||||
4. 查看/dev/md0磁盘阵列的详细信息
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Thu Nov 14 16:10:58 2024
|
||||
Raid Level : raid0
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Raid Devices : 2
|
||||
Total Devices : 2
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Thu Nov 14 16:10:58 2024
|
||||
State : clean
|
||||
Active Devices : 2
|
||||
Working Devices : 2
|
||||
Failed Devices : 0
|
||||
Spare Devices : 0
|
||||
|
||||
Layout : original
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : none
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 25a30480:323ceeda:d3d95a78:0f5321f7
|
||||
Events : 0
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
0 259 3 0 active sync /dev/nvme0n2
|
||||
1 259 4 1 active sync /dev/nvme0n3
|
||||
```
|
||||
|
||||
**部分字段解释:**
|
||||
|
||||
**Number**: 这个字段表示每个磁盘在 RAID 阵列中的编号(从 0 开始)。这是 RAID 阵列中每个设备的索引或设备号。
|
||||
|
||||
**Major**: 这是设备文件的主设备号(major number),它用于标识设备的类型。不同的主设备号通常对应不同的驱动程序或设备类别。
|
||||
|
||||
**Minor**: 这是设备文件的次设备号(minor number),用于标识同一类型设备中的不同实例。主设备号和次设备号共同唯一标识系统中的一个设备。
|
||||
|
||||
**RaidDevice**: 这是设备在 RAID 阵列中的逻辑设备编号。通常从 0 开始,表示该设备在 RAID 阵列中的顺序。
|
||||
|
||||
**State**: 表示 RAID 阵列中该设备的当前状态。常见状态如下:
|
||||
|
||||
- **active sync**: 表示该设备处于活动状态,并且与 RAID 阵列中的其他设备同步。
|
||||
- **faulty**: 表示设备出现故障,不能正常工作。
|
||||
- **spare**: 表示该设备是热备盘,当其他设备故障时可自动替换。
|
||||
|
||||
**set-A / set-B**: 这可能是与 RAID 10 或其他多组 RAID 配置相关的信息,表示该磁盘属于某个 RAID 子组或镜像组。例如,**set-A** 和 **set-B** 可能表示 RAID 10 配置中的两个镜像组。
|
||||
|
||||
**/dev/nvme0nX**: 这是设备的名称,表示设备在系统中的路径。在这里,设备是 NVMe 协议的磁盘(例如,`/dev/nvme0n2`)。不同的数字后缀(例如 `n2`, `n3` 等)表示不同的 NVMe 设备。
|
||||
|
||||
### 测试
|
||||
|
||||
通过fio磁盘测试工具来测试我们的RAID 0阵列的读写情况
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# yum install -y fio
|
||||
```
|
||||
|
||||
#### 单块硬盘测试
|
||||
|
||||
```sh
|
||||
# 先挂载单块硬盘
|
||||
[root@localhost ~]# mkdir /mnt/test
|
||||
[root@localhost ~]# mkfs.ext4 /dev/nvme0n4
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 1310720 4k blocks and 327680 inodes
|
||||
Filesystem UUID: 0694e52f-3816-4223-b51b-6600bf32bb21
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912, 819200, 884736
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# mount /dev/nvme0n4 /mnt/test
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 24K 9.3G 1% /mnt/RAID0
|
||||
/dev/nvme0n4 4.9G 24K 4.6G 1% /mnt/test
|
||||
|
||||
# 开始测试
|
||||
[root@localhost test]# fio --name=write_test --filename=/mnt/test/testfile --size=1G --bs=1M --rw=write --direct=1 --numjobs=1
|
||||
write_test: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, i oengine=psync, iodepth=1
|
||||
fio-3.35
|
||||
Starting 1 process
|
||||
write_test: Laying out IO file (1 file / 1024MiB)
|
||||
|
||||
write_test: (groupid=0, jobs=1): err= 0: pid=29670: Thu Nov 14 16:51:32 2024
|
||||
write: IOPS=1404, BW=1405MiB/s (1473MB/s)(1024MiB/729msec); 0 zone resets
|
||||
clat (usec): min=570, max=2700, avg=694.62, stdev=136.39
|
||||
lat (usec): min=588, max=2709, avg=710.02, stdev=136.41
|
||||
clat percentiles (usec):
|
||||
| 1.00th=[ 586], 5.00th=[ 594], 10.00th=[ 603], 20.00th=[ 619],
|
||||
| 30.00th=[ 635], 40.00th=[ 652], 50.00th=[ 668], 60.00th=[ 693],
|
||||
| 70.00th=[ 709], 80.00th=[ 742], 90.00th=[ 783], 95.00th=[ 848],
|
||||
| 99.00th=[ 1057], 99.50th=[ 1450], 99.90th=[ 2409], 99.95th=[ 2704],
|
||||
| 99.99th=[ 2704]
|
||||
bw ( MiB/s): min= 1400, max= 1400, per=99.67%, avg=1400.00, stdev= 0.00, samples=1
|
||||
iops : min= 1400, max= 1400, avg=1400.00, stdev= 0.00, samples=1
|
||||
lat (usec) : 750=83.11%, 1000=15.53%
|
||||
lat (msec) : 2=1.07%, 4=0.29%
|
||||
cpu : usr=0.14%, sys=8.52%, ctx=1024, majf=0, minf=8
|
||||
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
|
||||
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
issued rwts: total=0,1024,0,0 short=0,0,0,0 dropped=0,0,0,0
|
||||
latency : target=0, window=0, percentile=100.00%, depth=1
|
||||
|
||||
Run status group 0 (all jobs):
|
||||
WRITE: bw=1405MiB/s (1473MB/s), 1405MiB/s-1405MiB/s (1473MB/s-1473MB/s), io=1024MiB (1074MB), run=729-729msec
|
||||
|
||||
Disk stats (read/write):
|
||||
nvme0n4: ios=0/1793, merge=0/6, ticks=0/1173, in_queue=1173, util=86.50%
|
||||
```
|
||||
|
||||
#### RAID 0测试
|
||||
|
||||
```sh
|
||||
[root@localhost RAID0]# fio --name=write_test --filename=/mnt/RAID0/testfile --size=1G --bs=1M --rw=write --d irect=1 --numjobs=1
|
||||
write_test: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync , iodepth=1
|
||||
fio-3.35
|
||||
Starting 1 process
|
||||
write_test: Laying out IO file (1 file / 1024MiB)
|
||||
|
||||
write_test: (groupid=0, jobs=1): err= 0: pid=29232: Thu Nov 14 16:40:26 2024
|
||||
write: IOPS=1314, BW=1315MiB/s (1378MB/s)(1024MiB/779msec); 0 zone resets
|
||||
clat (usec): min=513, max=3382, avg=737.41, stdev=259.09
|
||||
lat (usec): min=527, max=3469, avg=759.04, stdev=265.36
|
||||
clat percentiles (usec):
|
||||
| 1.00th=[ 537], 5.00th=[ 570], 10.00th=[ 578], 20.00th=[ 611],
|
||||
| 30.00th=[ 627], 40.00th=[ 660], 50.00th=[ 676], 60.00th=[ 709],
|
||||
| 70.00th=[ 758], 80.00th=[ 824], 90.00th=[ 898], 95.00th=[ 963],
|
||||
| 99.00th=[ 2147], 99.50th=[ 2540], 99.90th=[ 3294], 99.95th=[ 3392],
|
||||
| 99.99th=[ 3392]
|
||||
bw ( MiB/s): min= 1275, max= 1275, per=97.03%, avg=1275.45, stdev= 0.00, samples=1
|
||||
iops : min= 1275, max= 1275, avg=1275.00, stdev= 0.00, samples=1
|
||||
lat (usec) : 750=69.43%, 1000=26.86%
|
||||
lat (msec) : 2=2.34%, 4=1.37%
|
||||
cpu : usr=0.39%, sys=9.77%, ctx=1024, majf=0, minf=10
|
||||
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
|
||||
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
issued rwts: total=0,1024,0,0 short=0,0,0,0 dropped=0,0,0,0
|
||||
latency : target=0, window=0, percentile=100.00%, depth=1
|
||||
|
||||
Run status group 0 (all jobs):
|
||||
WRITE: bw=1315MiB/s (1378MB/s), 1315MiB/s-1315MiB/s (1378MB/s-1378MB/s), io=1024MiB (1074MB), run=779-779ms ec
|
||||
|
||||
Disk stats (read/write):
|
||||
md0: ios=0/1660, merge=0/0, ticks=0/1229, in_queue=1229, util=86.06%, aggrios=0/1024, aggrmerge=0/0, aggr ticks=0/703, aggrin_queue=703, aggrutil=86.57%
|
||||
nvme0n2: ios=0/1024, merge=0/0, ticks=0/702, in_queue=702, util=86.57%
|
||||
nvme0n3: ios=0/1024, merge=0/0, ticks=0/705, in_queue=705, util=86.57%
|
||||
```
|
||||
|
||||
由此可以看出,似乎单块磁盘和RAID 0的写入速度是差不多一样的。按道理来说,RAID 0是将数据分散在两块磁盘上,写入速度理应翻倍。但是由于这是虚拟机,使用我们自己电脑的物理磁盘,我们的物理硬盘只有一块,所以这里看不到RAID 0的双倍读写速度的效果。
|
||||
|
||||
### 删除磁盘阵列
|
||||
|
||||
```sh
|
||||
# 先取消挂载,如果写入到fstab文件中,要记得删除
|
||||
[root@localhost ~]# umount /dev/md0
|
||||
# 停止磁盘整列
|
||||
[root@localhost ~]# mdadm -S /dev/md0
|
||||
mdadm: stopped /dev/md0
|
||||
# 删除阵列中的数据块信息
|
||||
[root@localhost ~]# mdadm --zero-superblock /dev/nvme0n2 /dev/nvme0n3
|
||||
# 检查磁盘情况
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
nvme0n4 259:5 0 5G 0 disk /mnt/test
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
```
|
||||
|
||||
## RAID 1阵列实验
|
||||
|
||||
### 部署
|
||||
|
||||
按照上面实验中的方式,创建RAID1阵列以及完成挂载
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 2 -l 1 /dev/nvme0n2 /dev/nvme0n3
|
||||
mdadm: Note: this array has metadata at the start and
|
||||
may not be suitable as a boot device. If you plan to
|
||||
store '/boot' on this device please ensure that
|
||||
your boot-loader understands md/v1.x metadata, or use
|
||||
--metadata=0.90
|
||||
mdadm: size set to 5237760K
|
||||
Continue creating array? y
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md0 started.
|
||||
[root@localhost ~]# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sr0 11:0 1 1.7G 0 rom
|
||||
nvme0n1 259:0 0 20G 0 disk
|
||||
├─nvme0n1p1 259:1 0 1G 0 part /boot
|
||||
└─nvme0n1p2 259:2 0 19G 0 part
|
||||
├─rl-root 253:0 0 17G 0 lvm /
|
||||
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
|
||||
nvme0n2 259:3 0 5G 0 disk
|
||||
└─md0 9:0 0 5G 0 raid1
|
||||
nvme0n3 259:4 0 5G 0 disk
|
||||
└─md0 9:0 0 5G 0 raid1
|
||||
nvme0n4 259:5 0 5G 0 disk /mnt/test
|
||||
nvme0n5 259:6 0 5G 0 disk
|
||||
nvme0n6 259:7 0 5G 0 disk
|
||||
[root@localhost ~]# mkfs.ext4 /dev/md0
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
/dev/md0 contains a ext4 file system
|
||||
last mounted on /mnt/RAID0 on Thu Nov 14 16:39:48 2024
|
||||
Proceed anyway? (y,N) y
|
||||
Creating filesystem with 1309440 4k blocks and 327680 inodes
|
||||
Filesystem UUID: fa3601df-6ddb-4471-afcc-fbf501a8e891
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912, 819200, 884736
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# mkdir /mnt/RAID1
|
||||
[root@localhost ~]# mount /dev/md0 /mnt/RAID1
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/nvme0n4 4.9G 1.1G 3.6G 22% /mnt/test
|
||||
/dev/md0 4.9G 24K 4.6G 1% /mnt/RAID1
|
||||
```
|
||||
|
||||
**注意最后的磁盘大小,我们将使用两块大小为5G的磁盘创建RAID1阵列。但是发现最后的磁盘大小还是5G,这也验证了RAID 1的特性,两块磁盘存放一样的数据,将数据镜像化,所以可用空间也会打对折**
|
||||
|
||||
### 磁盘写入测试
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# fio --name=write_test --filename=/mnt/RAID1/testfile --size=1G --bs=1M --rw=write --direct=1 --numjobs=1
|
||||
write_test: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync, iodepth=1
|
||||
fio-3.35
|
||||
Starting 1 process
|
||||
write_test: Laying out IO file (1 file / 1024MiB)
|
||||
Jobs: 1 (f=1)
|
||||
write_test: (groupid=0, jobs=1): err= 0: pid=29656: Thu Nov 14 16:48:10 2024
|
||||
write: IOPS=726, BW=727MiB/s (762MB/s)(1024MiB/1409msec); 0 zone resets
|
||||
clat (usec): min=1057, max=6693, avg=1349.52, stdev=401.77
|
||||
lat (usec): min=1074, max=6748, avg=1372.68, stdev=404.55
|
||||
clat percentiles (usec):
|
||||
| 1.00th=[ 1090], 5.00th=[ 1156], 10.00th=[ 1172], 20.00th=[ 1205],
|
||||
| 30.00th=[ 1221], 40.00th=[ 1237], 50.00th=[ 1270], 60.00th=[ 1303],
|
||||
| 70.00th=[ 1336], 80.00th=[ 1385], 90.00th=[ 1500], 95.00th=[ 1713],
|
||||
| 99.00th=[ 3097], 99.50th=[ 3884], 99.90th=[ 5866], 99.95th=[ 6718],
|
||||
| 99.99th=[ 6718]
|
||||
bw ( KiB/s): min=716800, max=763904, per=99.48%, avg=740352.00, stdev=33307.56, samples=2
|
||||
iops : min= 700, max= 746, avg=723.00, stdev=32.53, samples=2
|
||||
lat (msec) : 2=96.58%, 4=2.93%, 10=0.49%
|
||||
cpu : usr=0.36%, sys=7.53%, ctx=1031, majf=0, minf=9
|
||||
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
|
||||
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
issued rwts: total=0,1024,0,0 short=0,0,0,0 dropped=0,0,0,0
|
||||
latency : target=0, window=0, percentile=100.00%, depth=1
|
||||
|
||||
Run status group 0 (all jobs):
|
||||
WRITE: bw=727MiB/s (762MB/s), 727MiB/s-727MiB/s (762MB/s-762MB/s), io=1024MiB (1074MB), run=1409-1409msec
|
||||
|
||||
Disk stats (read/write):
|
||||
md0: ios=0/2009, merge=0/0, ticks=0/2531, in_queue=2531, util=92.94%, aggrios=0/2050, aggrmerge=0/0, aggrticks=0/2499, aggrin_queue=2500, aggrutil=91.91%
|
||||
nvme0n2: ios=0/2050, merge=0/0, ticks=0/2476, in_queue=2477, util=91.91%
|
||||
nvme0n3: ios=0/2050, merge=0/0, ticks=0/2522, in_queue=2523, util=91.91%
|
||||
```
|
||||
|
||||
从测试结果中可以看见,RAID 1阵列的磁盘写入速度会比单块磁盘相对慢一点,因为RAID 1阵列是将一份数据写入两遍。
|
||||
|
||||
## RAID 10阵列实验
|
||||
|
||||
建议恢复快照到磁盘刚添加磁盘的状态。最少需要4块额外的硬盘
|
||||
|
||||
### 部署
|
||||
|
||||
1. 创建RAID 10阵列
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4 /dev/nvme0n5
|
||||
mdadm: layout defaults to n2
|
||||
mdadm: layout defaults to n2
|
||||
mdadm: chunk size defaults to 512K
|
||||
mdadm: size set to 5237760K
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md0 started.
|
||||
[root@localhost ~]# mkfs.ext4 /dev/md0
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 2618880 4k blocks and 655360 inodes
|
||||
Filesystem UUID: bd12aabd-52c7-41c3-81b8-bfb89a8ee580
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# mkdir /mnt/RAID10
|
||||
[root@localhost ~]# mount /dev/md0 /mnt/RAID10
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 24K 9.3G 1% /mnt/RAID10
|
||||
# 这里可以看到,虽然我们使用了4块大小为5G的硬盘,但是最后的实际大小只有10G。
|
||||
```
|
||||
|
||||
2. 检查整列情况
|
||||
|
||||
```sh
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Thu Nov 14 17:07:34 2024
|
||||
Raid Level : raid10
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 4
|
||||
Total Devices : 4
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Thu Nov 14 17:21:26 2024
|
||||
State : clean
|
||||
Active Devices : 4
|
||||
Working Devices : 4
|
||||
Failed Devices : 0
|
||||
Spare Devices : 0
|
||||
|
||||
Layout : near=2
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 7011a5e6:862c3556:6bbba92b:8a61ce4e
|
||||
Events : 17
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
0 259 3 0 active sync set-A /dev/nvme0n2
|
||||
1 259 4 1 active sync set-B /dev/nvme0n3
|
||||
2 259 5 2 active sync set-A /dev/nvme0n4
|
||||
3 259 6 3 active sync set-B /dev/nvme0n5
|
||||
```
|
||||
|
||||
### 磁盘写入测试
|
||||
|
||||
```sh
|
||||
[root@localhost RAID10]# fio --name=write_test --filename=/mnt/RAID10/testfile --size=1G --bs=1M --rw=write --direct=1 --numjobs=1
|
||||
write_test: (g=0): rw=write, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, ioengine=psync, iodepth=1
|
||||
fio-3.35
|
||||
Starting 1 process
|
||||
write_test: Laying out IO file (1 file / 1024MiB)
|
||||
Jobs: 1 (f=1)
|
||||
write_test: (groupid=0, jobs=1): err= 0: pid=27150: Thu Nov 14 17:29:34 2024
|
||||
write: IOPS=715, BW=715MiB/s (750MB/s)(1024MiB/1432msec); 0 zone resets
|
||||
clat (usec): min=1122, max=5646, avg=1373.87, stdev=264.26
|
||||
lat (usec): min=1140, max=5741, avg=1395.28, stdev=266.74
|
||||
clat percentiles (usec):
|
||||
| 1.00th=[ 1156], 5.00th=[ 1205], 10.00th=[ 1221], 20.00th=[ 1254],
|
||||
| 30.00th=[ 1287], 40.00th=[ 1303], 50.00th=[ 1336], 60.00th=[ 1369],
|
||||
| 70.00th=[ 1401], 80.00th=[ 1450], 90.00th=[ 1516], 95.00th=[ 1614],
|
||||
| 99.00th=[ 2040], 99.50th=[ 2606], 99.90th=[ 5669], 99.95th=[ 5669],
|
||||
| 99.99th=[ 5669]
|
||||
bw ( KiB/s): min=733184, max=737852, per=100.00%, avg=735518.00, stdev=3300.77, samples=2
|
||||
iops : min= 716, max= 720, avg=718.00, stdev= 2.83, samples=2
|
||||
lat (msec) : 2=98.73%, 4=1.07%, 10=0.20%
|
||||
cpu : usr=0.49%, sys=6.57%, ctx=1026, majf=0, minf=10
|
||||
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
|
||||
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
|
||||
issued rwts: total=0,1024,0,0 short=0,0,0,0 dropped=0,0,0,0
|
||||
latency : target=0, window=0, percentile=100.00%, depth=1
|
||||
|
||||
Run status group 0 (all jobs):
|
||||
WRITE: bw=715MiB/s (750MB/s), 715MiB/s-715MiB/s (750MB/s-750MB/s), io=1024MiB (1074MB), run=1432-1432msec
|
||||
|
||||
Disk stats (read/write):
|
||||
md0: ios=0/1984, merge=0/0, ticks=0/2554, in_queue=2554, util=93.47%, aggrios=0/1024, aggrmerge=0/0, aggrticks=0/1284, aggrin_queue=1284, aggrutil=92.57%
|
||||
nvme0n4: ios=0/1024, merge=0/0, ticks=0/1272, in_queue=1272, util=92.31%
|
||||
nvme0n2: ios=0/1024, merge=0/0, ticks=0/1277, in_queue=1278, util=92.31%
|
||||
nvme0n5: ios=0/1024, merge=0/0, ticks=0/1312, in_queue=1312, util=92.57%
|
||||
nvme0n3: ios=0/1024, merge=0/0, ticks=0/1277, in_queue=1277, util=92.31%
|
||||
|
||||
```
|
||||
|
||||
### 损坏磁盘阵列及修复
|
||||
|
||||
在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用mdadm命令将其移除,然后查看RAID磁盘阵列的状态,可以发现状态已经改变。
|
||||
|
||||
```bash
|
||||
[root@localhost RAID10]# mdadm /dev/md0 -f /dev/nvme0n2
|
||||
mdadm: set /dev/nvme0n2 faulty in /dev/md0
|
||||
[root@localhost RAID10]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Thu Nov 14 17:07:34 2024
|
||||
Raid Level : raid10
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 4
|
||||
Total Devices : 4
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Fri Nov 15 10:05:55 2024
|
||||
State : clean, degraded
|
||||
Active Devices : 3
|
||||
Working Devices : 3
|
||||
Failed Devices : 1
|
||||
Spare Devices : 0
|
||||
|
||||
Layout : near=2
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 7011a5e6:862c3556:6bbba92b:8a61ce4e
|
||||
Events : 19
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
- 0 0 0 removed
|
||||
1 259 4 1 active sync set-B /dev/nvme0n3
|
||||
2 259 5 2 active sync set-A /dev/nvme0n4
|
||||
3 259 6 3 active sync set-B /dev/nvme0n5
|
||||
|
||||
0 259 3 - faulty /dev/nvme0n2
|
||||
```
|
||||
|
||||
在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。当购买了新的硬盘设备后再使用mdadm命令来予以替换即可,在此期间我们可以在/RAID目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先重启系统,然后再把新的硬盘添加到RAID磁盘阵列中。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# umount /mnt/RAID10
|
||||
#有时候失败,告诉设备忙,-f参数都没用
|
||||
#可以使用fuser -mk /mnt/RAID10命令杀死所有占用该文件的进程
|
||||
|
||||
# 先热移除/dev/nvme0n2
|
||||
[root@localhost ~]# mdadm /dev/md0 -r /dev/nvme0n2
|
||||
mdadm: hot removed /dev/nvme0n2 from /dev/md0
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Thu Nov 14 17:07:34 2024
|
||||
Raid Level : raid10
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 4
|
||||
Total Devices : 3
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Fri Nov 15 10:09:16 2024
|
||||
State : clean, degraded
|
||||
Active Devices : 3
|
||||
Working Devices : 3
|
||||
Failed Devices : 0
|
||||
Spare Devices : 0
|
||||
|
||||
Layout : near=2
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 7011a5e6:862c3556:6bbba92b:8a61ce4e
|
||||
Events : 22
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
- 0 0 0 removed
|
||||
1 259 4 1 active sync set-B /dev/nvme0n3
|
||||
2 259 5 2 active sync set-A /dev/nvme0n4
|
||||
3 259 6 3 active sync set-B /dev/nvme0n5
|
||||
# 再重新添加/dev/nvme0n2
|
||||
[root@localhost ~]# mdadm /dev/md0 -a /dev/nvme0n2
|
||||
mdadm: added /dev/nvme0n2
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Thu Nov 14 17:07:34 2024
|
||||
Raid Level : raid10
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 4
|
||||
Total Devices : 4
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Fri Nov 15 10:10:25 2024
|
||||
State : clean, degraded, recovering
|
||||
Active Devices : 3
|
||||
Working Devices : 4
|
||||
Failed Devices : 0
|
||||
Spare Devices : 1
|
||||
|
||||
Layout : near=2
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Rebuild Status : 31% complete
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 7011a5e6:862c3556:6bbba92b:8a61ce4e
|
||||
Events : 28
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
4 259 3 0 spare rebuilding /dev/nvme0n2
|
||||
1 259 4 1 active sync set-B /dev/nvme0n3
|
||||
2 259 5 2 active sync set-A /dev/nvme0n4
|
||||
3 259 6 3 active sync set-B /dev/nvme0n5
|
||||
# 会发现,刚添加上的磁盘处于rebuilding的状态,等待一会儿,就会恢复正常了。
|
||||
|
||||
# 重新再次挂载即可正常使用
|
||||
[root@localhost ~]# mount /dev/md0 /mnt/RAID10/
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 1.1G 8.3G 11% /mnt/RAID10
|
||||
|
||||
# 有的时候,可能会存在/dev/nvme0n2无法添加的情况,对于这种情况,只能将整个整列全部删除干净之后重新创建
|
||||
```
|
||||
|
||||
## RAID 5阵列实验+备份盘
|
||||
|
||||
为了避免多个实验之间相互发生冲突,我们需要保证每个实验的相对独立性,为此需要大家自行将虚拟机还原到初始状态。
|
||||
|
||||
部署RAID 5磁盘阵列时,至少需要用到3块硬盘,还需要再加一块备份硬盘,所以总计需要在虚拟机中模拟4块硬盘设备
|
||||
|
||||
|
||||
现在创建一个RAID 5磁盘阵列+备份盘。在下面的命令中,参数-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数,参数-l 5代表RAID的级别,而参数-x 1则代表有一块备份盘。当查看/dev/md0(即RAID 5磁盘阵列的名称)磁盘阵列的时候就能看到有一块备份盘在等待中了。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4 /dev/nvme0n5
|
||||
mdadm: layout defaults to left-symmetric
|
||||
mdadm: layout defaults to left-symmetric
|
||||
mdadm: chunk size defaults to 512K
|
||||
mdadm: size set to 5237760K
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md0 started.
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Fri Nov 15 10:33:07 2024
|
||||
Raid Level : raid5
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 3
|
||||
Total Devices : 4
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Fri Nov 15 10:33:33 2024
|
||||
State : clean
|
||||
Active Devices : 3
|
||||
Working Devices : 4
|
||||
Failed Devices : 0
|
||||
Spare Devices : 1
|
||||
|
||||
Layout : left-symmetric
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 8f9130a4:06668353:958e7628:985d1167
|
||||
Events : 18
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
0 259 3 0 active sync /dev/nvme0n2
|
||||
1 259 4 1 active sync /dev/nvme0n3
|
||||
4 259 5 2 active sync /dev/nvme0n4
|
||||
|
||||
3 259 6 - spare /dev/nvme0n5
|
||||
```
|
||||
|
||||
将部署好的RAID 5磁盘阵列格式化为ext4文件格式,然后挂载到目录上,之后就可以使用了。
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mkfs.ext4 /dev/md0
|
||||
mke2fs 1.46.5 (30-Dec-2021)
|
||||
Creating filesystem with 2618880 4k blocks and 655360 inodes
|
||||
Filesystem UUID: 33c5ee4e-82de-4c0f-98f1-88cda85292ea
|
||||
Superblock backups stored on blocks:
|
||||
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (16384 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
|
||||
[root@localhost ~]# mkdir /mnt/RAID5
|
||||
[root@localhost ~]# echo "/dev/md0 /mnt/RAID5 ext4 defaults 0 0" >> /etc/fstab
|
||||
[root@localhost ~]# mount -a
|
||||
mount: (hint) your fstab has been modified, but systemd still uses
|
||||
the old version; use 'systemctl daemon-reload' to reload.
|
||||
[root@localhost ~]# systemctl daemon-reload
|
||||
[root@localhost ~]# mount -a
|
||||
[root@localhost ~]# df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
devtmpfs 4.0M 0 4.0M 0% /dev
|
||||
tmpfs 872M 0 872M 0% /dev/shm
|
||||
tmpfs 349M 6.3M 343M 2% /run
|
||||
/dev/mapper/rl-root 17G 1.7G 16G 10% /
|
||||
/dev/nvme0n1p1 960M 261M 700M 28% /boot
|
||||
tmpfs 175M 0 175M 0% /run/user/0
|
||||
/dev/md0 9.8G 24K 9.3G 1% /mnt/RAID5
|
||||
|
||||
```
|
||||
|
||||
把硬盘设备/dev/nvme0n2移出磁盘阵列,然后迅速查看/dev/md0磁盘阵列的状态
|
||||
|
||||
```bash
|
||||
[root@localhost ~]# mdadm /dev/md0 -f /dev/nvme0n2
|
||||
mdadm: set /dev/nvme0n2 faulty in /dev/md0
|
||||
# /dev/nvme0n5由原来的spare顶上来变成spare-building
|
||||
[root@localhost ~]# mdadm -D /dev/md0
|
||||
/dev/md0:
|
||||
Version : 1.2
|
||||
Creation Time : Fri Nov 15 10:33:07 2024
|
||||
Raid Level : raid5
|
||||
Array Size : 10475520 (9.99 GiB 10.73 GB)
|
||||
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
|
||||
Raid Devices : 3
|
||||
Total Devices : 4
|
||||
Persistence : Superblock is persistent
|
||||
|
||||
Update Time : Fri Nov 15 10:41:21 2024
|
||||
State : clean, degraded, recovering
|
||||
Active Devices : 2
|
||||
Working Devices : 3
|
||||
Failed Devices : 1
|
||||
Spare Devices : 1
|
||||
|
||||
Layout : left-symmetric
|
||||
Chunk Size : 512K
|
||||
|
||||
Consistency Policy : resync
|
||||
|
||||
Rebuild Status : 11% complete
|
||||
|
||||
Name : localhost.localdomain:0 (local to host localhost.localdomain)
|
||||
UUID : 8f9130a4:06668353:958e7628:985d1167
|
||||
Events : 21
|
||||
|
||||
Number Major Minor RaidDevice State
|
||||
3 259 6 0 spare rebuilding /dev/nvme0n5
|
||||
1 259 4 1 active sync /dev/nvme0n3
|
||||
4 259 5 2 active sync /dev/nvme0n4
|
||||
|
||||
0 259 3 - faulty /dev/nvme0n2
|
||||
# 然后过一会儿,/dev/nvme0n5的状态就会变成active sync
|
||||
```
|
BIN
Linux基础/磁盘阵列RAID/RAID0.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
Linux基础/磁盘阵列RAID/RAID1.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
Linux基础/磁盘阵列RAID/RAID10.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
Linux基础/磁盘阵列RAID/RAID5.png
Normal file
After Width: | Height: | Size: 48 KiB |