Вопрос или проблема
Я обновил свою ОС до 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
Применение
Теперь рассмотрим принцип решения, который вы можете применить в своем сценарии:
-
Обновление знаний об утилите: Всегда полезно заглядывать в документацию и читать дату последних изменений, особенно после обновления системы.
-
Проверка устаревших параметров: Необходимо проводить аудит используемых команд и их параметров для выявления устаревших или удаленных функций.
-
Переход на современные аналоги: Как видно из примера, стоит использовать современные параметры и возможности утилиты, избавляясь от устаревших опций.
-
Тестирование на времени выполнения: После внесения изменений в скрипт, выполните его на тестовом окружении, чтобы убедиться, что все работает как задумано.
-
Поддержка кода: Обратите внимание на использование конструкций, таких как
set -e
, чтобы скрипт завершался в случае ошибок, что помогает избежать повреждения данных из-за случайных ошибок.
Таким образом, используя подходы, описанные выше, вы сможете адаптировать свои скрипты для работы с обновленными версиями инструментов и поддерживать их в актуальном состоянии. Необходимо учитывать, что в ИТ-сфере изменения происходят очень быстро, поэтому гибкость и адаптивность — важные качества для успешного решения подобных задач.