磁盘
机械硬盘-便宜 - 慢-不耐摔
固态硬盘- 贵 -快 -抗震
性能:容量、磁头、速度、品牌、接口、平均寻道时间
接口分类:IDE、SCSI、SATA、SAS、光纤通道
机械硬盘的术语:磁头、磁道、柱面、扇区(512Byte)、圆盘
定位方式:CHS – 物理层(柱面磁头扇区)
LBA – 逻辑层(每个扇区一个编号,如开机启动流程的MBR扇区就是编号为1)
固态硬盘的术语:
SSD固态硬盘就是 – 把磁存储改为集成电路存储(一块PCB板,配件就是控制芯片、缓存芯片和用于存储数据的闪存芯片)
硬盘挂载
物理磁盘插拔
新增一块磁盘不需要关机!
windows的c、d盘都是一块磁盘分区后
类似于linux的sda1、sda2
[root@nfs ~]# fdisk -l
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000ee2e3
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
磁盘 /dev/mapper/centos-root:18.2 GB, 18249416704 字节,35643392 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@nfs ~]# partprobe
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
得重启识别到新增的硬盘sdb(物理磁盘挂载成功)
接下来对其分区(MBR vs GPT)
MBR分区:最多4个分区,如果超过,就会将一个主分区变成一个扩展分区(有多个逻辑分区)
[root@nfs ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x65f0e28f 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G
分区 1 已设置为 Linux 类型,大小设为 5 GiB
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4a32e704
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
不同的分区 可以为 不同的文件系统
windows(NTFS)
linux(ext4 xfs(做数据库推荐) btrs(趋势))
若分区识别不到,可以partprobe去同步一下信息,让操作系统知道这个分区
格式化文件系统:
[root@nfs ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.minix
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs
[root@nfs ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@nfs ~]#
检查是否为ext4文件系统?
[root@nfs ~]# blkid /dev/sdb1
/dev/sdb1: UUID="afe38de5-be5e-411a-b7b4-ec280a272542" TYPE="ext4"
接下来挂载
/mnt1 --> test-mnt1.txt
–>/dev/sdb1
所有的挂载理解为一个入口(会选择空文件夹作为挂载点)
[root@nfs /]# mount /dev/sdb1 /mnt1
[root@nfs /]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 12M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 14G 3.2G 82% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sdb1 ext4 4.8G 20M 4.6G 1% /mnt1
命令行操作都是临时的,永久在/etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Feb 20 21:32:31 2023
#
# 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=c9c7031e-2846-4582-9de4-6b37469f4347 /boot xfs defaults 0 0
#/dev/mapper/centos-swap swap swap defaults 0 0
六列:设备文件/uuid 挂载点 文件系统 挂载选项 要不要被dump备(0-不要) 要不要被fsck检查(0-不要)
#按照fstab文件里重新挂载
[root@nfs /]# mount -a
总结:物理挂载 – 分区 – 格式化文件系统 – 挂载 – 写入fstab
lost+found ext家族文件系统初始化都会有的一个文件夹,它是当文件系统异常的时候,提供一些片段数据来恢复。文件系统异常这下面才会有数据
MBR(Master Boot Record)主引导记录
0柱面0磁头1扇区
为主引导扇区
有三个部分:主引导程序grub446byte,硬盘分区表DPT64byte,分区结束标记2byte
有主引导程序grub2 – /boot里的文件系统的驱动 – 内核文件vmlinuz,initranmfs --systemd进程和kthread进程
GPT分区不受限制,1~128(windows系统),MBR分区只能对2T以下磁盘进行分区,对多4个分区
dos标签:mbr
gpt标签:gpt
命令(输入 m 获取帮助):g
Building a new GPT disklabel (GUID: F379619C-92FA-43C9-93A0-A7B5C6F5CE50)
命令(输入 m 获取帮助):n
分区号 (1-128,默认 1):
第一个扇区 (2048-41943006,默认 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943006,默认 41943006):+2G
已创建分区 1
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@nfs multi-user.target.wants]# fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: F379619C-92FA-43C9-93A0-A7B5C6F5CE50
# Start End Size Type Name
1 2048 4196351 2G Linux filesyste
格式化
[root@nfs multi-user.target.wants]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
挂载
[root@nfs multi-user.target.wants]# mount /dev/sdb1 /mnt1
[root@nfs multi-user.target.wants]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 12M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 14G 3.2G 82% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sdb1 ext4 2.0G 6.0M 1.8G 1% /mnt1
[root@nfs multi-user.target.wants]#
fdisk vs parted都是分区命令,后者既可以交互式又可以命令式(写脚本姿势)
[root@nfs multi-user.target.wants]# umount /mnt1
[root@nfs multi-user.target.wants]# parted -s /dev/sdb mklabe gpt mkpart primary 0 100%
警告: The resulting partition is not properly aligned for best performance.
[root@nfs multi-user.target.wants]# fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: AA376946-5EE4-42FF-A7C5-8DE49EA8E8DB
# Start End Size Type Name
1 34 41943006 20G Microsoft basic primary
[root@nfs multi-user.target.wants]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242871 blocks
262143 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@nfs multi-user.target.wants]# mount /dev/sdb1 /mnt1
[root@nfs multi-user.target.wants]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 12M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 14G 3.2G 82% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 378M 0 378M 0% /run/user/0
/dev/sdb1 ext4 20G 45M 19G 1% /mnt1
[root@nfs multi-user.target.wants]#
swap分区:free -m查看,df -Th里没有
物理内存不足的时候,启动磁盘上的交换分区来做内存使用,不建议开启,慢。
性能监控命令 – 实际都是从/proc里收集的信息
[root@nfs ~]# cd /proc/sys/vm/
[root@nfs vm]# ls
admin_reserve_kbytes lowmem_reserve_ratio oom_dump_tasks
block_dump max_map_count oom_kill_allocating_task
compact_memory memory_failure_early_kill overcommit_kbytes
dirty_background_bytes memory_failure_recovery overcommit_memory
dirty_background_ratio min_free_kbytes overcommit_ratio
dirty_bytes min_slab_ratio page-cluster
dirty_expire_centisecs min_unmapped_ratio panic_on_oom
dirty_ratio mmap_min_addr percpu_pagelist_fraction
dirty_writeback_centisecs mmap_rnd_bits stat_interval
drop_caches mmap_rnd_compat_bits swappiness
extfrag_threshold nr_hugepages user_reserve_kbytes
hugepages_treat_as_movable nr_hugepages_mempolicy vfs_cache_pressure
hugetlb_shm_group nr_overcommit_hugepages zone_reclaim_mode
laptop_mode nr_pdflush_threads
legacy_va_layout numa_zonelist_order
临时修改:改echo 0 >/proc/sys/vm/swappiness
**永久修改:**修改内核参数,在/etc/sysctl.conf
加入内容:vm.swappiness = 0 – (类似于“路径”,根据/proc,不能乱写)
生效:sysctl -p
上述只是修改什么时候转用,而不是直接禁用swap,实际交换分区或许还存在。
临时关闭:swapoff -a /swapon -a临时打开
永久禁用(关闭)交换分区:注释/etc/fstab里的关于swap的,卸载掉。
VFS – 虚拟文件系统(重要!!!)
理解为中间层:为我们的用户程序屏蔽了底层文件系统的差异(xfs,ext家族…),给用户、应用程序一个统一的接口
不在磁盘中:在文件系统挂在之后,将文件系统的一些元数据加载到内存中,只存在于内存中
我们程序不直接和底层真实的复杂的文件系统打交道,只需要和VFS打交道。(VFS帮我去判断)
VFS描述文件系统使用的是超级块和inode的方式
磁盘格式化之后分为两个区 – inode(存放文件元数据);block(存放真正的数据)
元数据:比如说文件名,文件权限,文件创建时间、block的位置指针、等等。区分文件里的内容。如何看:stat file
VFS主要定义了四种对象类型
超级块对象:super block
记录文件系统的总体信息
inode数量、block数量
使用了多少 还剩余多少
属于哪种文件系统 调用方式
如何看ext4文件系统的数:dumpe2fs /dev/sdb1
xfs – xfs_info /dev/sdb1(需要挂载)
blocks一般多于inodes
面试题:明明还有磁盘空间为什么不能创建文件了?inode用完了。
df -i也可以看inodes数
文件系统如何找到文件:
从根/开始找
目录项 :文件夹也是文件,只不过里面保存的都是要放在这个文件夹里面的文件对应的目录项
1.根据文件名通过目录项知道它的inode号
2.通过inode号找到innode table里的inode
3.通过inode里的block指针,找到对应的数据块
inode和block的管理
位图:
使用了–标注1,没有使用–标注0
mv移动文件时,inode不会变,只用变目录项(同一个文件系统移动 )