磁盘存储和文件系统

设备类型

块设备

  以块为单位进行存储和读取,相当于批量存和批量读

字符设备

  以一个字节或者一个字符为单位进行读取和写入.

    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

挂载文件的内容错误

  1. UUID错误,重启机器将失败,需将文件的最后内容改为0(即不检查)重启可远程后,修改为正确的UUID即可
  2. 挂载点出错,重启机器成功,只需重新挂载即可

如何将/home整个目录迁移到一个新的大的磁盘上?

  dd  /dev/zero   /dev/sdb   bs=1   count=512   //破坏分区即可删除分区

     首先备份/home

  1. fdisk 先分一个大的分区50G(分区大小不可更改)
  2.        2 .mkfs.ext4    /dev/sdb1  -L  /home 创建文件系统
  1. mkdir /mnt/home
  2. mount /dev/sdb1 /mnt/home
  3. init 1 单用户登录,确保只有自己在访问  (网络出现问题)
  4. cp -av /home/*    /mnt/home/
  5. rm –rf /home/*
  6. vim /etc/fstab

UUID=xxxxx      /home     ext4     defaults   0  0

  1. mount -a

ls    /home  /mnt/home   -l

  1. umount /mnt/home    ; rm   -rf   /mnt/home
  2. init 5

恢复原状态:

  1. mkdir /mnt/home
  2. mount /dev/sdb1    /mnt/home
  3. init 1    ;     umount     /home
  4. cp -av      /mnt/home/*     /home/
  5. 删除文件中的配置 ;   umount   /mnt/home
  6. 删除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分区:(该方法需要有磁盘空间)

  1. 分区,一个2G的swap分区, 改成82类型
  2. mkswap /dev/sdb1     -L      swap_sdb1    创建文件系统
  3. 修改fstab文件: UUID=xxxx      挂载点    swap      defaults   0   0
  4. 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
原文地址:https://www.cnblogs.com/yaun1498078591/p/8926518.html