zoukankan      html  css  js  c++  java
  • 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目录

  • 相关阅读:
    接口新建学习---边界提取器
    Android Studio打包.so文件教程
    想要开发好的软件,必须学会这几项!
    你应该首先保护哪些应用程序?这个问题本身问错了!
    几周内搞定Java的10个方法
    翻译:程序员做些业余项目的重要性
    【源码】c#编写的安卓客户端与Windows服务器程序进行网络通信
    10款GitHub上最火爆的国产开源项目
    你的Android应用完全不需要那么多的权限
    2015年移动领域发展的九大趋势
  • 原文地址:https://www.cnblogs.com/hjmLinux/p/12486753.html
Copyright © 2011-2022 走看看