LINUX.ORG.RU

SATA hotplug


1

1

Добрый день,

Интересна поддержка сабжа в железе. Вообще же SATA поддерживает hotplug, но первые интеловские мосты (кажись ICH5) его не поддерживали и это было описано. Сейчас искал инфу про новые чипы (тот же ICH10) и ничего не нашел. Потому вопрос: как сейчас с этим дела? Проверил у себя - вроде работает на ICH10R. Где-то кто-то говорил что в ICHxR поддерживается, а в ICHxx - нет.

Вопрос №2: как привильно вставлять/удалять устройства? Сначала вставлять питание, потом данные? Нужно ли что-то делать в линуксе перед удалением, кроме отмонтирования разделов?

★★★★★
Ответ на: комментарий от anon_666

Не путайте SATA и ATA. В SATA «из коробки» hotplug. Главное, отмонтировать диск не забыть, перед тем, как его отключать.

Eddy_Em ☆☆☆☆☆
()

(hot pluggable) SATA/SCSI add/remove scripts for Linux

# cat rescan_scsi

#! /bin/bash

SCSI=/sys/class/scsi_host
test ! -d "$SCSI" && echo "Error: cannot find $SCSI directory." && exit 1
cd "$SCSI" || exit 1

for i in *; do
        echo -n "Scanning $i ..."
        echo "- - -" > $i/scan && echo " done."
done

echo "Finished. Consult with 'dmesg' for details."

# cat remove_scsi

#! /bin/bash
#----------------------------------------------------------------------
# Description: a simple script to remove SCSI devices
# Author: Artem S. Tashkinov <no-mail@no-mail.com>
# Created at: Tue Sep 15 18:30:41 YEKST 2009
# Computer: localhost.localdomain
# System: Linux 2.6.31-k8l on i686
#
# Copyright (c) 2009 Artem S. Tashkinov  All rights reserved.
#
#----------------------------------------------------------------------

strhb="hot-pluggable SCSI devices"
DEVLIST=/proc/scsi/scsi

i=1
while read item; do
        d_id[$i]="$item"
        i=$((i+1))
done < <(awk '/Host/{var=$2" "$4" "$6" "$8;gsub(/00/,"0",var);print substr(var,5)}' "$DEVLIST")

i=1
while read item; do
        d_name[$i]="$item"
        i=$((i+1))
done < <(awk -F 'Vendor: | Model: | Rev: ' '/Vendor/{print $2,$3}' "$DEVLIST")

if [ $i -le 1 ]; then
        echo "No removable $strhb found. Exiting"
        exit
fi

echo "We have found the following $strhb:"
for ((x = 1 ; x < $i ; x++)); do
        echo " $x: ${d_name[$x]}" | sed 's/ATA/HDD/'
done

echo -n "Please, enter a device number to remove or 0 to exit: "
read devn

if ! [ "$devn" -eq "$devn" 2> /dev/null ]; then
        echo "Error: $devn isn't a number, bye."
        exit 2
fi

if [ "$devn" -lt 1 -o "$devn" -ge $i -o "$devn" -eq 0 ]; then
        echo "No action taken, bye."
        exit
fi

echo "scsi remove-single-device ${d_id[$devn]}" > /proc/scsi/scsi
echo "Done. Consult with dmesg to find out if the device was actually removed"

Enjoy

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

При подключении сначала подключаем шлейф с данными, потом с питанием.

При отключении сначала отключаем шлейф с питанием, потом с данными.

Интересно. А почему так?

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

Первый скрипт нужен только для старых SATA/SCSI контроллеров, которые нормативно не поддерживают hot plug (по факту поддерживают почти все, только они не посылают hotplug event'ы по dbus/hal'у, ибо контроллеры глупые).

Ага и он может понабиться, если у вас SATA в режиме IDE/compatible в BIOS стоит.

anonymous
()
Ответ на: (hot pluggable) SATA/SCSI add/remove scripts for Linux от birdie

Где проверка на примонтированность того что выключается?
Нафига вешать зависимости на два интерфейса когда можно всё через /sys сделать? И практика парсить форматированный выхлоп дебильная, ибо формат вывода изменили и скрипты полетели.
С какого боку ATA стало эквивалентно HDD? Про SSD, например, не слышали?

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

>Первый скрипт нужен только для старых SATA/SCSI контроллеров

Первый скрипт может понадобиться если в(вы)рубаешь устройство не вынимая его.

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

> Где проверка на примонтированность того что выключается?

Добавьте сами :)

test grep -q /dev/sdX /proc/mounts 2>/dev/null && echo "Some partitions are still mounted" && exit 1

Я не нашёл как связать /proc/scsi/scsi с /dev/sdX, просто лень было - скрипт для меня родимого.

> Нафига вешать зависимости на два интерфейса когда можно всё через /sys сделать?

It's a just quick hack.

> И практика парсить форматированный выхлоп дебильная, ибо формат вывода изменили и скрипты полетели.

и в sys оно тоже может поменяться.

> С какого боку ATA стало эквивалентно HDD? Про SSD, например, не слышали?

Полегче!! SSD - это уже не HDD? или вы как-то иначе их называете? :)

// b.

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

> Первый скрипт может понадобиться если в(вы)рубаешь устройство не вынимая его.

Кстати, да :)

anonymous
()

Можешь поиздеватся над вендузятниками - на рабочей машине внаглую отключаешь винт , а потом подключаешь - и ничего. Т.е. линукс как работал так и работает - лица у народа очень озадаченые. Естественно все это касается SATA винтов и линукса

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

Во время отключения винта в Линуксе попробуйте открыть хоть один незакэшированный файл - после этого система встаёт раком и ничего не помогает.

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

Может есче запустить компиляцию ядра с винта который отключен?

Quark_p
()

вообще hotplug работает только для AHCI как бы по стандарту.

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

>> на рабочей машине внаглую отключаешь винт , а потом подключаешь - и ничего

Ага, если только имя в /dev/ не сменится, что весьма вероятно.

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

>Ага, если только имя в /dev/ не сменится, что весьма вероятно.

если никаких скази устройств не пихать, то не сменится.

dimon555 ★★★★★
()

Весьма нормально работает:

echo 1 > /sys/block/sdh/device/delete

И довольно просто.

Pavval ★★★★★
() автор топика
Ответ на: (hot pluggable) SATA/SCSI add/remove scripts for Linux от birdie

Переписано на sysfs

#! /bin/bash
#----------------------------------------------------------------------
# Description: a simple script to remove SCSI devices
# Author: Artem S. Tashkinov <no-mail@no-mail.com>
# Created at: Tue Sep 15 18:30:41 YEKST 2009
# Computer: localhost.localdomain
# System: Linux 2.6.31-k8l on i686
#
# Copyright (c) 2009 Artem S. Tashkinov  All rights reserved.
# Copyright (c) 2011 Nikolay M. "Livid" Yakimov  All lefts reserved.
#
#----------------------------------------------------------------------

strhb="hot-pluggable SCSI devices"
DEVLIST=/sys/class/scsi_disk/*/device

echo "We have found the following $strhb:"

i=0
for item in $DEVLIST; do
        i=$((i+1))
        d_id[$i]="$item"
        echo -n " $i: "
        cat "$item"/model | tr -d '\n'
        echo -n " "
        ls "$item"/block | tr '\n' ' '
        echo
done

echo -n "Please, enter a device number to remove or 0 to exit: "
read devn

if ! [ "$devn" -eq "$devn" 2> /dev/null ]; then
        echo "Error: $devn isn't a number, bye."
        exit 2
fi

if [ "$devn" -lt 1 -o "$devn" -gt $i -o "$devn" -eq 0 ]; then
        echo "No action taken, bye."
        exit
fi

echo 1 > "${d_id[$devn]}"/delete
echo "Done. Consult with dmesg to find out if the device was actually removed"

И да, вот так можно связать с именем блочного устройства.

livid
()
Ответ на: Переписано на sysfs от livid

Скрипты это не прикольно. Это ламерам можно показывать какой я крутой в консоли. А для личного удобства нужен гуй:)

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

Вы таки решительно не правы. Не буду флеймить насчет винды и привычек к мышковозительству, но скажу, что многие, очень многие вещи в консоли делать ЗНАЧИТЕЛЬНО быстрее и проще. Даже не обсуждаю сейчас вопрос «нах*я гуй на сервере», хотя тоже благодатная почва. Это, конечно, не значит, что гуй не нужен. Нужен. Но далеко не всегда и не везде.

Я даже больше скажу. В скриптах можно гуй сделать, представляете? Curses, или X11 — какой больше нравится (dialog, xdialog)

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

Даже не обсуждаю сейчас вопрос «нах*я гуй на сервере», хотя тоже благодатная почва.

+1, Нафиг не нужен. На сервере не влом и ручками в /sys записать.

Это, конечно, не значит, что гуй не нужен. Нужен. Но далеко не всегда и не везде.

Да.

Вы таки решительно не правы. Не буду флеймить насчет винды и привычек к мышковозительству, но скажу, что многие, очень многие вещи в консоли делать ЗНАЧИТЕЛЬНО быстрее и проще.

Не всегда. Два клика на каком-то device notifier'е против набора команды. В гуе тупо быстрее. Да, всего на секунды.

Я даже больше скажу. В скриптах можно гуй сделать, представляете? Curses, или X11 — какой больше нравится (dialog, xdialog)

Татышо. Я не хочу отдельную прогу, я хочу нормальную интеграфию в DE. Консольное решение и так есть, а гуя нету.

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

> В гуе тупо быстрее. Да, всего на секунды.

Вопрос привычки, не более.

Я не хочу отдельную прогу

device-notifer тоже формально отдельная прога, согласитесь.

я хочу нормальную интеграцию в DE

Вообще придется для этого дела держать демона с рутовскими правами, или делать авторизацию через sudo. Но как обычно, флаг в руки, вам будут благодарны.

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

device-notifer тоже формально отдельная прога, согласитесь.

Нет.

Вообще придется для этого дела держать демона с рутовскими правами, или делать авторизацию через sudo. Но как обычно, флаг в руки, вам будут благодарны.

Дело в том, что udisks это не поддерживает. Все потому, что различить eSATA и SATA нельзя и неочевидно, что считать removable, а что нет. Когда там будет поддержка (как я понял, это будет определяться через udev и его конфиги), тогда и DE подтянутся. Отдельного демона не потребуется, надо только нормальная поддержка в существующей инфраструктуре.

Pavval ★★★★★
() автор топика
16 апреля 2011 г.
Ответ на: Переписано на sysfs от livid

Thanks for sysfs! I've rewritten my script adding buffers flushing, mount checks and other pleasantries. Please, report any problems or errors.

$ cat remove_scsi

#! /bin/bash
#----------------------------------------------------------------------
# Description: a simple script to remove SCSI devices using sysfs
# Author: Artem S. Tashkinov <no-mail@no-mail.com>
# Created at: Mon Apr  4 04:24:09 YEKST 2011
# Computer: localhost.localdomain
# System: Linux 2.6.38.2-ic on i686
#
# Copyright (c) 2011 Artem S. Tashkinov  All rights reserved.
#
#----------------------------------------------------------------------

DEVLIST=/sys/class/scsi_device/*/device
echo "We have found the following hot-pluggable SCSI devices:"

i=0
for item in $DEVLIST; do
        if [ -f "$item/delete" ]; then
                i=$((i+1))
                d_sys[$i]="$item"
                d_blk[$i]=`ls "$item"/block 2>/dev/null`
                d_dsc[$i]=`cat "$item"/{vendor,model,rev} 2>/dev/null | tr -d '\n'`
                echo " $i: ${d_dsc[$i]} ${d_blk[$i]}"
        fi
done

echo -n "Please, enter a device number to remove or 0 to exit: "
read devn

if ! [ "$devn" -eq "$devn" 2> /dev/null ]; then
        echo "Error: [$devn] isn't a number, bye."
        exit 2
fi

if [ "$devn" -lt 1 -o "$devn" -gt $i -o "$devn" -eq 0 ]; then
        echo "No action taken, bye."
        exit
fi

sync # Just in case

for i in ${d_blk[$devn]}; do
        curdev="/dev/$i"
        alldev="$alldev $curdev `find /dev -maxdepth 1 -lname $i 2>/dev/null`"
        echo -n "Flushing  $curdev ... "
        blockdev -v --flushbufs $curdev
done

for i in $alldev; do
        grep -q $i /proc/mounts && echo "$i is still mounted! You are insane!" && exit 0
done

echo 1 > "${d_sys[$devn]}"/delete
sleep 2 # Give time to flush device buffers
test -d ${d_sys[$devn]} && echo "${d_dsc[$devn]} was NOT removed." || echo "You can safely remove ${d_dsc[$devn]}"
birdie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.