<linux就该这么学>第六章 存储结构与磁盘划分
了解磁盘如何使用
linux的目录划分
bin目录中都为二进制相关的执行文件
/opt、/usr/local 都是安装第三方软件
/media、/mnt 可以用来挂载目录
/tmp 为用户使用的共享文件夹,/var/tmp为系统使用
物理设备的命名规则
硬盘的命名规则
内核识别主板的硬盘插槽时,是从第一个插槽处开始识别的。
# 规则
/dev/sd{系统内核识别到第n个的插槽处的硬盘}{分区的标号}
# 例子
/dev/sda5
硬盘的分区:
硬盘的第一个扇区保存着主引导记录和分区表信息,但分区表信息只能存储4个,因此如果需要分4个以上的分区,需要将第4个作为一个逻辑分区,用来存储其他的分区信息。
文件系统与数据资料
用户在硬件存储中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的,常见的文件系统包括:
Ext3:日志文件系统,能够在系统异常宕机时,避免文件系统资料的丢失(不能100%保证),会将硬盘的每个写入动作都记录下来,当系统宕机时通过回溯到中断的部分来进行恢复。
Ext4:改进了Ext3,支持无限的子目录,能够批量分配block块,从而极大的提高了读写效率。
XFS:高性能日志文件系统,是RHEL78默认的文件管理系统,在宕机后可以快速的恢复。
在linux中存在一个硬盘地图,文件的信息都存储在‘硬盘地图’中,里面记录着文件系统的信息。文件的权限和属性记录在inode中,而文件的实际内容存储在block中。在inode中存在以下信息:
该文件的访问权限(read、write、execute);
该文件的所有者与所属组(owner、group);
该文件的大小(size);
该文件的创建或内容修改时间(ctime);
该文件的最后一次访问时间(atime);
该文件的修改时间(mtime);
文件的特殊权限(SUID、SGID、SBIT);
该文件的真实数据地址(point)
在我们对不同文件系统 的文件进行操作时,不需要关心底层,是因为linux中为用户提供了一个VFS,让用户对底层没有感觉。
硬件设备的挂载
挂载时,可以使用mount命令或者编辑/etc/fstab文件,使用mout命令只能临时挂载。挂载前需要进行格式化(下边讲解)
# 临时挂载硬盘到目录
mount {硬盘} {挂载到的目录}
# 卸载
umount {硬盘|目录}
# 例:
mount /dev/sdb2 /backup
umount /dev/sdb2
# /etc/fstab文件的格式
{设备文件} {挂载的目录} {格式类型} {权限} {是否备份} {是否自检}
在rhel7开始,任何一个硬盘有错误都没法启动
如果允许自检,自检没通过时,会不能开机,一般用于网络设备
安装硬盘后,可以使用lsblk看硬盘编号
mkfs. 加两个table可以看到能被格式化的格式,
添加硬盘设备
添加硬盘设备并挂载的两种方法:
分区->格式化->挂载
格式化->挂载
fdisk分区
当新添加一块硬盘设备时,我们可以进行协助分区。
# 分区
fdisk
# 格式化分区
mkfs.{格式} 设备
# 查看设备信息
lsblk
# 查看硬盘占用
df -h
>>>
# 因为创建虚拟机的时候第一块硬盘使用的是时nvme,此处添加的硬盘为scic所有新添加的硬盘为sda
[root@linuxprobe /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
[root@linuxprobe /]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.32.1).
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 0xe27b2145.
# 使用n命令,来新建分区
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
# 使用p命令来创建主分区
Select (default p): p
# 指定分区的编号
Partition number (1-4, default 1): 1
# 硬盘从2048开始
First sector (2048-41943039, default 2048):
# 指定2G的大小
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +2G
Created a new partition 1 of type 'Linux' and of size 2 GiB.
# 保存分区
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@linuxprobe /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
└─sda1 8:1 0 2G 0 part
sr0 11:0 1 1024M 0 rom
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
# 按两次tab可以查看,可选的格式
[root@linuxprobe /]# mkfs
mkfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat
mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
[root@linuxprobe /]# mkfs.xfs /dev/sda1
meta-data=/dev/sda1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@linuxprobe /]# mkdir /mysda1
[root@linuxprobe /]# mount /dev/sda1 /mysda1
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 969M 0 969M 0% /dev
tmpfs 984M 0 984M 0% /dev/shm
tmpfs 984M 9.6M 974M 1% /run
tmpfs 984M 0 984M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/nvme0n1p1 1014M 152M 863M 15% /boot
tmpfs 197M 16K 197M 1% /run/user/42
tmpfs 197M 3.5M 194M 2% /run/user/0
/dev/sda1 2.0G 47M 2.0G 3% /mysda1
[root@linuxprobe /]# vim /etc/fstab
# 文件末尾写入以下内容
/dev/sda1 /mysda1 xfs defaults 0 0
# 检查文件格式是否正确
[root@linuxprobe /]# mount -a
常用的一些参数:
du
查看目录中文件占用空间的大小。
[root@linuxprobe /]# du -sh /root
8.5M /root
添加交换分区
交换分区的大小一般建议为物理内存的1.5-2倍。需要先分区,让后使用格式化交换分区命令,并写入/etc/fstab文件
# 将磁盘格式化为
mkswap {磁盘分区}
# 文件格式
/dev/sda2 swap swap defaults 0 0
# 删除分区
# 查看内存占用
free -m
# 同步分区信息
partprobe
>>>
# 分区
[root@linuxprobe /]# fdisk /dev/sda
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (4196352-41943039, default 4196352):
Last sector, +sectors or +size{K,M,G,T,P} (4196352-41943039, default 41943039): +3G
Created a new partition 2 of type 'Linux' and of size 3 GiB.
Command (m for help): p
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
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: 0xe27b2145
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 4196351 4194304 2G 83 Linux
/dev/sda2 4196352 10487807 6291456 3G 83 Linux
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Command (m for help): w
The partition table has been altered.
Syncing disks.
# 格式化
[root@linuxprobe /]# mkswap /dev/sda2
Setting up swapspace version 1, size = 3 GiB (3221221376 bytes)
no label, UUID=fffdecbf-5cee-4f19-a2d1-5ed5118d71f3
# 写入文件
[root@linuxprobe /]# vim /etc/fstab
# 写入以下内容
/dev/sda2 swap swap defaults 0 0
[root@linuxprobe /]# mount -a
磁盘容量配额
可以用来限制用户占用的文件夹最大的容量或者文件数量。限制包括两种:
软限制:当达到软限制时,会提示用户,但仍然允许用户使用
硬限制:当达到硬限制时,会提示用户,强行终止用户的操作
流程:为磁盘增加容量配额的支持 -> 配置用户容量
# 设置硬盘支持容量配额
/dev/sda1 /mysda1 xfs defaults,uquota 0 0
# 使用xfs_quota命令设置限制,-x 代表专家模式,-c 代表使用参数的形式设置限制
xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' {目录}
# 查看限制
xfs_quota -x -c report {目录}
# 修改或者查看配额
edquota -u {用户名}
>>>
[root@linuxprobe /]# mount | grep sda1
/dev/sda1 on /mysda1 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@linuxprobe /]# vim /etc/fstab
# 加uquota
/dev/sda1 /mysda1 xfs defaults,uquota 0 0
[root@linuxprobe /]# reboot
[root@linuxprobe ~]# mount | grep sda1
/dev/sda1 on /mysda1 type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /mysda1
[root@linuxprobe ~]# xfs_quota -x -c report /mysda1
User quota on /mysda1 (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 0 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
[root@linuxprobe ~]# chmod -Rf 777 /mysda1
[root@linuxprobe ~]# su - tom
[tom@linuxprobe ~]$ dd if=/dev/zero of=/mysda1/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.00694646 s, 755 MB/s
[tom@linuxprobe ~]$ dd if=/dev/zero of=/mysda1/tom bs=10M count=1
# 此处会报错
dd: error writing '/mysda1/tom': Disk quota exceeded
1+0 records in
0+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.00848284 s, 494 MB/s
# 编辑配额
[root@linuxprobe ~]# edquota -u tom
# 会显示以下内容,可以进行编辑
Disk quotas for user tom (uid 1002):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 5120 3072 6144 1 3 6
tip:
ext4不能进行容量的配额
软硬链接
可以使用ln命令来创建文件的链接,包括两种:
硬链接:每创建一个链接会对原文件增加一个引用计数inode,只有inode为0的时候,文件才会被删除。
软链接:创建一个指向原文件的链接,如果原文件被删除,则软链接不能正常使用
# 创建硬链接
ln {原文件} {链接名}
# 创建软链接
ln -s {原文件} {链接名}
>>>
[root@linuxprobe ~]# echo 'nihao!' > readme.txt
[root@linuxprobe ~]# ll readme.txt
-rw-r--r--. 1 root root 7 Feb 10 07:50 readme.txt
[root@linuxprobe ~]# ln readme.txt readme.hard
[root@linuxprobe ~]# ll readme.txt
-rw-r--r--. 2 root root 7 Feb 10 07:50 readme.txt
[root@linuxprobe ~]# ln -s readme.txt readme.soft
[root@linuxprobe ~]# ln -s readme.txt readme.soft
ln: failed to create symbolic link 'readme.soft': File exists
[root@linuxprobe ~]# ln -si readme.txt readme.soft
ln: replace 'readme.soft'? y
[root@linuxprobe ~]# cat readme.soft
nihao!
[root@linuxprobe ~]# cat readme.hard
nihao!