Доброе время суток.
Я пытаюсь нарисовать скрипт который должен будет использоваться при установке дистрибутива на компьютер для нахождения всех доступных жестких дисков в системе (PATA/SATA/SCSI)
Покопавшись в нете, ниче толком не нашел, решил сам написать. Вот что получилось: (плз ногами не пинаться)#! /bin/bash
for i in /dev/hd[a-d]; do
DEV_BASE=`basename ${i}`
if [ `cat /proc/ide/${DEV_BASE}/media` = "disk" ]; then
DISK=`fdisk -l /dev/${DEV_BASE} 2>/dev/null | grep "Disk" | awk '{print $3}'`
echo "/dev/${DEV_BASE} - ${DISK}"
fi
donefor i in /dev/sd[a-d]; do
DEV_BASE=`basename ${i}`
if ! [ `cat /sys/block/${DEV_BASE}/device/vendor` = "Linux" ]; then
DISK=`fdisk -l /dev/${DEV_BASE} | grep "Disk" | awk '{print $3}'`
echo "/dev/${DEV_BASE} - ${DISK}"
fi
doneВ результате я получаю список всех (я надеюсь) дисков и их размеры.
Вопрос - можно ли улучшить данный скрипт или может существуют другие более правильные способы определения дисков?
Запанее благодарен!
>Вопрос - можно ли улучшить данный скрипт или может существуют другие более
>правильные способы определения дисков?
Если скрипт работает правильно везде где нужно, то ненужно ничего улучшать, не трать своё время, пиши дальше
>Вопрос - можно ли улучшить данный скрипт или может существуют другие более
>правильные способы определения дисков?Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе и ответ на поставленный вопрос.
>Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе
>и ответ на поставленный вопрос.
А вот где их взять _уже существующие_ ??? Именно поэтому я и обратился к вам за помощью. Т.к. в сетке скоко не рыл - ниче че нашел. Может кто может выложить пример такого скрипта. Думаю и другим пользователям это будет интересно.
>>Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе
>>и ответ на поставленный вопрос.
>
>
>А вот где их взять _уже существующие_ ???Любой дистрибутив?! Можно посмотреть в сторону Knoppix, в последней версии вроде обещали максимально упростить процедуру установки для пользователя.
>for i in /dev/sd[a-d]; do
...
>В результате я получаю список всех (я надеюсь) дисков и их размеры.
>Вопрос - можно ли улучшить данный скрипт ... ?/dev/sd[a-d] - а не маловато ли буквей?
/dev/sd[a-z] - понадежнее будеть :)))а почему решили, что одного fdisk -l недостаточно?
а если
DISK=`fdisk -l /dev/${DEV_BASE} 2>/dev/null | grep "Disk" | awk '{print $3}'`заменитьт на
DISK=`fdisk -l /dev/${DEV_BASE} | awk '/Disk/ {print $3}'`?
#! /bin/bashbackdir=`pwd` # добавляем
cd /dev # две командыfor DEV_BASE in hd[a-d]; do # теперь можем изменить шаблон здесь
#DEV_BASE=`basename ${i}` - в результате выкидываем 4 вызова базенейма и 4 подстановки шелла
...
done
for DEV_BASE in sd[a-z]; do # и здесь тоже
#DEV_BASE=`basename ${i}` - аналогично
...
done
cd $"backdir" # ноу комментс :)
ну еще можно бамнуть здесь
DISK=`fdisk -l /dev/${DEV_BASE} 2>/dev/null | grep "Disk" | awk '{print $3}'`
echo "/dev/${DEV_BASE} - ${DISK}"вот так
echo "/dev/${DEV_BASE} - `fdisk -l /dev/${DEV_BASE} 2>/dev/null| awk '/Disk/ {print $3}'`"
Я пожалуй соглашусь только с замечанием по поводу букв. [a-z] будет правильнее. Насчет всего остального - так поясню, что скрипт бежит на фоне диалога, поэтому приходится добавлять всякие добавки типа &>/dev/null 2>&1 чтобы избежать мусора на экране.
Ну а вот кусок моего готового скрипта если кому-то интересно:###########################################################
# Check all hard disks in system
DISK_LIST=""
DISK_COUNT=0
for i in /dev/hd[a-z]; do
DEV_BASE=`basename ${i}`
if [ `cat /proc/ide/${DEV_BASE}/media` = "disk" ]; then
DISK_SIZE=`fdisk -l /dev/${DEV_BASE} 2>/dev/null | grep "Disk" | awk '{print $5}'`
DISK_SIZE=`expr ${DISK_SIZE} / 1024 / 1024 / 1024`
DISK_LIST="${DISK_LIST}/dev/${DEV_BASE} IDE(PATA)-${DISK_SIZE}Gb "
DISK_COUNT=`expr ${DISK_COUNT} + 1`
fi
done
for i in /dev/sd[a-z]; do
DEV_BASE=`basename ${i}`
if ! [ `cat /sys/block/${DEV_BASE}/device/vendor` = "Linux" ]; then
DISK_SIZE=`fdisk -l /dev/${DEV_BASE} | grep "Disk" | awk '{print $5}'`
DISK_SIZE=`expr ${DISK_SIZE} / 1024 / 1024 / 1024`
DISK_LIST="${DISK_LIST}/dev/${DEV_BASE} SCSI(SATA)-${DISK_SIZE}Gb "
DISK_COUNT=`expr ${DISK_COUNT} + 1`
fi
done
###########################################################
# Show error message in not found hard disks in system
if [ ${DISK_COUNT} -lt 1 ]; then
dialog --clear \
--title "E R R O R" \
--ok-label "Exit" \
--msgbox "
You not have Hard Disks in your computer!
Please install one and run setup again!
" 10 55
clear
${SETCOLOR_CYAN}
echo "Good bye!"
${SETCOLOR_NORMAL}
exit 1
fi
###########################################################
# Let choose hard disk for install
RETURNCODE=0
while test $RETURNCODE != 1 && test $RETURNCODE != 250; do
exec 3>&1
value=`dialog --clear \
--ok-label "Next" \
--cancel-label "Exit" \
--backtitle "${BACKTITLE}" \
--title "DeniX v0.3 installation STAGE 1 of 4" \
--menu "Please select your Hard Disk to install on:" 14 60 ${DISK_COUNT} \
${DISK_LIST} \
2>/tmp/choise 1>&3`
RETURNCODE=$?
exec 3>&-
case $RETURNCODE in
0)
# NEXT was pressed
HD=`cat /tmp/choise`
break
;;
1)
# EXIT was pressed
clear
$SETCOLOR_RED
echo "Setup was terminated by user!"
$SETCOLOR_NORMAL
echo
exit 1
;;
esac
done
>Я пожалуй соглашусь только с замечанием по поводу букв. [a-z] будет правильнее.
>Насчет всего остального - так поясню, что скрипт бежит на фоне диалога, поэтому
>приходится добавлять всякие добавки типа &>/dev/null 2>&1
>чтобы избежать мусора на экране.Так никто выбрасывать ">/dev/null 2>&1" и не предлагал.
Речь идет чтобы выбросить избыточные вызовы программ grep и basename.И снова повторю свой вопрос :) -
а почему решили, что информации, кот. выдает команда fdisk -l недостаточно?
>Так никто выбрасывать ">/dev/null 2>&1" и не предлагал.
>Речь идет чтобы выбросить избыточные вызовы программ grep и basename.
>
>И снова повторю свой вопрос :) -
>а почему решили, что информации, кот. выдает команда fdisk -l недостаточно?
После некоторых проверок, на машинах с SATA дисками на рейд контроллерах команда fdisk -l почемуто обнаруживает в системе добавочный девайс который определяет как диск (размером в 8Мб), но на самом деле это не диск. Я ваще не понимаю что это такое. Так вот чтобы отсечь девайсы такого типа, я и придумал все все эти грепы. И потом надо же отсортировать по отдельности PATA и SATA/SCSI диски. Можно конечно этого и не делать. Это уже так, для красоты. И потом с точки зрения програмиста, меньше команд - лучше. Ну а по мне, не мне же лопатой махать, а процессору. Ну выполнится этот код на секунду дольше - не страшно.