简单来说,使用狂欢特征:

简单来说,使用狂欢特征:

想象一下使用以下命令调整物理卷的大小:

pvresize /dev/sda2 

并且逻辑卷的大小已调整为:

lvresize -l +100%FREE system/home

但这个命令没有执行:

resize2fs /dev/mapper/system-home

由于忘记了上一个命令,因此存在未使用的空间。

如何计算未使用的字节数?

背景:我想编写一个检查脚本,检查服务器上是否忘记了文件系统的大小调整。

顺便说一句:我不信任 shell 脚本。

答案1

整个块设备的默认大小加上在线增长,使得大小检查变得没有必要。resize2fs在所有文件系统上运行。

(如果您的用例需要该尺寸,请编辑您的问题。)

lvresize --resizefs通过添加到脚本或 shell 别名来防止再次忘记文件系统。


理想情况下,容量规划报告中会不断显示空间不足。但愿空间不会变得太满,从而触发即将填满的警报。

答案2

步骤1:识别文件系统边界

dumpe2fs -h /dev/mapper/system-home | grep -E "^Block count|^Block size"

您将通过这两个数字获得文件系统的总大小,例如以下:

Block count:              98304
Block size:               1024    (which is 1k)
FS size = 98304 = **96MB**

第2步:识别块设备边界

A)识别与逻辑卷关联的 dm readlink -f /dev/mapper/system-home,它会为您提供 /dev/dm-XX

b)确定 /dev/dm-XX 边界 cat /sys/block/dm-XX/size,该边界会给出总大小(以 512 字节为单位)块。如果大小为 300000 个块,则您拥有的块数略小于150MB在块设备上

150-96 制造~54MB可用可分配文件系统空间

答案3

我使用一个脚本解决了调整大小的问题,该脚本查找所有涉及的块设备并相应地打印调整大小的命令。

https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh

类似地,您可以将其更改为运行显示块设备大小和文件系统大小的命令。只需看一下脚本,您就会意识到答案有点复杂。

例如想象这样的布局:

  • LUN 的多路径
  • 分区表
  • lvm
  • 加密
  • 文件系统
  • zfs 文件系统

如何找到尺寸:

  • 块设备:blockdev --getsz sdXgrep . /sys/block/*/size
  • lvm:pvs
  • 扩展 2、3、4:dumpe2fs /dev/sdX|egrep '^Block (count|size):'
  • zfs :zpool status,,zpool listzfs list
  • btrfs:
  • xfs:xfs_info
  • 设备映射器:dmsetup table
  • 挂载的文件系统:df

答案4

简单来说,使用特征:

crtdev=/dev/sda9
crtdev=/dev/Vol-1/Root
  1. 设备大小(实际):

    { read devsz;read devss;}< <(blockdev --getsz --getss $crtdev)
    devsize=$((devsz*devss))
    

    注意:您可以使用lsblk以下尺寸列出设备:

    lsblk -no KNAME,NAME,SIZE
    

    这在脚本中可能很有用...请参阅下文!

  2. 文件系统大小(当前)

    1. 为了ext2|ext3|ext4

      while IFS=$':\t\r\n' read fld val;do
          case $fld in
               Block\ size)  fsbs=$val;;
               Block\ count) fssz=$val;;
           esac
      done < <(dumpe2fs 2>&1 -h $crtdev)
      fssize=$((fssz*fsbs))
      
    2. 为了xfs

      XFS 信息无法在已安装的设备上执行,您必须改用 mont-point:

      mntpnt=/mnt
      while IFS=$' =,\t\r\n' read -a lne;do
          [ "$lne" = "data" ] &&
              fsbs=${lne[2]} fssz=${lne[4]}
      done < <( xfs_info $mntpnt )
      fssize=$((fssz*fsbs))
      
    3. 为了ntfs

      事情似乎不那么简单……因为我不经常使用它们,即使我ntfsresize过去已经使用过。有以下几点:

      read fsinfo < <(file -bs $1)
      fssz=${fsinfo#*, sectors } fssz=${fssz%%,*}
      fssize=$(( 512 * ( fssz + 1 ) ))
      

      注意:我讨厌这个:我无法解释+ 1,而且我的一些测试工作+ 8反而……

最后

printf "Dev: %d - FS: %d = Unused: %d\n" $devsize $fssize $(( devsize - fssize ))

lsblk用于扫描所有设备的脚本:

此脚本在不带参数的情况下运行时,将按具有 diff 非空值的设备打印一行。使用任何(虚拟)参数运行时,将按每个设备打印xfs一行ext[234]

由于这种用途高效巴什主义并且有限的分叉lshwdumpe2fs和/或xfs_info只有这个脚本占用非常小的资源。

!! 运行为root或与sudo!!

#!/bin/bash
shopt -s extglob
declare -A KNAMES='()' # Prevent double check
infolog() {
    # Entering this with $kname, $size, $fs, $name, $fsbs and $fssz.
    fssize=$((fssz*fsbs))
    (( $# | size-fssize ))&& # Only if diffsize > 0 or if argument was submited
        printf "%-25s %-6s %15u %15u %14u\n" \
               ${NAME##*/} $FSTYPE $SIZE $fssize $((SIZE-fssize))
}
while read line; do  eval "$line"
    [ "${KNAMES[${KNAME##*/}]}" ] || case $FSTYPE in 
        ext* ) while IFS=$':\t\r\n' read fld val;do
                case $fld in
                    Block\ size)  fsbs=$val;;
                    Block\ count) fssz=$val;;
                esac
            done < <(dumpe2fs 2>&1 -h $KNAME)
            infolog $@ ;;
        xfs ) check=$KNAME
            [ "$MOUNTPOINT" ] && check="$MOUNTPOINT"
            while IFS=$' =,\t\r\n' read -a lne;do
                [ "$lne" = "data" ] &&
                    fsbs=${lne[2]} fssz=${lne[4]}
            done < <( xfs_info "$check" )
            infolog $@ ;;
        ntfs )
            read fsinfo < <(file -Lbs $KNAME)
            fssz=${fsinfo#*, sectors } fssz=${fssz%%,*}
            (( fssz += 1, fsbs=512 ))
            infolog $@ ;;
    esac
    KNAMES[${KNAME##*/}]="done"
done < <(lsblk -bnpPo KNAME,NAME,MOUNTPOINT,FSTYPE,SIZE)

(这稍微缩小了一点以防止 SO 的滚动条;)

示例运行(无参数):

./unused_bytes_by_dev.sh
Vol--I-XDATAS             xfs        48318382080     42949672960     5368709120
sdd1                      ext4        1010774016       175472640      835301376

有一个论点:

./unused_bytes_by_dev.sh dummy
md0                       ext4         246349824       246349824              0
Vol--I-ROOT               ext4        1610612736      1610612736              0
Vol--V-USR                ext4       31138512896     31138512896              0
Vol--I-VAR                ext4       22548578304     22548578304              0
Vol--I-HOME               ext4       34359738368     34359738368              0
Vol--I-XDATAS             xfs        48318382080     42949672960     5368709120
Vol--I-Win                ntfs       42949672960     42949672960              0
sdd1                      ext4        1010774016       175472640      835301376

相关内容