fdisk некорректно определяет размер диска, который есть в fstab
Приветствую!
Есть ось: Debian 10 с ядром 5.10.0.
Есть задача: написать сервис, который будет отрабатывать до монтирования диска из fstab. Сервис должен создавать GPT и один раздел, если диск имеет некорректное кол-во разделов.
Собственно, задачка простенькая. Скрипт написан и протестирован, сервис, дергающий данный скрипт, тоже.
Код сервиса:
[Unit]
Description=Archive disk checker & repairer
Before=archive.mount
[Service]
ExecStart=/opt/bin/archive-checker-repairer.sh
Type=oneshot
[Install]
WantedBy=multi-user.target
Код скрипта:
#!/bin/bash
DISK="/dev/sda"
PARTITIONS_COUNT=$(grep -c '^sda(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' /proc/partitions)
if [ "$PARTITIONS_COUNT" -ne "1" ]; then
echo "The $DISK is not ready to be used as an archive disk Format the $DISK..."
( dd if=/dev/zero of=$DISK bs=512 count=1 ) > /dev/null 2>&1
if [ $? != 0 ]; then
echo "An attempt to format the $DISK failed!"
exit 1
fi
echo "Create new GPT table and partition..."
(
echo g; # Создать GPT таблицу
echo n; # Создать новый раздел
echo 1; # Задать номер раздела
echo ; # Задать начальный размер раздела
echo ; # Задать конечный размер раздела
echo y; # Подтвердить удаление сигнатуры диска (Если ее нет, то эта команда ничего не сделает)
echo w; # Записать изменения на диск
) | ( fdisk $DISK ) > /dev/null 2>&1
if [ $? != 0 ]; then
echo "An attempt to create new GPT table and partition on $DISK failed!"
exit 2
fi
echo "The $DISK was successfully formatted!"
fi
echo "The $DISK is ready to be used as an archive disk!"
exit 0
Строка подключения диска из fstab:
/dev/sda1 /archive ext4 defaults 0 0
При заливке на сервак происходит веселье: fdisk (через который скрипт и выполняет создание GPT и раздела) выдает вот такой перл:
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xfde7c68f.
Command (m for help): g
Created a new GPT disklabel (GUID: EB2D38CB-097B-B648-9A75-10FC948DA4FF).
Command (m for help): n
Partition number (1-128, default 1):
First sector (34-18446744073709551583, default 34):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (34-18446744073709551583, default 18446744073709551583):
Created a new partition 1 of type 'Linux filesystem' and of size 16 EiB.
Command (m for help): w
fdisk: failed to write disklabel: Invalid argument
Почему то, если диск есть в fstab, то fdisk определяет его размер как 16 эксибибайт. Если диск в fstab отсутствует, то его выхлоп следующий:
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognised partition table.
Created a new DOS disklabel with disk identifier 0xe3e8e6bf.
Command (m for help): g
Created a new GPT disklabel (GUID: D47014B4-09D4-4A42-8520-ABC3FE2123DC).
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-2000409230, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-2000409230, default 2000409230):
Created a new partition 1 of type 'Linux filesystem' and of size 953.9 GiB.
Command (m for help): w
Для чистоты эксперимента я распаковал 4 новых одинаковых диска и со всеми ними ситуация идентична.
Есть идеи, почему такое вообще может возникать?
Ответ
Благодарю за помощь. Как оказалось, проблема была не в dd и не в fdisk, а в fstab. Почему то, что parted, что fdisk выдавали ошибки, когда маунт диска был в fstab. Теперь там его нет, но он есть в конце скрипта. Ну и сервис теперь стартует до программы, который нужен архивный диск. Печально, конечно. Не ожидал от fstab’а такой подставы)
Ответ Update
В один прекрасный перезапуск вылезла та же проблема. Закопался в сервисы поглубже и вот что выяснил: проблема возникала из-за того, что мой сервис стартовал до завершения multi-user.target, который является индикатором того, что система готова к использованию. Собственно, если в файле сервиса прописать After=multi-user.target, то проблема решается.