Linux磁盘存储和文件系统

概述

设备类型

  块设备:block,存取单位“块”,磁盘

  字符设备:char,存取单位“字符”,键盘

设备文件:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信

设备号码:

  主设备号,次设备号

brw-rw----. 1 root disk 8, 0 Mar 12 16:37 /dev/sda

crw-rw-rw-. 1 root root 1, 5 Mar 12 16:37 /dev/zero  这个设备里面存放的都是0

硬盘存储术语:

  head:磁头

  track:磁道

  cylinder:柱面

  sector:扇区,512bytes

磁盘的使用

1.分区

  两种分区方式:MBR,GPT

  如何分区:按柱面,按扇区

  0磁道0扇区:512bytes 

        446bytes:boot loader

        64bytes:分区表

          16bytes:标识一个分区

        2bytes:55AA 标记位

  MBR:4个主分区:3主分区+1扩展(N个逻辑分区)

    hexdump -C /dev/sdb -n 512  查看/dev/sdb的前512字节

  列出块设备

    lsblk

  创建分区使用:

    fdisk 创建MBR分区

      fdisk /dev/sdb  管理分区

      子命令:

         a   toggle a bootable flag
           b   edit bsd disklabel
           c   toggle the dos compatibility flag
           d   delete a partition
           g   create a new empty GPT partition table
           G   create an IRIX (SGI) partition table
           l   list known partition types
           m   print this menu
           n   add a new partition
           o   create a new empty DOS partition table
           p   print the partition table
           q   quit without saving changes
           s   create a new empty Sun disklabel
           t   change a partition's system id
           u   change display/entry units
           v   verify the partition table
           w   write table to disk and exit
           x   extra functionality (experts only)

    gdisk 创建GPT分区

    parted 高级分区操作

      parted的操作都是实时生效的,小心使用

      parted /dev/sdb mklabel gpt|msdos  标识要创建的分区是MBR还是GPT

      parted /dev/sdb print  输出分区信息

      parted /dev/sdb mkpart primary 1 1200 (默认M)  创建分区

      parted /dev/sdb rm 1  删除分区

      parted -l   列出分区信息

 

  内存与磁盘的分区表做同步:

    6:增加分区partx -a /dev/sdb 删除分区 partx -d --nr 6-8 /dev/sdb

    7:partprobe /dev/sdb  partprobe——重新设置内存中的内核分区表版本,同步分区表

 


 

2.创建文件系统;格式化

 cache与buffer的区别:

    cache:从磁盘中读出数据到cache中,偏向读操作

    buffer:从内存中修改的数据,先放入到buffer中,待系统空闲后再写入到磁盘中,偏向于写操作

  查看当前操作系统支持的文件系统

    /lib/modules/`uname -r`/kernel/fs

    df -T 必须是已经挂载的文件系统

 

  文件系统的分类

    根据其是否支持“journal”功能

      日志型文件系统:ext3,ext4,xfs,......

      非日志型文件系统:ext2,vfat

 

  创建文件系统的工具:

    mkfs命令

      mkfs.FS_TYPE /dev/device

      mkfs -t FS_TYPE /dev/device

         -L 'LABEL':设定卷标

         -b {1024|2048|4096} 指定块大小

    blkid 块设备属性信息查看  只有做好文件系统的分区才能标识到

      查看文件系统类型:blkid /dev/sda1 不加参数是查看所有的磁盘

    -U UUID:根据指定的UUID来查找对应的设备

    -L LABEL:根据指定的LABEL来查找对应的设备

   tune2fs:重新设定ext系列文件系统可调整参数的值

      修改卷标:tune2fs -L '/dev/sdb2' /dev/sdb2

  文件系统的检测和修复(确保文件系统处于umount状态,一定不要再挂载状态下修复)

    fsck /dev/device

 


 

3.挂载:分配目录名

  dd if=/dev/zero of=/data/f1 bs=1M count=20  做一个20M的文件f1

  挂载:将额外文件系统与根文件系统现存的目录建立起关联关系,进而使得此目录作为其他文件访问入口的行为

  注意:

    1.一个挂载点同一时间只能挂载一个设备

    2.一个设备可以挂在多个挂载点上

    3.挂载点下原有文件在挂载成新的设备后会被临时隐藏,建议把设备挂载到空目录

  卸载:为解除此关联关系的过程

    umount 设备名/挂载点

  mount命令

    挂载方法:mount device mount_point  

    mount:通过查看/etc/mtab文件显示当前已挂载的所有设备

    常用选项:

      -r:readonly,只读挂载

      -w:read and write,读写挂载

      -o option:(挂载文件系统的选项),多个选项用逗号分隔

        remount:重新挂载

        ro:只读

        rw:读写

        acl:启用此文件系统上的acl功能

        suid/nosuid:是否支持suid和sgid权限

        exec/noexec:是否支持将文件系统上运行应用程序

        auto/noauto:是否支持自动挂载,是否支持-a选项

        user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用

        async/sync:异步模式/同步模式,内存更改时,同时写磁盘

      defaluts:相当于rw,suid,dev,exec,auto,nouser,async

      -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中又auto功能)

      -L ‘LABEL’:以卷标指定挂载设备

      -U ‘UUID’:以UUID指定要挂载的设备

    查看内核追踪到的已挂载的所有设备

      cat /proc/mounts

  三种挂载形式:

    分区:mount /dev/sdb2 /data/sdb2

    文件夹:mount -B/--bind   绑定目录到另一个目录上

      设置永久挂载

       /boot  /mnt/boot  none  bind  0 0

    文件:mount -o loop /root/p1 /mnt

       设置永久挂载

        /root/p1  /mnt/p1  ext4  loop  0 0

  设置永久挂载:

    /etc/fstab中的内容含义

      设备标识(可以是设备名、LABEL、UUID)  挂载点  文件系统类型  挂载选项  备份   检查次序

      UUID=591d5eac-4f08-43f6-8c5e-9c82382863d8 /boot                xfs         defaults        1   2

    使用mount -a命令挂载/etc/fstab中的所有文件系统

      修改/etc/fstab后,需要重新挂载,再使用mount -a

      mount -o remount /dev/sdb1 /data/sdb1

      mount -a

    /etc/fstab中的UUID如果写错的话,重启机器会导致不能启动

      mount -o rw,remount /

      vi /etc/fstab  改成0 0,所以这个最好写成0 0

      reboot


 

  swap交换分区

    free -m  以MB为单位显示内存

    内存不够时,会使用swap交换分区

  创建swap分区

    1 fdisk /dev/sdb        dd if=/dev/zero of=/swapfile bs=1M count=1024 使用文件当swap分区

      修改分区类型82swap    

      /dev/sdb1

    2 mkswap /dev/sdb1 -L swap_sdb1

    3 vim /etc/fstab

      UUID=xxx  swap  swap  defaults,pri=100  0 0  swap分区有优先级,先使用优先级大的

      /swapfile  swap  swap  defaults  0 0

    4 swapon -a

    5 swapon -s  查看生效

    6 swapoff /dev/sdb1  禁用swap分区


 外围设备的使用

  使用光盘

    创建ISO文件

      cp /dev/cdrom /root/iso

      mkisofs -r -o /root/etc.iso /etc  把etc下所有的文件做成镜像etc.iso

  使用USB介质

    查看USB设备是否识别:

      lsusb

    手动挂载:

      mount /dev/sdf /mnt

常用工具:

    文件系统空间占用等信息的查看工具

      df [OPTION]... [FILE]...

      -h:human-readable

      -T:文件系统类型

    查看某目录总体空间占用状态

      du [OPTION]... [DIR]

      -h:human-readable

      -s:summary

      --max-depth #:指定目录深度

    工具dd:convert and copy a file

      用法:

        dd if=/PATH/FROM/SRC of=/PATH/TO/DEST

        bs=#:block size,复制单元大小(既是ibs也是obs)

        count=#:复制多少bs

        if=file  从所命名文件读取而不是从标准输入

        of=file  写到所命名的文件而不是标准输出

        bs=size 指定块大小

        count=n 只拷贝n个记录

        ibs=size 一次读size个byte

        obs=size 一次写size个byte

        skip=blocks 从开头忽略blocks个ibs大小的块

        seek=blocks 从开头忽略blocks个obs大小的块

        conv=conversion,...

          转换参数:

            notrunc  不截断输出文件

      dd使用范例

        备份MBR:

          dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

        破坏MBR中的64bytes分区表信息:

          dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

        有一个大小是2K的二进制文件fileA,现在想从第64个字节位置开始读取,需要读取的大小是128bytes.

        又有fileB,想把上面读取到的128bytes写到第32个字节开始的位置,替换128bytes:  

          dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

        将本地的/dev/sdx整盘备份到/dev/sdy:

          dd if=/dev/sdx of=/dev/sdy

        将/dev/sdx全盘数据备份到指定路径的image文件

          dd if=/dev/sdx of=/path/to/image


 

RAID管理  多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供

  RAID:Redundant Arrays of Inexpensive(Independent) Disks

  提高IO能力

    磁盘并行读写

  提高耐用性

    磁盘冗余来实现

  级别:多块硬盘组织在一起的工作方式有所不同

  RAID实现的方式:

    外接式磁盘阵列:通过扩展卡提供适配能力

    内接式RAID:主板集成RAID控制器

      安装OS前再BIOS里配置

    软件RAID:通过OS实现

  常用RAID级别

 

 

    RAID-0

      最少磁盘数:2,2+

      读,写性能提升

      无容错能力

      可用空间:N*min(D1,D2,...)

 

 

    RAID-5

      最少磁盘数:3,3+

      读写性能提升

      有容错能力:允许最多一块磁盘损坏

      可用空间:(N-1)*min(D1,D2,...)

    RAID-1      

      最少磁盘数:2,2+

      读性能提升、写性能略有下降

      有冗余能力

      可用空间:1*min(D1,D2,...)

 

 

    RAID-01(先做RAID0,再做RAID1)

 

 

    RAID-10(先做RAID1,再做RAID0)

  创建软RAID(以RAID5为例):

    RAID设备名可命名为/dev/md#(md:multi device) 

    mdadm命令:

      -C:创建模式

        -n #:使用#个块设备来创建此RAID

        -l #:指明要创建的RAID的级别

        -a {yes|no}:自动创建目标RAID设备的设备文件

        -c CHUNK_SIZE:指明块大小,单位k

        -x #:指明空闲盘的个数

          mdadm -C /dev/md0 -a yes -l5 -c 32 -n3 -x1 /dev/sd{b,c,d,e}

      -D:显示RAID的详细信息

        mdadm -D /dev/md#

      管理模式:

        -f:标记指定磁盘为损坏

        -a:添加磁盘

        -r:移除磁盘 

  创建RAID5

  1.准备4块磁盘,大小一致

    dd if=/dev/sdb of=/dev/sdc bs=1 count=66 skip=446 seek=446

    partprobe /dev/sdc

  2.mdadm -C /dev/md0 -a yes -l5 -c 32 -n3 -x1 /dev/sd{b,c,d,e}

  3.mkfs.ext4 /dev/md0

  4.vim /etc/fstab

  5.mdadm -Ds /dev/md0 > /etc/mdasm.conf

  6.mdadm -S /dev/md0  停止

  7.mdadm -A /dev/md0  激活

  8.mdadm /dev/md0 -f /dev/sde  模拟损坏

  9.mdadm /dev/md0 -r /dev/sde  删除

  10.mdadm /dev/md0 -a /dev/sde  增加


 

LVM(逻辑卷管理器)管理

  允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小

  允许多个物理设备间重新组织文件系统

    将设备指定为物理卷

    用一个或者多个物理卷来创建一个卷组

    物理卷是用固定大小的物理区域(physical extent,PE)来定义的

    在物理卷上创建的逻辑卷是由物理区域(PE)组成 ,卷组由PE组成

    可以在逻辑卷上创建文件系统

  设备名:/dev/dm-#

   软连接:

    /dev/VG_NAME/LV_NAME

    /dev/mapper/VG_NAME-LV_NAME

    echo ‘- - -’ > /sys/class/scsi_host/host2/scan  扫描新加进来的硬盘

     新加的lv没有文件系统,要同步一下:resize2fs /dev/vg0/lv0

 

 

 

   pv管理工具

    显示pv信息:pvs/pvdisplay

    创建pv:pvcreate /dev/DEVICE

  vg管理工具

    显示卷组:vgs/vgdisplay

    创建vg:vgcreate -s 16M VG_NAME PhysicalDivecePath PhysicalDivecePath ...

    管理vg:

      vgextend VG_NAME PhysicalDivecePath ...

      vgreduce VG_NAME PhysicalDivecePath...

    删除卷组

      先做pvmove,再做vgremove

    -s:指定PE大小

  lv管理工具

    -L:指定lv大小

    -n:指定lv名字

    显示逻辑卷:lvs/lvdisplay

    创建逻辑卷:

      lvcreate -L #[m,g,t] -n NAME VG_NAME

    删除逻辑卷:

      lvremove /dev/VG_NAME/LV_NAME

    重设文件系统大小:

      resize2fs device

   LVM实验:

    创建:

       pvcreate /dev/sdb1

      pvcreate /dev/sdb2

      vgcreate -s 4M vg0 /dev/sdb1 /dev/sdb2

      lvcreate -L 2G -n lv0 vg0

      mkfs.ext4 /dev/vg0/lv0

      mount /dev/vg0/lv0 /mnt

    扩展:

      lvextend -L +2G /dev/vg0/lv0

      resize2fs /dev/vg0/lv0

      或者直接加-r选项直接同步  lvextend -r -L +2G /dev/vg0/lv0

    缩减;

      umount /mnt

      fsck -f /dev/vg0/lv0

      resize2fs /dev/vg0/lv0 1G

      lvreduce -L 1G /dev/vg0/lv0

      mount /dev/vg0/lv0 /mnt/

    删除VG中的PV:

      pvmove /dev/sdb1

      vgreduce vg0 /dev/sdb1

      pvremove /dev/sdb1

    跨主机迁移卷组:

      源计算机上

        1 在旧系统中,umount所有卷组上的逻辑卷

        2 vgchange -a n vg0

          lvdisplay

        3 vgexport vg0

         pvscan

         vgdisplay

         拆下旧硬盘

      在目标计算机上

        4 在新系统中安装旧硬盘,并vgimport vg0

        5 vgchange -ay vg0

        6 mount所有卷组上的逻辑卷


相关命令:

    hexdump

    lsblk

    fdisk 

    gdisk

    parted

    partx

    partprobe

    mkfs.FS_TYPE

    blkid

    tune2fs

    fsck

    dd

    mount/umount

    free

    mkswap

    swapon

    swapoff

    df

    du


 

 练习:

  1.迁移/home到新分区上

    1 备份/home/*

    2 fdisk 

    3 mkfs.ext4 /dev/sdb1 -L /home

    4 mkdir /mnt/home 

     mount /dev/sdb1 /mnt/home

    5 init 1  单用户模式,网络会断

    6 cp -av /home/* /mnt/home

    7 rm -rf /home/*

    8 vim /etc/fstab

     UUID=xxx /home ext4 defaults 0 0

    9 mount -a

    10 umount /mnt/home 

     rm -rf /mnt/home

    11 init 5

  2.创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标TEST

  要求此分区开机后自动挂载只/test目录,且默认有acl挂载选项

  3.写一个脚本,完成如下功能:

    1 列出当前系统识别到的所有磁盘设备

    2 如磁盘数量为1,则显示其空间使用信息;否则,则显示最后一个磁盘上的空间使用信息

  4.将centos6的两个iso文件合并成一个everything.iso文件,并将其配置成yum源

  5.创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录

posted @ 2020-03-13 15:24  明a  阅读(405)  评论(0编辑  收藏  举报