sfdisk больше не работает?

Вопрос или проблема

Я обновил свою ОС до Ubuntu GNOME 15.10, но теперь у меня серьезная проблема: sfdisk не работает!

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

Вот скрипт, который я использую:

CARD_DEV=$1

unset LANG

umount ${CARD_DEV}* >& /dev/null

if [ -b "$CARD_DEV" ] ; then
    echo "*************** Форматирование SD-карты... ***************"
    dd if=/dev/zero of=$CARD_DEV bs=1024 count=1024
    SIZE=`fdisk -l $CARD_DEV | grep Disk | awk '{print $5}'`
    echo РАЗМЕР ДИСКА - $SIZE байт
    CYLINDERS=`echo $SIZE/255/63/512 | bc`
    echo ЦИЛИНДРЫ - $CYLINDERS
    {
        echo 1,9,0x0C,*
        echo 10,,,-
    } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $CARD_DEV
    mkfs.vfat -F 32 -n "boot" ${CARD_DEV}1
    mke2fs -j -L "filesystem" ${CARD_DEV}2
fi

И я получаю:

sfdisk: недопустимая опция -- 'D'

 sfdisk [опции] <dev> [[-N] <part>]
 sfdisk [опции] <команда>

Отображение или изменение таблицы разделов диска.

Команды:
 -A, --activate <dev> [<part> ...] показать или установить загрузочные MBR-разделы
 -d, --dump <dev>                  вывести таблицу разделов (можно использовать для последующего ввода)
 -g, --show-geometry [<dev> ...]   показать геометрию всех или указанных устройств
 -l, --list [<dev> ...]            показать разделы каждого устройства
 -s, --show-size [<dev> ...]       показать размеры всех или указанных устройств
 -T, --list-types                  вывести распознаваемые типы (см. -X)
 -V, --verify                      проверить правильность разделов

 --part-label <dev> <part> [<str>] показать или изменить метку раздела
 --part-type <dev> <part> [<type>] показать или изменить тип раздела
 --part-uuid <dev> <part> [<uuid>] показать или изменить UUID раздела
 --part-attrs <dev> <part> [<str>] показать или изменить атрибуты раздела

 <dev>                     путь к устройству (обычно диск)
 <part>                    номер раздела
 <type>                    тип раздела, GUID для GPT, hex для MBR

Опции:
 -a, --append              добавлять разделы в существующую таблицу разделов
 -b, --backup              создать резервную копию секторов таблицы разделов (см. -O)
     --bytes               вывести SIZE в байтах, а не в читаемом формате
 -f, --force               отключить все проверки согласованности
     --color[=<when>]      раскрасить вывод (auto, always или never)
                             цвета отключены по умолчанию
 -N, --partno <num>        указать номер раздела
 -n, --no-act              выполнить все, кроме записи на устройство
     --no-reread           не проверять, используется ли устройство
 -O, --backup-file <path>  изменить имя файла резервной копии по умолчанию
 -o, --output <list>       указать колонки для вывода
 -q, --quiet               подавить дополнительные информационные сообщения
 -X, --label <name>        указать тип метки (dos, gpt, ...)
 -Y, --label-nested <name> указать тип вложенной метки (dos, bsd)

 -L, --Linux               устарело, только для обратной совместимости
 -u, --unit S              устарело, поддерживается только размер сектора

 -h, --help     показать это сообщение и выйти
 -v, --version  вывести информацию о версии и выйти

Доступные колонки (для -o):
 gpt: Устройство Начало Конец Секторы Размер Тип UUID-Тип Атриб Метка UUID
 dos: Устройство Начало Конец Секторы Цилиндры Размер Тип Ид Атриб Загруз Конец-C/H/S
      Начало-C/H/S
 bsd: Раздел Начало Конец Секторы Цилиндры Размер Тип Bsize Cpg Fsize
 sgi: Устройство Начало Конец Секторы Цилиндры Размер Тип Ид Атриб
 sun: Устройство Начало Конец Секторы Цилиндры Размер Тип Ид Флаги

Для получения подробной информации смотрите sfdisk(8).

Версия:

sfdisk из util-linux 2.26.2

Звучит как хорошие новости для меня. Меньше кода — лучше код.

#!/bin/sh

# выйти, если любая команда не удалась
set -e

CARD_DEV=$1

if [ ! -b "$CARD_DEV" ] ; then
    echo $CARD_DEV не является блочным устройством
    exit 1
fi

# так что, надеюсь, это прервется, если мы, например, собираемся уничтожить корневую файловую систему
for mounted in $(findmnt -o source | grep "^$CARD_DEV") ; do
    umount "$mounted"
done

echo "*************** Форматирование SD-карты... ***************"
wipefs --all $CARD_DEV
{
    echo "$((1 * 63 * 255)), $((9 * 63 * 255)), 0x0C, *"
    echo "$((10 * 63 * 255)), , , -"
} | sfdisk $CARD_DEV
mkfs.vfat -F 32 -n "boot" ${CARD_DEV}1
mke2fs -j -L "filesystem" ${CARD_DEV}2

Ответ или решение

Проблема, связанная с неработоспособностью утилиты sfdisk после обновления операционной системы до Ubuntu GNOME 15.10, может возникнуть по нескольким причинам. В вашем случае это связано с изменениями в опциях sfdisk, которые произошли в новых версиях пакета util-linux, из которого она входит.

Теория

Утилита sfdisk используется для управления таблицами разделов дисков. Это мощное средство, особенно подходящее для скриптинга, так как позволяет автоматизировать процессы форматирования и разбиения дисков на разделе. Однако с течением времени и обновлениями операционной системы, использование утилит может изменяться. Разработчики добавляют новые функции и удаляют устаревшие, что и произошло с параметрами -D, -H, и -S.

Изменения в опциях

В вашем скрипте используется команда sfdisk с параметрами -D, -H, и -S, которые устарели. С версии util-linux 2.26, на которую вы перешли, произошли изменения в синтаксисе и поддержке некоторых параметров sfdisk. Это происходит потому, что новые версии стремятся к упрощению интерфейса и повышения безопасности.

Пример

Рассмотрим ваш исходный скрипт, который используете для создания разделов на SD-карте:

CARD_DEV=$1

unset LANG

umount ${CARD_DEV}* >& /dev/null

if [ -b "$CARD_DEV" ] ; then
    echo "*************** Formatting SD card... ***************"
    dd if=/dev/zero of=$CARD_DEV bs=1024 count=1024
    SIZE=`fdisk -l $CARD_DEV | grep Disk | awk '{print $5}'`
    echo DISK SIZE - $SIZE bytes
    CYLINDERS=`echo $SIZE/255/63/512 | bc`
    echo CYLINDERS - $CYLINDERS
    {
        echo 1,9,0x0C,*
        echo 10,,,-
    } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $CARD_DEV
    mkfs.vfat -F 32 -n "boot" ${CARD_DEV}1
    mke2fs -j -L "filesystem" ${CARD_DEV}2
fi

В новой версии возможно избавиться от старых параметров и использовать такой подход:

#!/bin/sh

# Завершение при любой ошибке
set -e

CARD_DEV=$1

if [ ! -b "$CARD_DEV" ] ; then
    echo $CARD_DEV is not a block device
    exit 1
fi

# Пытаемся размонтировать устройства, чтобы избежать случайного форматирования неправильного диска
for mounted in $(findmnt -o source | grep "^$CARD_DEV") ; do
    umount "$mounted"
done

echo "*************** Formatting SD card... ***************"
wipefs --all $CARD_DEV
{
    echo "$((1 * 63 * 255)), $((9 * 63 * 255)), 0x0C, *"
    echo "$((10 * 63 * 255)), , , -"
} | sfdisk $CARD_DEV
mkfs.vfat -F 32 -n "boot" ${CARD_DEV}1
mke2fs -j -L "filesystem" ${CARD_DEV}2

Применение

Теперь рассмотрим принцип решения, который вы можете применить в своем сценарии:

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

  2. Проверка устаревших параметров: Необходимо проводить аудит используемых команд и их параметров для выявления устаревших или удаленных функций.

  3. Переход на современные аналоги: Как видно из примера, стоит использовать современные параметры и возможности утилиты, избавляясь от устаревших опций.

  4. Тестирование на времени выполнения: После внесения изменений в скрипт, выполните его на тестовом окружении, чтобы убедиться, что все работает как задумано.

  5. Поддержка кода: Обратите внимание на использование конструкций, таких как set -e, чтобы скрипт завершался в случае ошибок, что помогает избежать повреждения данных из-за случайных ошибок.

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

Оцените материал
Добавить комментарий

Капча загружается...