LINUX.ORG.RU

fdisk некорректно определяет размер диска, который есть в fstab

 , , , ,


0

1

Приветствую!

Есть ось: 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, то проблема решается.



Последнее исправление: Janis (всего исправлений: 1)

Ответ на: комментарий от Pinux001

Так нужно.

Данный диск является архивом, куда система пишет файлы. Без данного диска система считается неработоспособной.

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

Janis
() автор топика

Можно использовать parted. С ключиком -s он позволяет размечать диск в командной строке. Например:

$ parted -s /dev/sdX -- mklabel msdos \
              mkpart primary fat32 64s 4MiB \
              mkpart primary fat32 4MiB -1s

(Взято из info parted. Установлен пакет parted-doc).

forest22
()

Что за дичь вы творите? Из скриптов вызывают sfdisk.
Удаляют разделы:
sfdisk -delete /dev/sda

Очистив нулевой сектор вы не трогаете GPT. Изменив таблицу разделов нужно просить ядро перечитать разделы (blockdev --rereadpt, partprobe)...

mky ★★★★★
()
Ответ на: комментарий от mky

А есть разница при дергании sfdisk и fdisk? У них же просто поток ввода отличный, разве нет?

Нулевой сектор я удаляю т.к. при гуглении своей проблемы нашел, что это может помочь. Мне не помогло, но я просто забыл это удалить. А GPT у меня создается командой g в fdisk.

Зачем перечитывать разделы вручную? Это же делает fdisk после записи изменений на диск. Да и проблема то в другом: у меня до перечивания разделов дело не доходит т.к. fdisk не принимает команду w на такой неадекватный диск. Причем, не принимает он ее даже если не создавать раздел, а просто создать GPT.

Janis
() автор топика
Ответ на: комментарий от Janis

Зачем перечитывать разделы вручную?

Перечитывать разделы вручную при «редактировании» таблицы разделов с помощью dd. Иначе в ядре будет другая информация чем на диске, а утилиты разбития дисков могут общаться с ядром. Может именно в это месте бага в fdisk.

У них же просто поток ввода отличный

Нет sfdisk вобще отличается от fdisk, в нём рабочая часть вашего скритпа превращается в две строки (команды) — создать пустую таблицу gpt и создать один раздел.

Но, главное, fdisk расчитан на интерактивное примение, завтра разработчики могут засунуть дополнительное потдверждение (y). У вас fdisk обновится, скрипт перестанет работать и придётся разбираться. Причём, может оказаться, что на одном диске будет какой-нибудь запрос, допустим, на wipe ФС, а на другом нет, в зависимости от их содержимого.

а просто создать GPT.

Дак у GPT копия в конце диска, видимо у fdisk не получается создать таблицу за границей блочного устройства. Ошибившись с размером диска fdisk создаёт неправильные таблицы и пытается писать в неправильные места. Понятно, что бага в коде fdisk, но здесь, похоже, не нашлось желающих искать её. Так что забейте на fdisk и используйте какую-нибудь другую программу.

mky ★★★★★
()

@mky @forest22 Благодарю. Как оказалось, проблема была не в dd и не в fdisk, а в fstab. Почему то, что parted, что fdisk выдавали ошибки, когда маунт диска был в fstab. Теперь там его нет, но он есть в конце скрипта. Ну и сервис теперь стартует до программы, который нужен архивный диск. Печально, конечно. Не ожидал от fstab’а такой подставы)

Janis
() автор топика