On 2019-03-11 15:10:25 -0400, Theodore Ts'o wrote: > Hmm, that message is coming from the lvcreate command. I'm not sure > why it is failing. Can you try running: > > sudo bash -vx /sbin/e2scrub /
#!/bin/bash # Copyright (C) 2018 Oracle. All Rights Reserved. # # Author: Darrick J. Wong <darrick.w...@oracle.com> # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it would be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # Automatically check a LVM-managed filesystem online. # We use lvm snapshots to do this, which means that we can only # check filesystems in VGs that have at least 256MB (or so) of # free space. snap_size_mb=256 + snap_size_mb=256 fstrim=0 + fstrim=0 reap=0 + reap=0 e2fsck_opts="" + e2fsck_opts= conffile="/etc/e2scrub.conf" + conffile=/etc/e2scrub.conf test -f "${conffile}" && . "${conffile}" + test -f /etc/e2scrub.conf + . /etc/e2scrub.conf # e2scrub configuration file # e-mail destination used by e2scrub_fail when problems are found with # the file system. # recipient=root # e-mail sender used by e2scrub_fail when problems are found with # the file system. # sender=e2sc...@host.domain.name # Snapshots will be created to run fsck; the snapshot will be of this size. # snap_size_mb=256 # Set this to 1 to enable fstrim for everyone. # fstrim=0 # Arguments passed into e2fsck. # e2fsck_opts="-vtt" # Set this to 1 to have e2scrub_all scrub all LVs, not just the mounted ones. # scrub_all=0 print_help() { echo "Usage: $0 [OPTIONS] mountpoint | device" echo echo "mountpoint must be on a LVM-managed block device" echo "-r: Remove e2scrub snapshot and exit, do not check anything." echo "-t: Run fstrim if successful." echo "-V: Print version information and exit." } print_version() { echo "e2scrub 1.45.0 (6-Mar-2019)" } exitcode() { ret="$1" # If we're being run as a service, the return code must fit the LSB # init script action error guidelines, which is to say that we # compress all errors to 1 ("generic or unspecified error", LSB 5.0 # section 22.2) and hope the admin will scan the log for what # actually happened. # We have to sleep 2 seconds here because journald uses the pid to # connect our log messages to the systemd service. This is critical # for capturing all the log messages if the scrub fails, because the # fail service uses the service name to gather log messages for the # error report. if [ -n "${SERVICE_MODE}" ]; then test "${ret}" -ne 0 && ret=1 sleep 2 fi exit "${ret}" } while getopts "rtV" opt; do case "${opt}" in "r") reap=1;; "t") fstrim=1;; "V") print_version; exitcode 0;; *) print_help; exitcode 2;; esac done + getopts rtV opt shift "$((OPTIND - 1))" + shift 0 arg="$1" + arg=/ if [ -z "${arg}" ]; then print_help exitcode 1 fi + '[' -z / ']' # Find the device for a given mountpoint dev_from_mount() { local mountpt="$(realpath "$1")" lsblk -o NAME,FSTYPE,MOUNTPOINT -p -P -n 2> /dev/null | while read vars; do eval "${vars}" if [ "${mountpt}" != "${MOUNTPOINT}" ]; then continue fi case "${FSTYPE}" in ext[234]) echo "${NAME}" return 0 ;; esac done return 1 } # Check a device argument dev_from_arg() { local dev="$1" local fstype="$(lsblk -o FSTYPE -n "${dev}" 2> /dev/null)" case "${fstype}" in ext[234]) echo "${dev}" return 0 ;; esac return 1 } mnt_from_dev() { local dev="$1" if [ -n "${dev}" ]; then lsblk -o MOUNTPOINT -n "${dev}" fi } # Construct block device path and mountpoint from argument if [ -b "${arg}" ]; then dev="$(dev_from_arg "${arg}")" mnt="$(mnt_from_dev "${dev}")" else dev="$(dev_from_mount "${arg}")" mnt="${arg}" fi + '[' -b / ']' ++ dev_from_mount / +++ realpath / ++ local mountpt=/ ++ lsblk -o NAME,FSTYPE,MOUNTPOINT -p -P -n ++ read vars ++ eval 'NAME="/dev/sda" FSTYPE="" MOUNTPOINT=""' +++ NAME=/dev/sda +++ FSTYPE= +++ MOUNTPOINT= ++ '[' / '!=' '' ']' ++ continue ++ read vars ++ eval 'NAME="/dev/sda1" FSTYPE="ext2" MOUNTPOINT="/boot"' +++ NAME=/dev/sda1 +++ FSTYPE=ext2 +++ MOUNTPOINT=/boot ++ '[' / '!=' /boot ']' ++ continue ++ read vars ++ eval 'NAME="/dev/sda2" FSTYPE="" MOUNTPOINT=""' +++ NAME=/dev/sda2 +++ FSTYPE= +++ MOUNTPOINT= ++ '[' / '!=' '' ']' ++ continue ++ read vars ++ eval 'NAME="/dev/sda5" FSTYPE="crypto_LUKS" MOUNTPOINT=""' +++ NAME=/dev/sda5 +++ FSTYPE=crypto_LUKS +++ MOUNTPOINT= ++ '[' / '!=' '' ']' ++ continue ++ read vars ++ eval 'NAME="/dev/sr0" FSTYPE="" MOUNTPOINT=""' +++ NAME=/dev/sr0 +++ FSTYPE= +++ MOUNTPOINT= ++ '[' / '!=' '' ']' ++ continue ++ read vars ++ eval 'NAME="/dev/mapper/sda5_crypt" FSTYPE="LVM2_member" MOUNTPOINT=""' +++ NAME=/dev/mapper/sda5_crypt +++ FSTYPE=LVM2_member +++ MOUNTPOINT= ++ '[' / '!=' '' ']' ++ continue ++ read vars ++ eval 'NAME="/dev/mapper/zira--vg-root" FSTYPE="ext4" MOUNTPOINT="/"' +++ NAME=/dev/mapper/zira--vg-root +++ FSTYPE=ext4 +++ MOUNTPOINT=/ ++ '[' / '!=' / ']' ++ case "${FSTYPE}" in ++ echo /dev/mapper/zira--vg-root ++ return 0 ++ return 1 + dev=/dev/mapper/zira--vg-root + mnt=/ if [ ! -e "${dev}" ]; then echo "${arg}: Not an ext[234] filesystem." print_help exitcode 16 fi + '[' '!' -e /dev/mapper/zira--vg-root ']' # Make sure this is an LVM device we can snapshot lvm_vars="$(lvs --nameprefixes -o name,vgname,lv_role --noheadings "${dev}" 2> /dev/null)" ++ lvs --nameprefixes -o name,vgname,lv_role --noheadings /dev/mapper/zira--vg-root + lvm_vars=' LVM2_LV_NAME='\''root'\'' LVM2_VG_NAME='\''zira-vg'\'' LVM2_LV_ROLE='\''public'\''' eval "${lvm_vars}" + eval ' LVM2_LV_NAME='\''root'\'' LVM2_VG_NAME='\''zira-vg'\'' LVM2_LV_ROLE='\''public'\''' LVM2_LV_NAME='root' LVM2_VG_NAME='zira-vg' LVM2_LV_ROLE='public' ++ LVM2_LV_NAME=root ++ LVM2_VG_NAME=zira-vg ++ LVM2_LV_ROLE=public if [ -z "${LVM2_VG_NAME}" ] || [ -z "${LVM2_LV_NAME}" ] || echo "${LVM2_LV_ROLE}" | grep -q "snapshot"; then echo "${arg}: Not connnected to a LVM logical volume." print_help exitcode 16 fi + '[' -z zira-vg ']' + '[' -z root ']' + echo public + grep -q snapshot start_time="$(date +'%Y%m%d%H%M%S')" ++ date +%Y%m%d%H%M%S + start_time=20190312092731 snap="${LVM2_LV_NAME}.e2scrub" + snap=root.e2scrub snap_dev="/dev/${LVM2_VG_NAME}/${snap}" + snap_dev=/dev/zira-vg/root.e2scrub teardown() { # Remove and wait for removal to succeed. ${DBG} lvremove -f "${LVM2_VG_NAME}/${snap}" 3>&- while [ -e "${snap_dev}" ] && [ "$?" -eq "5" ]; do sleep 0.5 ${DBG} lvremove -f "${LVM2_VG_NAME}/${snap}" 3>&- done } check() { # First we recover the journal, then we see if e2fsck tries any # non-optimization repairs. If either of these two returns a # non-zero status (errors fixed or remaining) then this fs is bad. E2FSCK_FIXES_ONLY=1 export E2FSCK_FIXES_ONLY ${DBG} "/sbin/e2fsck" -E journal_only -p ${e2fsck_opts} "${snap_dev}" || return $? ${DBG} "/sbin/e2fsck" -f -y ${e2fsck_opts} "${snap_dev}" } mark_clean() { ${DBG} "/sbin/tune2fs" -C 0 -T "${start_time}" "${dev}" } mark_corrupt() { ${DBG} "/sbin/tune2fs" -E force_fsck "${dev}" } setup() { # Try to remove snapshot for 30s, bail out if we can't remove it. lveremove_deadline="$(( $(date "+%s") + 30))" ${DBG} lvremove -f "${LVM2_VG_NAME}/${snap}" 3>&- 2>/dev/null while [ -e "${snap_dev}" ] && [ "$?" -eq "5" ] && [ "$(date "+%s")" -lt "${lvremove_deadline}" ]; do sleep 0.5 ${DBG} lvremove -f "${LVM2_VG_NAME}/${snap}" 3>&- done if [ -e "${snap_dev}" ]; then echo "${arg}: e2scrub snapshot is in use, cannot check!" return 1 fi # Create the snapshot, wait for device to appear. ${DBG} lvcreate -s -L "${snap_size_mb}m" -n "${snap}" "${LVM2_VG_NAME}/${LVM2_LV_NAME}" 3>&- if [ $? -ne 0 ]; then echo "${arg}: e2scrub snapshot FAILED, will not check!" return 1 fi ${DBG} udevadm settle 2> /dev/null return 0 } if [ "${reap}" -gt 0 ]; then if [ -e "${snap_dev}" ]; then teardown 2> /dev/null fi exit 0 fi + '[' 0 -gt 0 ']' if ! setup; then exitcode 8 fi + setup ++ date +%s + lveremove_deadline=1552379281 + lvremove -f zira-vg/root.e2scrub + '[' -e /dev/zira-vg/root.e2scrub ']' + '[' -e /dev/zira-vg/root.e2scrub ']' + lvcreate -s -L 256m -n root.e2scrub zira-vg/root Volume group "zira-vg" has insufficient free space (0 extents): 64 required. + '[' 5 -ne 0 ']' + echo '/: e2scrub snapshot FAILED, will not check!' /: e2scrub snapshot FAILED, will not check! + return 1 + exitcode 8 + ret=8 + '[' -n '' ']' + exit 8 > as well as sending me the output of "sudo lvs" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root zira-vg -wi-ao---- 457.38g swap_1 zira-vg -wi-ao---- 19.31g -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)