磁盘存储和文件系统
设备类型
块设备
以块为单位进行存储和读取,相当于批量存和批量读
字符设备
以一个字节或者一个字符为单位进行读取和写入.
cp -a /dev/sda /data/sda
mknod /data/sda b 8 1 创建特殊类型的文件
硬盘结构
1.磁头在盘片上进行从里到外-左右移动
2.盘片进行高速旋转
3.磁道 圈和圈之间的空隙(类似于操场的跑道) 每个磁道需要占用6个位来存储,最大值是2^6=64
4.扇区 每个扇区512字节
5.柱面 不同盘片之间的相同磁道组成一个柱面
硬盘的使用
1.分区
2.创建文件系统(格式化)
3.挂载 (把设备名和目录名关联起来)
4.硬盘如果不进行格式化,那么往硬盘上存储和读取数据的时候只能以二进制(0和1)方式来进行,而不能以文件的方式进行访问.
5. hexdump -C /dev/sda | less 直接以二进制或者相关进制的方式来读取硬盘上的数据.
磁盘分区
为什么分区
优化I/O性能
实现磁盘空间配额限制
提高修复速度
隔离系统和程序
安装多个OS
采用不同文件系统
分区方式
分区必须是在一个连续的空间
4个主分区或者3个主分区+1个扩展分区+N个逻辑分区
1.MBR分区
1). hexdump -C /dev/sda -n 512 查看磁盘上前面的512个字节内容
2). dd if=/dev/sda of=/data/mbr_bak bs=1 count=512 读取二进制文件内容,每次读取一个字节,总共读取512个字节
3). dd if=/dev/zero of=/dev/sda bs=1 count=512 用0设备读取数据写到其它二进制文件,每次写入一个字节,总共写512个字节
4). dd if=/data/mbr_bak of=/dev/sda bs=1 count=512 恢复二进制文件内容
5). dd if=/dev/zero of=/dev/sda bs=1 count=2 seek=510 把第511和512个字节清0
2.GPT分区
4个区域:EFI信息区(GPT头)、分区表、GPT分区、备份区域
分区工具fdisk和gdisk
gdisk /dev/sdb 类fdisk 的GPT分区工具
fdisk -l [ -u] [device...] 查看分区
fdisk /dev/sdb 管理分区
子命令:
p 分区列表
t 更改分区类型
n 创建新分区
d 删除分区
v 校验分区
u 转换单位
w 保存并退出
q 不保存并退出
管理分区
列出块设备 lsblk
fdisk创建 MBR分区
gdisk创建 GPT分区
parted高级分区操作
partprobe 同步内存和磁盘上的分区表信息 centos6上无效
partx -a /dev/DEVICE centos6 同步新增分区
partx -d /dev/DEVICE centos6 同步删除分区
分区表存储在两个地方,一个在内存,一个存储在磁盘.
fdisk 查看磁盘上的分区表信息
lsblk 等其它命令查看的是内存上的分区表信息
同步分区表
查看内核是否已经识别新的分区: cat /proc/partations
centos6通知内核重新读取硬盘分区表
新增分区用
partx -a /dev/DEVICE
kpartx -a /dev/DEVICE -f: force
删除分区用 partx -d --nr M-N /dev/DEVICE
CentOS 5,7: 使用
partprobe partprobe [/dev/DEVICE]
文件系统
文件系统分类
根据其是否支持"journal"功能: 日志型文件系统: ext3, ext4, xfs, ...
非日志型文件系统: ext2, vfat
文件系统的组成部分: 内核中的模块:ext4, xfs, vfat
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
Linux的虚拟文件系统:VFS
查前支持的文件系统:cat /proc/filesystems
操作系统中负责管理和存储文件信息的软件结 构称为文件管理系统,简称文件系统
如果没有文件系统,那么我们只能以0和1二进制的方式来访问磁盘上的内容不能以文件的方式来访问磁盘数据.
支持的文件系统:/lib/modules/`uname –r`/kernel/fs
分布式文件系统
把一个文件打散,均匀的存储在不同的机器上.具有对文件备份和容错的功能.
日志型文件系统
日志的功能就是记录了用户对数据的一切操作
如果没有日志系统,用户把数据从磁盘调入内存进行修改后,如果在系统还没开始从内存写入磁盘的时候出现异常,那么只会丢到内存的修改,
磁盘上的原数据并没有被损坏。
如果在系统已经开始从内存写入磁盘的过程中出现异常,那么内存中的数据会丢失,同时磁盘上的原文件内容也会被损坏.
日志系统会在硬盘上单独开辟一块空间进行日志存储(journal)日志和文件是分离的,通过日志可以避免系统异常而导致损坏文件,保证系统的稳定性.
buffer和cache
1. 当用户访问一个文件的时候,磁盘会先把文件存入磁盘的缓存中,然后内存再从磁盘的缓存中读取数据.
2. buffer是为了提高写数据的性能 先把内存中需要写入磁盘的数据存放到buffer中,然后再批量写入磁盘.
3. cache是为了提高读数据的性能 先把需要读取的数据存放到cache中,下次读取的时候直接从cache中读取.
集群文件系统
默认情况下,当多个服务器同时访问同一块磁盘上的同一个文件,就会造成这个文件的数据损坏. 集群文件系统就是为了解决这个问题
块组和簇(windows)的基本概念
文件系统分配给文件的最小单位,一个文件再小也要占用的最少磁盘空间.
创建文件系统
mkfs命令:
(1) mkfs.FS_TYPE /dev/DEVICE ext4 xfs btrfs vfat
(2) mkfs -t FS_TYPE /dev/DEVICE -L 'LABEL': 设定卷标
挂载mount:(普通用户不能挂载)
注意:一个挂载点同一时间只能挂一个设备;一个设备可同时挂载到多个目录
挂载点下的源文件在挂载完成后会被临时隐藏
挂载点:(事先存在,建议使用空目录,进程正在使用中的设备无法被卸载)
挂载:将额外的文件系统与根文件系统某现存的目录建立关联关系,进而使此目录作为其他文件访问入口的行为
卸载:解除此关联关系的过程
挂载方法: mount DEVICE MOUNT_POINT
mount :通过查看/etc/mtab 文件显示当前已挂载的所有设备文件
mount [-fnrsvw] [-t vfstype] [-o options] device dir
-a 实现自动挂载,使修改的配置文件立即生效(若文件中存在,仅修改部分参数,该命令无效,只能用remount 实现重新挂载)
-r 以只读方式挂载设备(只能查看文件,不允许删除)
-w 可读可写(默认)
-n 隐藏挂载(centos6 有效) cat /proc/mounts 即可看到隐藏挂载项
-B 或 –bind 绑定目录到指定目录(目录挂目录)
-o acl //挂载时添加上acl功能
async 异步模式
sync 同步模式,内存更改时,同时写磁盘
noexec 禁止程序执行(但bash 可执行)
remount 重新挂载(特定环境不能取消挂载,即可利用当前命令挂载)
loop 挂载文件到目录上(实现文件模拟分区)
losetup -a // 可查看模拟分区的文件(centos6 默认有8个)
vim /boot/grub/grun.conf //修改kernel行的最后 max_loop=100
查看内核追踪到的已挂载的全部设备: cat /proc/mounts(centos6上)
卸载命令
查看挂载情况: findmnt MOUNT_POINT |device
查看正在访问的指定文件系统的进程
lsof MOUNT_POINT
fuser -v MOUNT_POINT
终止所有正在访问指定的文件系统的进程
fuser -km MOUNT_POINT
卸载
umount DEVICE
umount MOUNT_POINT
实现挂载的永久生效:写入文件/etc/fstab
挂载文件的内容错误:
- UUID错误,重启机器将失败,需将文件的最后内容改为0(即不检查)重启可远程后,修改为正确的UUID即可
- 挂载点出错,重启机器成功,只需重新挂载即可
如何将/home整个目录迁移到一个新的大的磁盘上?
dd /dev/zero /dev/sdb bs=1 count=512 //破坏分区即可删除分区
首先备份/home
- fdisk 先分一个大的分区50G(分区大小不可更改)
- 2 .mkfs.ext4 /dev/sdb1 -L /home 创建文件系统
- mkdir /mnt/home
- mount /dev/sdb1 /mnt/home
- init 1 单用户登录,确保只有自己在访问 (网络出现问题)
- cp -av /home/* /mnt/home/
- rm –rf /home/*
- vim /etc/fstab
UUID=xxxxx /home ext4 defaults 0 0
- mount -a
ls /home /mnt/home -l
- umount /mnt/home ; rm -rf /mnt/home
- init 5
恢复原状态:
- mkdir /mnt/home
- mount /dev/sdb1 /mnt/home
- init 1 ; umount /home
- cp -av /mnt/home/* /home/
- 删除文件中的配置 ; umount /mnt/home
- 删除sdb1分区;( fdisk d 1 w )
文件中写:文件中写:挂载光盘: /dev/sr0 /mnt/cdrom iso9660 defaults 0 0
文件夹挂载到文件夹: /boot /mnt/boot none bind 0 0
将文件挂载目录:/root/p1(设备文件名) /mnt/p1(挂载点) ext4 loop 0 0 (模拟文件分区挂载)
处理交换文件和分区:
交换分区是系统RAM的补充
基本设置包括:创建交换分区或者文件、使用mkswap写入特殊签名、在/etc/fstab文件中添加适当的条目、使用swapon -a 激活交换空间
挂载交换分区:
swapon 启用
-a 激活所有的交换分区
-p PRIORITY 指定优先级
/etc/fstab:pri=value
禁用swapoff [option]… [DEVICE]
SWAP的优先级:
可以指定swap分区0到32767的优先级,值越大优先级越高
如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从 -1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一
先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户 指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
优化性能:分布存放,高性能磁盘存放
swapon [OPTION]… [DEVICE]
-a:激活所有的交换分区
-p PRIORITY:指定优先级
/etc/fstab:pri=value 可写入文件,使之永久生效(禁用swap在启用即可生效)
mkswap 创建文件系统
修改fstab文件: UUID=xxxx 挂载点 swap defaults;pri=100 0 0
swapon -a //使swap分区生效
swapon -s 查看所有生效的swap分区的信息
swapoff 禁用swap分区
扩充swap分区:(该方法需要有磁盘空间)
- 分区,一个2G的swap分区, 改成82类型
- mkswap /dev/sdb1 -L swap_sdb1 创建文件系统
- 修改fstab文件: UUID=xxxx 挂载点 swap defaults 0 0
- swapon -a //使swap生效
使用文件模拟swap:
dd if=/dev/zero of=/swapfile bs=1024M count=2 //生成2G 的swap文件
mkswap /swapfile -L swap_file (t 82 使用fdisk给分区指定文件系统)
修改fstab文件: /swapfile swap(挂载点) swap defaults 0 0
swapon -a //使swap分区生效
eject 弹出光盘
eject -t 弹入光盘.
创建ISO文件: cp /dev/sr0 /data/centos7.iso
dd /dev/sr0 /data/centos7.iso
mkisofs -r -o /data/centos7.iso /etc
合并光盘:(可以用来做yum原,不能用来启动光盘)
mkdir /centos6
cp /mnt/cdrom/* /centos6/ -r (复制两张盘内容到同一文件夹)
mkisofs -r -o /data/centos7.iso /centos6/
挂载USB介质
lsusb 查看USB设备
tail /var/log/messages -f 查看日志文件
查看USB设备是否识别 : lsusb
被内核探测为SCSI设备 :/dev/sdaX、/dev/sdbX、或类似的设备文件
在图形环境中自动挂载 :图标在[计算机]窗口中创建 , 挂载在/run/media//
手动挂载 : mount /dev/sdb1 /mnt
常见工具:
文件系统空间占用等信息的查看工具: df [OPTION]… [FILE]…
-H 以1000为单位
-T 文件系统类型
-h: human-readable 以1024为单位
-i:inodes instead of blocks
-P: 以Posix兼容的格式输出
查看某目录总体空间占用状态: du [OPTION]… DIR (默认统计每个子文件夹的大小)
-h: human-readable (加上单位,默认为K)
-s: summary (总大小) –max-depth (最大深度)
工具dd:(克隆分区只是克隆MBR分区内容)
dd命令:convert and copy a file
用法: dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小
count=#:复制多少个bs
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
conv=conversion[,conversion…] 用指定的参数转换文件
转换参数: ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字 符补齐
备份MBR: dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader: dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
例题:有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读 取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开 始的位置,替换128Bytes,实现如下:
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份:
dd if=/dev/sdx of=/dev/sdy 将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image
将/dev/sdx全盘数据备份到指定路径的image文件 dd if=/dev/sdx | gzip >/path/to/image.gz
备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径
恢复: dd if=/path/to/image of=/dev/sdx 将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx 将压缩的备份文件恢复到指定盘
测试硬盘写速度 dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
测试硬盘读速度 dd if=/root/1Gb.file bs=64k | dd of=/dev/null
修复硬盘 dd if=/dev/sda of=/dev/sda
LVM
逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器、逻辑扇区管理器、逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume management)功能。它在硬盘的硬盘分区之上,又创建一个逻辑层,以方便系统管理硬盘分区系统。
最先由IBM开发,在AIX系统上实现,OS/2 操作系统与 HP-UX也支持这个功能。在1998年,Heinz Mauelshagen 根据在 HP-UX 上的逻辑卷管理器,写作出第一个 Linux 版本的逻辑卷管理器。
Linux中的分区类型:8e
PV(Physical Volume) 物理卷
VG(Volume Group) 卷组
LV(Logical Volume) 逻辑分区
PE(Physical Extent) 物理范围。VG中的最小单元,类似于RAID的chunk大小。
Linux中的设备路径:
/dev/mapper/vg0-lv0
/dev/vg0/lv0
/dev/dm-0
lvm管理工具:
pvs:查看pv信息
pvscan:查看pv信息
pvdisplay:查看pv信息
pvcreate:创建pv
vgs:查看vg信息
vgscan:查看vg信息
vgdisplay:查看vg信息
vgcreate -s 16M vgname /dev/sd# 创建vg
- -s:指定PE大小
lvs:查看lv信息
lvscan:查看lv信息
lvdisplay:查看lv信息
lvcreate -n lvname {-L #G|-l #|} vgname 创建lv
- -n:指定lv的名字
- -L #(G|M):指定lv大小
- -l #%FREE | -l #(PE):指定lv大小
vgrename OLDvgname NEWvgname 重命名vg
lvrename /dev/vgname/OLDlvname /dev/vgname/NEWlvname 重命名lv
实验: 创建逻辑卷: pvcreate /dev/sda7 pvcreate /dev/sdc1 vgcreate -s 16M vg0 /dev/sd{a7,c1} lvcreate -n lv0 -l 100 vg0 lvcreate -n lv1 -l 100%FREE vg0 mkfs.ext4 /dev/vg0/lv0 mount 扩展 lvextend -r -l +100%FREE /dev/vg0/lv0 或者 lvextend -l +100%FREE /dev/vg0/lv0 resize2fs /dev/vg0/lv0 ext xfs_growfs /mnt/lv0 xfs 缩减(注:ContOs7不支持) umount /mnt/lv0 fsck -f /dev/vg0/lv0 resize2fs /dev/vg0/lv0 10G lvreduce -L 10G /dev/vg0/lv0 mount -a 删除VG中PV pvmove /dev/sdd vgreduce vg0 /dev/sdd pvremove /dev/sdd vgrename vg0 centos6vg0 lvrename /dev/centos6vg0/lv0 /dev/centos6vg0/lv0