LINUX.ORG.RU

почему может не работать fdisk из скрипта?

 , ,


0

1

добрый вечер!
придумалпытаюсь сделать такую штуку для того, чтобы на флешках DebianLive автоматически при первом запуске создавались партишины для хомяка:

PARTITION="/dev/`lsblk -o name,mountpoint,label,size,uuid | grep LIVEBOOT_HOME | awk '{print $1;}' | sed 's/.-sd\([a-z]\)\([[:digit:]]\)/sd\1\2/g' | sed 's#[^[:alnum:]/]##g'`"
if [ "$PARTITION" = "/dev/" ]; then
    DISK="/dev/`lsblk -o name,mountpoint,label,size,uuid | awk '{if ($2 == "/usr/lib/live/mount/medium") print $1;}'`"
    DISK=${DISK:2:-1}
    PARTITION="${DISK}3"
    if [ ! -e ${PARTITION} ]; then
        (echo n; echo p; echo; echo; echo; echo w) | sudo fdisk ${DISK}
        sync
        reboot
    else
        mkfs.ext4 ${PARTITION}
        e2label ${PARTITION} LIVEBOOT_HOME
        mount ${PARTITION} /mnt
        cp -r /home/* /mnt/
        umount /mnt
        mount ${PARTITION} /home
    fi  
else
    mount ${PARTITION} /home
fi

но строка "(echo n; echo p; echo; echo; echo; echo w) | sudo fdisk ${DISK}" почему-то не отрабатывает

подскажите, плз, где я косячу? или ядру чего-то не хватает? пробовал кастомные сборки 6.1.96 и 6.9.7

p.s. во избежание всяких инсинуаций: стройка "(echo n; echo p; echo; echo; echo; echo w) | sudo fdisk ${DISK}" работает на Devuan4(Debian11), а фигня происходит на Debian12 (Devuan5 не пробовал)
p.s.s. потому что переменная DISK портилась, мой косяк, расходимся :)

★★★★★

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

Гуглить - не наше?

Вот первая ссылка: https://superuser.com/questions/332252/how-to-create-and-format-a-partition-using-a-bash-script Тут и про fdisk (плохая идея) и про sfdisk и про parted…

Но я ОЧЕНЬ не рекомендую тебе этого делать. Особенно с твоим уровнем написания скриптов. А поскольку ты всё равно не послушаешь, хотябы сделай бекап всех важных данных.

(Я сделал всё что мог…)

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

Гуглить - не наше?

Гуглить - очень даже наше :)

sfdisk и parted я пробовал - читай выше
первую ссылку я видел, именно оттуда и взял строчку указаную в посте, точнее - из ответа от товариша ron

// и чем скрипт-то не понравился?..

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

sfdisk и parted я пробовал - читай выше

А вот тут люди создают нормально из скрипта:

Сможешь адаптировать?

И на всякий случай: parted -m "$dsk" print

// и чем скрипт-то не понравился?..

Всем.

Во-первых, когда пишешь скрипт, нельзя использовать команды, которые предполагают интерактивный ввод. Это потому, что интерактивный ввод - для мясных людей: программа может запросто сбрасывать буффер перед вводом, при очредом арейде формат ввода/вывода может леко поменяться и т. п. Для бездушных машин и их скриптов есть параметры командной строки (ну и разные API). Поэтому, перед использованием fdisk люди как правило ищут аналог, который позволяет делать то же, но через параметры коммандной строки. И такое есть: parted. В очень редких случаях, когда альтернативы нет, используют expect.

Во-вторых, твой скрипт вознамерился делать достаточно опасные вещи, а меж тем в нём нет совсем обработки ошибок. Ты или senior 100500 левела, или пока ещё не научен жизнью. Ладно, люди ленивые создания, но поставь хотябы set -e в начало скрипта.

Зачем sudo перед fdisk? sudo вообще в скриптах нельзя ипользовать. Во-первых он предполагает интерактивный ввод. Во-вторых, даже если это обойти, если скрипт требует рутовых привелегий , то пользователь должен сам скрипт запустить от рута. И тебя не смущает, что sudo есть перед fdisk, но отсутствует, например, перед mount и mkfs.ext4?

sync - зачем? reboot - точно нужен? fdisk и parted делают тебе готовые для использования разделы.

Далее, есть вещи, которые у опытных людей просто на автомате. Например, заключать все переменные, да и все строки в двойные кавычки. Использовать конструкцию вида $( ... ) вместо обратных кавычек. Почему ты используешь sh-вариант условий [ ... ] вместо bash [[ ... ]]? В grep в скриптах лучше обозначать начало и конец паттерна, то есть grep ' LIVEBOOT_HOME ' в твём случае, если я всё правильно понял в твоём варианте (я уже молчу о том, что как правило всё можно найти намного проще через /dev; если это метка, то dev/disk/by-label/).

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

спасибо огромное за толковое разъяснение!
и за напоминание про /dev/disk/by-label/

у меня есть только отмазки на тему того, что пишу для себя и это ж пока только пререлизная версия. set -e я убрал из-за какой-то ошибки в скрипте, но сразу не нашел и решил «пока не заморачиваться». sudo забыл убрать с тестовой версии. А sync и reboot - потому что партишин почему-то не создавался без ребута. Но это была еще одна ошибочка.

вообще, я со скриптингом редко сталкиваюсь, и у меня наблюдаются серьезные последствия работы с ash %)

metawishmaster ★★★★★
() автор топика