目录
磁盘硬件
HDD (Hard Disk Drive)
-
组成 => 缓存 + 磁头 + 盘片
-
性能 => 缓存 + 转速 (5.4k/7.2k/10k/15k RPM) + 尺寸 (3.5/2.5 英寸)
-
接口 => SATA (桌面 100MB/s) + SAS (服务器 200MB/s)
SSD (Solid State Drive)
-
接口 => SATA + M.2
-
通道 => SATA + PCI-E (PCI-Express)
-
协议 => AHCI (Advanced Host Controller Interface) + NVMe (Non-Volatile Memory express)
接口 | 通道 (总线) | 协议 | 速度 (实际) |
---|---|---|---|
SATA | SATA | AHCI | 500MB/s |
M.2 | SATA | AHCI | 500MB/s |
M.2 | PCI-E | NVMe | 3000MB/s |
磁盘阵列
RAID (Redundant Array of Independent Disk) 独立冗余磁盘阵列
RAID | 原理 | 存储效率 | 优缺点 |
---|---|---|---|
RAID0 | Disk 1 => A1 A3 A5 A7 Disk 2 => A2 A4 A6 A8 |
100% | 读写性能高 但是无冗余 |
RAID1 | Disk 1 => A1 A2 A3 A4 Disk 2 => A1 A2 A3 A4 |
50% | 读写性能低 但是有冗余 |
RAID5 | Disk 1 => A1 B1 C1 Dp Disk 2 => A2 B2 Cp D1 Disk 3 => A3 Bp C2 D2 Disk 4 => Ap B3 C3 D3 |
75% | 读性能高 写性能低 且有冗余 |
RAID10 | Disk 1 => A1 A3 A5 A7 Disk 2 => A1 A3 A5 A7 Disk 3 => A2 A4 A6 A8 Disk 4 => A2 A4 A6 A8 |
50% | 读写性能高 并且有冗余 |
文件系统
-
什么是文件系统 文件系统是一种存储和组织计算机数据的方法
-
文件系统的理解 底层是块存储 上层是文件存储
-
文件系统的实现
data block => 实际存储的数据
super block => 文件系统信息 data block和inode总数/已使用/未使用
inode => 文件目录结构、类型、大小、所有者、修改时间、data block
// 查看文件系统信息
df -hT
// block size 4096
dumpe2fs -h /dev/vda1
如何理解Windows FAT最大支持2G文件大小?
- 什么是磁盘分区 分区是同一个磁盘的逻辑划分 划分成多个磁盘和文件系统
主分区 最多只有4个
主分区 才能作为引导分区
- 文件系统的挂载 根文件系统的挂载 基于Linux 0.11 Kernel
// 系统初始化时挂载根文件系统
void mount_root(void)
{
int i, free;
struct super_block *p;
struct m_inode *mi;
if (32 != sizeof(struct d_inode))
panic("bad i-node size");
// 初始化file结构体列表,struct file file_table[NR_FILE];
for (i = 0; i < NR_FILE; i++)
file_table[i].f_count = 0;
// 如果根文件系统是软盘提示插入软盘
if (MAJOR(ROOT_DEV) == 2)
{
printk("Insert root floppy and press ENTER");
wait_for_keypress();
}
// 初始化超级块列表
for (p = &super_block[0]; p < &super_block[NR_SUPER]; p++)
{
p->s_dev = 0;
p->s_lock = 0;
p->s_wait = NULL;
}
// 读取某个设备(硬盘分区)中的超级块,即根文件系统的超级块
if (!(p = read_super(ROOT_DEV)))
panic("Unable to mount root");
// 获取根文件系统的第一个inode节点,里面存的是根目录的数据
if (!(mi = iget(ROOT_DEV, ROOT_INO)))
panic("Unable to read root i-node");
// mi在下面四个地方有赋值,iget里面的get_empty_inode函数已经设置i_count=1,所以这里加三就行
mi->i_count += 3; /* NOTE! it is logically used 4 times, not 1 */
// 超级块挂载到了mi对应的inode节点,p->s_isup设置根文件系统的根节点
p->s_isup = p->s_imount = mi;
// 设置当前进程的根文件目录和当前工作目录
current->pwd = mi;
current->root = mi;
free = 0;
// 文件系统的逻辑数据块和inode数量
i = p->s_nzones;
while (--i >= 0)
if (!set_bit(i & 8191, p->s_zmap[i >> 13]->b_data))
free++;
printk("%d/%d free blocks\n\r", free, p->s_nzones);
free = 0;
i = p->s_ninodes + 1;
while (--i >= 0)
if (!set_bit(i & 8191, p->s_imap[i >> 13]->b_data))
free++;
printk("%d/%d free inodes\n\r", free, p->s_ninodes);
}
案例实战
- 案例1: RC服务器磁盘占用90%+
// 查看文件系统信息
df -hT
// 查看当前文件夹大小
du -sh .[!.]* * | sort -hr | head
- 案例2: 服务器挂载新的数据盘
添加新磁盘 => 阿里云
fdisk -l // 查看分区
mkfs -t ext4 /dev/sdb1 // 格式化分区
mount /dev/sdb1 /opt/ // 建立挂载点
vim /etc/fatab // 开机自动挂载
image.png
image.png
网友评论