LINUX.ORG.RU

Скрипт автоматического разбиения и выравнивания разделов диска.

 , ,


0

1

Выношу сие на всеобщее обозрение уважаемой публике. Изначально скрипт задумывался для автоматической разбивки диска на разделы при установке системы, но потом получилось, то что получилось. Практическое применение: только для новых дисков или дисков, на которых отсутствует нужная информация.

#!/bin/bash

echo -n 'Enter symbol work disk ( a,b,c ): ' #Выбор диска, который необходимо выровнять или разбить.
read wsymbol
wdisk=/dev/sd$wsymbol

totalsector=`parted $wdisk unit s print y 2>/dev/null | grep "Disk $wdisk:" | cut -d\  -f3 | cut -ds -f1` #Общее чило сеторов на диске.
sizesector=`parted $wdisk unit s print y 2>/dev/null | grep "Sector size" | cut -d\/ -f3 | cut -dB -f1` #Размер сетора в байтах.

echo -n 'What type partition table (gpt msdos): ' #Тип таблицы разделов.
read typetable
echo
echo "Disk: $wdisk"
echo "Type: $typetable"
echo
echo -n "You sure? (y|n): " #Подтверждение выбранных параметорв. Если что-то не устраивает, пока можно исправить =).
read answer

if [ $answer = y ]; then
    parted $wdisk mktable $typetable y
  else
    while [ $answer != y ]; do
        echo -n 'Enter work disk ( a,b,c ): '
        read wsymbol
        wdisk=/dev/sd$wsymbol

        echo -n 'What type partition table (gpt msdos): '
        read typetable
        echo
        echo "Disk: $wdisk"
        echo "Type: $typetable"
        echo
        echo -n "You sure? (y|n): "
        read answer
    done
fi

echo -n 'Enter the total number of partitions (0-9): ' #Общее число партиций на диске.
read numpart
n=3

MiB=$((1024**0))
GiB=$((1024**1))
TiB=$((1024**2))

sectortomb=$((1024**2/$sizesector)) #Количество секторов данной размерности в 1 MiB.
startsector1=$((2*1024**2/$sizesector)) #Начальный сектор. Резон стартовать с 4096 считаю есть.
echo
echo "Full size disk: $(($totalsector/$sectortomb)) MiB" #Просто информация о полной емкости HDD.
echo "Full size disk: $(($totalsector/($sectortomb*$GiB))) GiB"
echo "Full size disk: $(($totalsector/($sectortomb*$TiB))) TiB"
echo
echo -n 'Select units (default=MiB GiB TiB): '
read sunit
  if [ -z $sunit ]; then sunit=MiB; fi

echo -n "Enter size first partition in $sunit (default=100): "
read psize1
  if [ -z $psize1 ]; then psize1=100; fi

  psizes=$(($startsector1/2*$psize1*$sunit-1)) #Пересчет размера партиции в секторах.
  endsector1=$(($startsector1+$psizes))

  parted $wdisk unit s mkpart primary $startsector1 $endsector1 print free

echo -n 'You want to create another partition? (y|n): '
read answer

if [ $answer = y ]
then
  while [ $answer = y ] #Разделы будут создаваться до тех пор, пока Вы не ответите "n",
  do
    while [ $numpart -ge $n ] #и пока значение созданых разделов не привысит указанное значение.
    do
      echo -n 'Select units (MiB default=GiB TiB): '
      read sunit1
        if [ -z $sunit1 ]; then sunit1=GiB; fi
      echo -n "Enter size partition in $sunit1: "
      read psize
      startsector=$((1+`parted $wdisk unit s print | tail -n2 | head -n1 | cut -ds -f2 | cut -d\  -f3`))
      psizes=$(($sectortomb*$psize*$sunit1-1))
      endsector=$(($startsector+$psizes))

      parted $wdisk unit s mkpart primary $startsector $endsector print free
      
      echo -n 'You want to create another partition? (y|n): '
      read answer
      n=$(( $n+1 ))
    done
    answer=n
  done
    startsector2=$((1+`parted $wdisk unit s print | tail -n2 | head -n1 | cut -ds -f2 | cut -d\  -f3`)) #Последний раздел создается автоматически. Это сделано для максимально возможного использования дискового пространства.
    endsector2=$((($totalsector/8-40)*8))
    parted $wdisk unit s mkpart primary $startsector2 $endsector2 print free
fi

totalpart=`parted /dev/sda print | tail -n +8 | cut -d\  -f2` #Список номеров разделов.

parted $wdisk unit GiB print

echo -n 'What a partition is bootable? (1-32): ' #Номер загрузочного раздела. Если таковой не нужен, то ничего вводить не надо.
read bootpart

if [ -n $bootpart ]
then
  parted $wdisk set $bootpart boot on
fi

if [ $typetable = gpt -a -n $bootpart ] #Если таблица GPT и диск загрузочный, то
then
  startgrub=$(($startsector1-$sectortomb))
  endgrub=$(($startsector1-1))
  parted $wdisk unit s mkpart non-fs $startgrub $endgrub print free #создается раздел для GRUB2 загрузчика.

  numgrub=`parted $wdisk print | grep non-fs | cut -d\  -f2`
  parted $wdisk set $numgrub bios_grub on
fi

echo -n 'Select number partition for SWAP (1-32): '
read nswap

echo -n 'Select type fs (ext2,3,4): ' #Тип файловой системы, впринципе можно указать любую.
read typefs

for i in $totalpart
do
  if [ $i -ne $nswap ]
  then
    mkfs.$typefs $wdisk$i
  else
    mkswap $wdisk$nswap
    swapon $wdisk$nswap
  fi
done

parted $wdisk unit s print free
parted $wdisk unit KiB print free
parted $wdisk unit GiB print

echo 'with best wishes Avarex'

ПС: в процессе столкнулся с проблемой указания диапазона для for: for i in [1-3]; do echo $i; done => выводит [1 и 3]. Почему не выводит 1 2 3? (раньше, по моему, так было).

[code=bash], пожалуйста, для читабельности

Deleted ()

[code=bash].

Почему ты нигде не проверяешь ввод? Хотя бы регуляркой. И вообще есть такая конструкция "select".

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

Думал только для собственного применения... вообще даже и не подумал об этом, Но можно и доделать.

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

оно, оно... собственно с этого все и началось, мне показалось удобным вводить размеры партиций в метрах или гигах, а расчет на калькуляторе (телефоне) меня напрягает. Кроме этого если приходится разбивать диск, на котором уже есть разделы, то разумеется приходиться... только я пользую:

parted -a optimal

avarex ()

Почему не выводит 1 2 3? (раньше, по моему, так было).

{1..3}

{1..10..2} выводит 1 3 5 7 9

по теме: чем это лучше cfdisk'а?

emulek ()
Ответ на: комментарий от avarex

мне показалось удобным вводить размеры партиций в метрах или гигах

В fdisk только так и делаю . Суффиксы M, G, T отлично работают.

а расчет на калькуляторе (телефоне) меня напрягает

Ключ -u к fdisk .

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

я раньше юзал и fdisk и cfdisk, но потом стали приносить диски с гпт и ни одинн из них не справлялся. Переключился на партед и с тех пор он меня только радует =).

avarex ()

gdisk выравнивает разделы сам. Зачем нужен этот скрипт?

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

давно отказался от fdisk'a - не работал с GPT.

Уже работает.

Сорри, что разочаровываю :) . Де-факто ты создал скрипт, который преобразовывает gparted в fdisk .

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

я раньше юзал и fdisk и cfdisk, но потом стали приносить диски с гпт и ни одинн из них не справлялся.

есть и fdisk и cfdisk для gpt.

Переключился на партед и с тех пор он меня только радует

ага, это ещё портянку за собой твою тащить надо?

emulek ()
Ответ на: комментарий от avarex

Извиняюсь что вмешиваюсь. Которые? 20гиговые с плохо промытыми от флюса платами? Мне таких два десятка на халяву как то досталось. Восстановил, гонял в райде, 6 штук до сих пор живы.

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

там были всякие и 20-ти гиговые и 10 и 40. тебе повезло.

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

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

IMHO там и gdisk для GPT лежит. Он выравнивает. А партед для просто создания разделов - overkill. Вот когда надо двигать, тогда да... Хотя я предпочитаю сразу lvm на весь диск и двигать уже в его рамках.

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

зачем мне партед, если есть cfdisk? С которым не надо ломать голову, и что-то там вычислять.

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

Ключ -u к fdisk

вот недавно читал, что такая конструкция не всегда (не на всех дисках) работает. Хотя могу предположить, что статья была не 14года.

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

ну так их до-сих пор никто не покупает... хотя теперь их винты, НАВЕРНО, надежны не менее, чем тот же сигейт.

После того как я их промыл\прогрел - работали нормально, умирали из за естественного износа, судя по smart. Вполне внятные винты были, за вычетом технологического косяка с флюсом. Не то что стеклянные дятлы от ИБМ. Вот уж уродцы так уродцы - на все времена, генетически...

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

ну так их до-сих пор никто не покупает... хотя теперь их винты, НАВЕРНО, надежны не менее, чем тот же сигейт.

Есть баги, которые проявляются раз в год или два. И при этом тянут за собой все твои данные. А поддержка GPT - она либо работает либо нет. Проверяется легко, последствий не вызывает.

P. S. У меня похожее было:
http://www.opennet.ru/tips/info/2665.shtml
Смотреть коммент 1.4

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

дружище, ты красавчеГ, если их восстановил и они у тебя работают до сих пор, но мы о другом... Дело в том, что заслужить доверие тяжело, потерять его легко, а восстановить доверие - практически не возможно.

фдиск отличная прога не спорю, но в нужный момент не выполнила, того чего мне было от нее нужно.

айбием всегда обходил стороной.

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

согласен разные вещи, но факт остается фактом... в ответственный момент пришлось осваивать партед.

кста! еще одна ситуевина на мозг пришла нтфс 4 и 5 (если я не ошибаюсь в версиях).

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

фдиск отличная прога

Только не работала с GPT и выравнивать не умеет. Поэтому ты и писал скрипт. Я это понял. Я, кстати про ключик -u к фдиск тоже только тут узнал. Я писал про gdisk. Это fdisk для GPT. С выравниванием. Тоже есть на LiveDVD. К нему есть морда для ленивых - cgdisk, я ей правда не пользовался. Её IMHO на LiveDVD gentoo нет. Думаю, если бы ты сразу знал про существование gdisk - не тратил бы время на скрипт и возню с parted, IMHO для такой элементарной задачи parted - overkill.

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

по существу:

Поэтому ты и писал скрипт. Я это понял.

изначально никто ничего выравнивать автоматом не мог, поэтому приходилось все делать в ручную. Когда все научились выравнивать и ГПТ понимать, то скрипт уже был.

Считаю, что скрипт позволяет (да, проверочку надо бы добавить) избежать ошибок по-запарке. Вместо sdc поправить таблицу sda, т.е. как-то удобно, чёле.

Также благодаря скрипту достаточно вводить символы типа y, GiB, 100, 1 и пр. а не писать строки.

Кроме этого данный скрипт является частью установочного скрипта для дженты. Переменные используются в другом скрипте.

вот как-то так.

не по суЧеству:

Тоже есть на LiveDVD

юзаю минимал.исо.

Кста вопр, по ливдвд: у меня есть два образа 1. livedvd-amd64-multilib-2012.1 2. livedvd-amd64-multilib-20121221 какой посоветуешь юзать если чё?

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

Кста вопр, по ливдвд: у меня есть два образа 1. livedvd-amd64-multilib-2012.1 2. livedvd-amd64-multilib-20121221 какой посоветуешь юзать если чё?

Я уже года два как на Calculate уехал, он сдорово время экономит. На работе использую бинарный стабильный профиль, а дома ~ из исходников естественно. Ядро на работе дефолтное, дома самосбор. По сути та же гента, только с уже настроенными десктопом и удобными (мне) скриптами. Так что LiveDVD я использую от Calculate. Там кстати система полноценная, чистую генту из под него поставить тоже можно. Для всякого ремонта, спасения и нестандартных случаев использую SystemRescueCD.

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

теперь их винты, НАВЕРНО, надежны не менее, чем тот же сигейт.

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

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

я тоже предпочитаю ВД, но сравнивать даже сигейт, не говоря уже про фуджики, с ВД считаю не возможным.

avarex ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.