The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Скрипт определения жестких дисков"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Скрипт определения жестких дисков"  
Сообщение от den23513 email(??) on 13-Мрт-06, 20:16 
Доброе время суток.
Я пытаюсь нарисовать скрипт который должен будет использоваться при установке дистрибутива на компьютер для нахождения всех доступных жестких дисков в системе (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
done

for 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

В результате я получаю список всех (я надеюсь) дисков и их размеры.
Вопрос - можно ли улучшить данный скрипт или может существуют другие более правильные способы определения дисков?
Запанее благодарен!

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Скрипт определения жестких дисков"  
Сообщение от Николас on 14-Мрт-06, 05:33 

>Вопрос - можно ли улучшить данный скрипт или может существуют другие более
>правильные способы определения дисков?


Если скрипт работает правильно везде где нужно, то ненужно ничего улучшать, не трать своё время, пиши дальше

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Скрипт определения жестких дисков"  
Сообщение от chip email(ok) on 15-Мрт-06, 09:31 
>Вопрос - можно ли улучшить данный скрипт или может существуют другие более
>правильные способы определения дисков?

Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе и ответ на поставленный вопрос.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Скрипт определения жестких дисков"  
Сообщение от den23513 email(??) on 15-Мрт-06, 19:39 
>Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе
>и ответ на поставленный вопрос.


А вот где их взять _уже существующие_ ??? Именно поэтому я и обратился к вам за помощью. Т.к. в сетке скоко не рыл - ниче че нашел. Может кто может выложить пример такого скрипта. Думаю и другим пользователям это будет интересно.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Скрипт определения жестких дисков"  
Сообщение от chip email(ok) on 16-Мрт-06, 11:48 
>>Прежде чем изобретать велосипед, нужно _как минимум_ изучить уже существующие. Вот тебе
>>и ответ на поставленный вопрос.
>
>
>А вот где их взять _уже существующие_ ???

Любой дистрибутив?! Можно посмотреть в сторону Knoppix, в последней версии вроде обещали максимально упростить процедуру установки для пользователя.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Скрипт определения жестких дисков"  
Сообщение от BigShadow on 21-Мрт-06, 13:31 
>for i in /dev/sd[a-d]; do
...
>В результате я получаю список всех (я надеюсь) дисков и их размеры.
>Вопрос - можно ли улучшить данный скрипт ... ?

/dev/sd[a-d] - а не маловато ли буквей?
/dev/sd[a-z] - понадежнее будеть :)))

а почему решили, что одного fdisk -l недостаточно?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Скрипт определения жестких дисков"  
Сообщение от BigShadow on 21-Мрт-06, 13:37 
а если
DISK=`fdisk -l /dev/${DEV_BASE} 2>/dev/null | grep "Disk" | awk '{print $3}'`

заменитьт на
DISK=`fdisk -l /dev/${DEV_BASE} | awk '/Disk/ {print $3}'`

?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

7. "Скрипт определения жестких дисков"  
Сообщение от BigShadow on 21-Мрт-06, 13:49 
#! /bin/bash

backdir=`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" # ноу комментс :)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Скрипт определения жестких дисков"  
Сообщение от BigShadow on 21-Мрт-06, 14:56 
ну еще можно бамнуть здесь
    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}'`"

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Скрипт определения жестких дисков"  
Сообщение от den23513 email(??) on 27-Мрт-06, 21:57 
Я пожалуй соглашусь только с замечанием по поводу букв. [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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Скрипт определения жестких дисков"  
Сообщение от BigShadow email on 30-Мрт-06, 14:35 
>Я пожалуй соглашусь только с замечанием по поводу букв. [a-z] будет правильнее.
>Насчет всего остального - так поясню, что скрипт бежит на фоне диалога, поэтому
>приходится добавлять всякие добавки типа &>/dev/null 2>&1
>чтобы избежать мусора на экране.

Так никто выбрасывать ">/dev/null 2>&1" и не предлагал.
Речь идет чтобы выбросить избыточные вызовы программ grep и basename.

И снова повторю свой вопрос :) -
а почему решили, что информации, кот. выдает команда fdisk -l недостаточно?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

11. "Скрипт определения жестких дисков"  
Сообщение от den23513 email(??) on 01-Апр-06, 13:40 
>Так никто выбрасывать ">/dev/null 2>&1" и не предлагал.
>Речь идет чтобы выбросить избыточные вызовы программ grep и basename.
>
>И снова повторю свой вопрос :) -
>а почему решили, что информации, кот. выдает команда fdisk -l недостаточно?


После некоторых проверок, на машинах с SATA дисками на рейд контроллерах команда fdisk -l почемуто обнаруживает в системе добавочный девайс который определяет как диск (размером в 8Мб), но на самом деле это не диск. Я ваще не понимаю что это такое. Так вот чтобы отсечь девайсы такого типа, я и придумал все все эти грепы. И потом надо же отсортировать по отдельности PATA и SATA/SCSI диски. Можно конечно этого и не делать. Это уже так, для красоты. И потом с точки зрения програмиста, меньше команд - лучше. Ну а по мне, не мне же лопатой махать, а процессору. Ну выполнится этот код на секунду дольше - не страшно.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру