0Pricing
DevOps Bootcamp · Урок

Автоматизация дисков, файловых систем и монтирования

Проверяйте блочные устройства, управляйте записями fstab и безопасно автоматизируйте операции LVM и монтирования

«Автоматизация дисков, файловых систем и монтирования» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.

Изучение блочных устройств с помощью lsblk и fdisk

Прежде чем автоматизировать операции с дисками, необходимо уметь проверять, какие блочные устройства существуют в системе. Два основных инструмента для этого — lsblk и fdisk -l.

  • lsblk — выводит блочные устройства в виде дерева, показывая имена устройств, размеры, точки монтирования и типы (disk, part, lvm)
  • fdisk -l — показывает таблицы разделов и сведения о секторах (требуются права root)
  • blkid — выводит UUID и типы файловых систем для каждого блочного устройства

В сценариях часто требуется разобрать этот вывод, чтобы обнаружить доступные диски, проверить форматирование раздела или определить его UUID перед монтированием.

#!/usr/bin/env bash
# Inspect all block devices and their UUIDs
set -euo pipefail

echo '=== Block Device Tree ==='
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID

echo ''
echo '=== Partition Table Details ==='
sudo fdisk -l 2>/dev/null | grep -E '^Disk |^/dev/'

echo ''
echo '=== UUID Lookup via blkid ==='
sudo blkid | awk -F: '{print $1}' | while read -r dev; do
  uuid=$(sudo blkid -s UUID -o value "$dev" 2>/dev/null || echo 'N/A')
  fstype=$(sudo blkid -s TYPE -o value "$dev" 2>/dev/null || echo 'unknown')
  printf '%-20s UUID=%-38s TYPE=%s\n' "$dev" "$uuid" "$fstype"
done

Проверка дискового пространства с помощью df и du

df и du — основные инструменты для получения сведений об использовании файловых систем и каталогов. В сценариях системного администрирования они используются для создания оповещений, контроля квот или определения момента, когда нужно выделить дополнительное пространство.

  • df -h — вывод использования файловых систем в удобном для человека виде для всех смонтированных файловых систем
  • df -BG — вывод в гигабайтах для единообразного разбора чисел
  • du -sh /path — суммарный размер указанного каталога
  • du -d 1 /var — разбивка на один уровень вложенности (полезна для поиска большого подкаталога)

Столбец процента использования из вывода df часто разбирается в сценариях мониторинга для создания оповещений о заполнении диска.

#!/usr/bin/env bash
# Alert if any mounted filesystem exceeds a usage threshold
set -euo pipefail

THRESHOLD=80   # percent

echo 'Checking filesystem usage...'
df -h --output=source,pcent,target | tail -n +2 | while IFS= read -r line; do
  device=$(awk '{print $1}' <<< "$line")
  pct=$(awk '{print $2}' <<< "$line" | tr -d '%')
  mount=$(awk '{print $3}' <<< "$line")

  # Skip pseudo filesystems
  [[ "$device" == tmpfs* || "$device" == devtmpfs* ]] && continue

  if (( pct >= THRESHOLD )); then
    echo "WARNING: $device mounted at $mount is ${pct}% full" >&2
  else
    echo "OK: $device at $mount is ${pct}% used"
  fi
done

Чтение и разбор /etc/fstab

/etc/fstab — это статическая таблица файловых систем. Она определяет, какие устройства монтируются при загрузке системы, в какие пути и с какими параметрами. Каждая строка содержит шесть полей:

  • Устройство — UUID=..., LABEL=... или /dev/sdX
  • Точка монтирования — путь к каталогу
  • Тип файловой системы — ext4, xfs, nfs, tmpfs и т. д.
  • Параметры — defaults, ro, noexec, nofail и т. д.
  • Dump — 0 или 1 (флаг резервного копирования)
  • Pass — 0, 1 или 2 (порядок проверки fsck)

Сценарии, которые добавляют или проверяют записи fstab, должны корректно обрабатывать комментарии (строки, начинающиеся с #) и пустые строки. Всегда отдавайте предпочтение UUID, а не именам устройств: это позволит пережить перезагрузки, при которых порядок устройств может измениться.

#!/usr/bin/env bash
# Parse /etc/fstab and display non-comment entries in a readable table
set -euo pipefail

FSTAB=/etc/fstab

printf '%-40s %-20s %-10s %s\n' 'DEVICE' 'MOUNTPOINT' 'FSTYPE' 'OPTIONS'
printf '%s\n' '-------------------------------------------------------------------------------------'

while IFS= read -r line; do
  # Skip blank lines and comments
  [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue

  read -r device mountpt fstype options _dump _pass <<< "$line"
  printf '%-40s %-20s %-10s %s\n' "$device" "$mountpt" "$fstype" "$options"
done < "$FSTAB"

Безопасное добавление записи в fstab

Ручное редактирование /etc/fstab чревато ошибками. Некорректная запись может помешать загрузке системы. Безопасный сценарий автоматизации должен:

  • проверять, существует ли уже запись, прежде чем добавлять её (идемпотентность)
  • создавать резервную копию исходного файла до любых изменений
  • использовать UUID вместо пути к устройству
  • добавлять nofail к параметрам монтирования, чтобы отсутствие диска не останавливало загрузку
  • выполнять mount -a в режиме пробного запуска или тестового монтирования, чтобы проверить конфигурацию до перезагрузки

После записи всегда проверяйте её с помощью findmnt --verify (доступна в современных дистрибутивах с systemd), чтобы сразу обнаружить синтаксические ошибки.

#!/usr/bin/env bash
# Safely append a new entry to /etc/fstab (idempotent)
set -euo pipefail

DEVICE_PATH='/dev/sdb1'
MOUNTPOINT='/mnt/data'
FSTYPE='ext4'
OPTIONS='defaults,nofail'
FSTAB='/etc/fstab'

# Resolve UUID for stable identification
UUID=$(sudo blkid -s UUID -o value "$DEVICE_PATH")
if [[ -z "$UUID" ]]; then
  echo "ERROR: Could not resolve UUID for $DEVICE_PATH" >&2
  exit 1
fi

ENTRY="UUID=$UUID  $MOUNTPOINT  $FSTYPE  $OPTIONS  0  2"

# Idempotency: skip if UUID already referenced in fstab
if grep -qsF "UUID=$UUID" "$FSTAB"; then
  echo "INFO: fstab already contains UUID=$UUID — skipping."
  exit 0
fi

# Backup
cp -p "$FSTAB" "${FSTAB}.bak.$(date +%Y%m%d%H%M%S)"

# Create mountpoint if needed
sudo mkdir -p "$MOUNTPOINT"

# Append entry
echo "$ENTRY" | sudo tee -a "$FSTAB" > /dev/null
echo "INFO: Added: $ENTRY"

# Validate
sudo findmnt --verify --verbose || echo 'WARNING: findmnt verify reported issues'

Монтирование и размонтирование файловых систем в сценариях

Команды mount и umount просты в использовании, но сценарии должны учитывать особые случаи:

  • устройство может быть уже смонтировано — повторное монтирование завершится ошибкой; проверяйте это с помощью findmnt или mountpoint
  • точка монтирования может быть занята (открыты файлы) — umount завершится ошибкой; используйте lsof +D /mnt/target, чтобы найти процессы, препятствующие размонтированию
  • используйте mount -o remount,ro /mnt/data, чтобы переключить файловую систему в режим «только для чтения» без размонтирования
  • в крайнем случае используйте umount -l /mnt/data (ленивое размонтирование) — оно отсоединяет пространство имён, но ждёт закрытия ссылок

В автоматизации всегда проверяйте код завершения команды mount и записывайте ошибки в syslog с помощью logger.

#!/usr/bin/env bash
# Mount a device only if not already mounted; log outcome
set -euo pipefail

DEVICE='/dev/sdb1'
MOUNTPOINT='/mnt/data'

log() { logger -t disk-mount "$*"; echo "[$(date '+%F %T')] $*"; }

# Check if already mounted
if mountpoint -q "$MOUNTPOINT"; then
  log "INFO: $MOUNTPOINT is already mounted — nothing to do."
  exit 0
fi

# Ensure mountpoint directory exists
sudo mkdir -p "$MOUNTPOINT"

# Attempt mount
if sudo mount "$DEVICE" "$MOUNTPOINT"; then
  log "OK: Mounted $DEVICE at $MOUNTPOINT"
else
  log "ERROR: Failed to mount $DEVICE at $MOUNTPOINT"
  exit 1
fi

# Show what is now mounted there
df -h "$MOUNTPOINT"

Введение в LVM: физические тома, группы томов и логические тома

LVM (Logical Volume Manager) добавляет гибкий уровень абстракции между необработанными блочными устройствами и файловыми системами. Иерархия состоит из трёх уровней:

  • Physical Volume (PV) — необработанный диск или раздел, инициализированный с помощью pvcreate
  • Volume Group (VG) — один или несколько объединённых PV, созданных с помощью vgcreate
  • Logical Volume (LV) — виртуальный раздел, выделенный из VG с помощью lvcreate; именно его форматируют и монтируют

Главное преимущество заключается в том, что LV можно расширять без остановки работы, не размонтируя его, а новые диски можно добавлять в VG без повторного форматирования. Поэтому LVM незаменим для автоматизации хранилищ в производственной среде.

Команды для просмотра состояния: pvs, vgs, lvs, а также их подробные варианты pvdisplay, vgdisplay, lvdisplay.

Создание томов LVM с помощью сценариев

Автоматическая настройка LVM выполняется в строгой последовательности: pvcreate → vgcreate → lvcreate → mkfs → mount. Каждый шаг должен завершиться успешно до запуска следующего — используйте set -euo pipefail и проверяйте результат выполнения каждой команды.

  • Всегда проверяйте, что на целевом диске нет существующей таблицы разделов, прежде чем запускать pvcreate
  • Используйте флаг -y, чтобы отключить интерактивные запросы в неинтерактивных сценариях
  • Указывайте -L (фиксированный размер) или -l 100%FREE, чтобы использовать всё оставшееся пространство
  • После mkfs используйте путь к устройству LV: /dev/<vgname>/<lvname>
#!/usr/bin/env bash
# Automate LVM setup: PV -> VG -> LV -> mkfs -> mount
set -euo pipefail

DISK='/dev/sdc'          # raw disk, no existing partitions
VG_NAME='vg_appdata'
LV_NAME='lv_appdata'
LV_SIZE='10G'
MOUNTPOINT='/mnt/appdata'
FSTYPE='xfs'

echo "[1/6] Initializing Physical Volume on $DISK"
sudo pvcreate -y "$DISK"

echo "[2/6] Creating Volume Group: $VG_NAME"
sudo vgcreate "$VG_NAME" "$DISK"

echo "[3/6] Creating Logical Volume: $LV_NAME (${LV_SIZE})"
sudo lvcreate -y -L "$LV_SIZE" -n "$LV_NAME" "$VG_NAME"

echo "[4/6] Formatting as $FSTYPE"
sudo mkfs."$FSTYPE" "/dev/$VG_NAME/$LV_NAME"

echo "[5/6] Mounting at $MOUNTPOINT"
sudo mkdir -p "$MOUNTPOINT"
sudo mount "/dev/$VG_NAME/$LV_NAME" "$MOUNTPOINT"

echo "[6/6] Done. Disk usage:"
df -h "$MOUNTPOINT"

# Show LVM summary
vgs && lvs

Расширение логического тома без остановки работы

Одна из наиболее мощных возможностей LVM — это изменение размера без остановки работы: логический том и его файловую систему можно расширять, пока они смонтированы и используются. Последовательность действий:

  1. расширьте LV с помощью lvextend (флаг -r изменяет размер файловой системы на том же шаге)
  2. если флаг -r не используется, измените размер файловой системы отдельно: resize2fs для ext4, xfs_growfs для xfs

Важные ограничения:

  • xfs можно только расширять, но нельзя уменьшать — тщательно планируйте объём
  • ext4 можно уменьшать, но только в размонтированном состоянии
  • Перед расширением всегда проверяйте наличие свободного места в VG с помощью vgdisplay -s
#!/usr/bin/env bash
# Extend an LV and its xfs filesystem online
set -euo pipefail

VG_NAME='vg_appdata'
LV_NAME='lv_appdata'
EXTEND_BY='5G'
LV_DEV="/dev/$VG_NAME/$LV_NAME"

# Confirm VG has enough free space
FREE_GB=$(vgs --noheadings --units g -o vg_free "$VG_NAME" | tr -d ' g')
echo "VG free space: ${FREE_GB}G"
if (( $(echo "$FREE_GB < 5" | bc -l) )); then
  echo 'ERROR: Not enough free space in VG' >&2
  exit 1
fi

echo "Extending LV by $EXTEND_BY..."
sudo lvextend -L "+${EXTEND_BY}" "$LV_DEV"

echo 'Growing xfs filesystem online...'
sudo xfs_growfs "$LV_DEV"

echo 'New size:'
df -h "$LV_DEV"
lvs "$LV_DEV"

Создание и форматирование файловых систем

После разметки диска или настройки LVM необходимо отформатировать блочное устройство, создав файловую систему. В администрировании Linux распространены следующие варианты:

  • ext4 — зрелая журнальная файловая система с поддержкой уменьшения размера; используется по умолчанию во многих дистрибутивах (mkfs.ext4)
  • xfs — высокопроизводительная файловая система, предпочтительная для больших файлов и параллельного ввода-вывода; используется по умолчанию в RHEL/CentOS (mkfs.xfs)
  • btrfs — файловая система с копированием при записи и встроенными снимками (mkfs.btrfs)
  • tmpfs — файловая система в RAM, указывается в fstab без mkfs

Всегда задавайте понятную метку файловой системы (флаг -L), чтобы обращаться к устройству через LABEL= в fstab как к запасному варианту вместо UUID.

#!/usr/bin/env bash
# Format a partition and assign a label; print resulting UUID
set -euo pipefail

PARTITION='/dev/sdb1'
FSTYPE='ext4'
LABEL='appdata'

# Safety check: refuse to format a currently mounted device
if findmnt --source "$PARTITION" > /dev/null 2>&1; then
  echo "ERROR: $PARTITION is currently mounted. Unmount first." >&2
  exit 1
fi

echo "Formatting $PARTITION as $FSTYPE with label '$LABEL'..."
sudo mkfs."$FSTYPE" -L "$LABEL" -F "$PARTITION"

# Retrieve and display the new UUID
NEW_UUID=$(sudo blkid -s UUID -o value "$PARTITION")
echo "Formatted successfully."
echo "Label : $LABEL"
echo "UUID  : $NEW_UUID"
echo "Use this in fstab: UUID=$NEW_UUID  /mnt/$LABEL  $FSTYPE  defaults,nofail  0  2"

Автоматизация монтирования NFS с помощью autofs

Для сетевых файловых систем монтирование при загрузке через fstab может приводить к задержкам или ошибкам, если сервер NFS временно недоступен. autofs решает эту проблему, монтируя файловую систему по запросу и размонтируя её после тайм-аута.

  • Главная карта: /etc/auto.master — задаёт каталог точек монтирования и файл карты
  • Прямая карта: /etc/auto.nfs — задаёт параметры и путь к серверу NFS для каждого подкаталога
  • После изменений перезагрузите конфигурацию с помощью systemctl reload autofs
  • Точки монтирования автоматически появляются в настроенном каталоге при обращении к ним

В сценариях можно динамически создавать файл карты из списка общих ресурсов NFS и перезагружать autofs — это удобно для подготовки общего хранилища на множестве узлов.

#!/usr/bin/env bash
# Generate an autofs NFS map file from a share list and reload autofs
set -euo pipefail

NFS_SERVER='192.168.1.50'
AUTO_MAP='/etc/auto.nfs'
AUTO_MASTER='/etc/auto.master'
MOUNT_BASE='/nfs'

# Define shares: localname:remote_path
declare -A SHARES=(
  [homes]='/export/homes'
  [media]='/export/media'
  [backups]='/export/backups'
)

# Write map file
{
  echo '# Generated by disk-automation script'
  for localname in "${!SHARES[@]}"; do
    remote="${SHARES[$localname]}"
    echo "$localname  -rw,soft,timeo=30  ${NFS_SERVER}:${remote}"
  done
} | sudo tee "$AUTO_MAP" > /dev/null

echo "Wrote $AUTO_MAP"

# Ensure master map references this file
if ! grep -qF "$AUTO_MAP" "$AUTO_MASTER"; then
  echo "$MOUNT_BASE  $AUTO_MAP" | sudo tee -a "$AUTO_MASTER" > /dev/null
  echo "Updated $AUTO_MASTER"
fi

sudo systemctl reload autofs && echo 'autofs reloaded'

Снимок LVM для безопасного резервного копирования

Снимки LVM создают копию логического тома в определённый момент времени и позволяют получать согласованные резервные копии работающих файловых систем без их размонтирования. Снимок сохраняет состояние на момент создания с помощью копирования при записи.

  • Создайте снимок: lvcreate -s -n lv_snap -L 2G /dev/vg_data/lv_data
  • Смонтируйте снимок в режиме «только для чтения» для резервного копирования: mount -o ro /dev/vg_data/lv_snap /mnt/snap
  • Выполните rsync или tar для точки монтирования снимка
  • Удалите снимок после резервного копирования: umount /mnt/snap && lvremove -f /dev/vg_data/lv_snap

Размер снимка должен составлять 10–20% от исходного LV. Если снимок заполнится, он станет недействительным — контролируйте его состояние с помощью lvs -o lv_name,snap_percent.

#!/usr/bin/env bash
# Create an LVM snapshot, back up via tar, then remove snapshot
set -euo pipefail

VG='vg_appdata'
ORIGIN_LV='lv_appdata'
SNAP_LV='lv_appdata_snap'
SNAP_SIZE='2G'
SNAP_MOUNT='/mnt/snap_backup'
BACKUP_DEST='/var/backups/appdata'
DATESTAMP=$(date +%Y%m%d_%H%M%S)

trap 'sudo umount "$SNAP_MOUNT" 2>/dev/null; sudo lvremove -f "/dev/$VG/$SNAP_LV" 2>/dev/null' ERR EXIT

echo '[1] Creating snapshot...'
sudo lvcreate -s -n "$SNAP_LV" -L "$SNAP_SIZE" "/dev/$VG/$ORIGIN_LV"

echo '[2] Mounting snapshot read-only...'
sudo mkdir -p "$SNAP_MOUNT"
sudo mount -o ro "/dev/$VG/$SNAP_LV" "$SNAP_MOUNT"

echo '[3] Archiving to backup destination...'
sudo mkdir -p "$BACKUP_DEST"
sudo tar -czf "$BACKUP_DEST/appdata_${DATESTAMP}.tar.gz" -C "$SNAP_MOUNT" .

echo '[4] Cleaning up snapshot...'
sudo umount "$SNAP_MOUNT"
sudo lvremove -f "/dev/$VG/$SNAP_LV"

echo "Backup complete: $BACKUP_DEST/appdata_${DATESTAMP}.tar.gz"

Проверка знаний: безопасная автоматизация fstab и монтирования

Проверьте, насколько хорошо Вы усвоили описанные в этом уроке методы безопасной автоматизации работы с дисками, файловыми системами и монтированием.

Итоги урока: автоматизация работы с дисками, файловыми системами и монтированием

В этом уроке Вы создали полный набор инструментов для безопасного управления дисками и хранилищами с помощью сценариев в системах Linux. Основные выводы:

  • Сначала изучите состояние системы: lsblk, blkid, df и du предоставляют сведения, необходимые до внесения любых изменений.
  • Работайте с fstab дисциплинированно: всегда используйте UUID, всегда добавляйте nofail, всегда создавайте резервную копию перед редактированием и проверяйте конфигурацию с помощью findmnt --verify.
  • Безопасно монтируйте: проверяйте mountpoint -q перед монтированием, записывайте события через logger и обрабатывайте ошибки занятых устройств с помощью lsof.
  • Возможности LVM: цепочка PV → VG → LV позволяет расширять тома без остановки работы и создавать резервные копии на основе снимков.
  • Выбор файловой системы важен: xfs — для производительности (только расширение), ext4 — для гибкости (можно уменьшать в автономном режиме), btrfs — для рабочих нагрузок со встроенными снимками.
  • NFS по запросу: autofs предотвращает задержки при загрузке, монтируя сетевые ресурсы только при обращении к ним.
  • Резервные копии на основе снимков: снимки LVM обеспечивают согласованные резервные копии работающих систем, но необходимо постоянно контролировать snap_percent и своевременно удалять снимки после копирования.

Сочетая эти подходы, Вы сможете надёжно автоматизировать весь жизненный цикл хранилища: обнаружение, подготовку, монтирование, изменение размера и резервное копирование.

Часто задаваемые вопросы

Урок «Автоматизация дисков, файловых систем и монтирования» бесплатный?

Да — полный текст урока «Автоматизация дисков, файловых систем и монтирования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.

Чему я научусь в уроке «Автоматизация дисков, файловых систем и монтирования»?

Проверяйте блочные устройства, управляйте записями fstab и безопасно автоматизируйте операции LVM и монтирования Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DevOps Bootcamp?

Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Автоматизация дисков, файловых систем и монтирования»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DevOps Bootcamp?

Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Автоматизация создания пользователей и групп
  2. Управление службами systemd и создание файлов модулей
  3. Автоматизация дисков, файловых систем и монтирования
  4. Создание скриптов проверки состояния системы и оповещений
← Назад к DevOps Bootcamp