[T61] Funktionierende UltraBay Hotswap Skripte

rumbero

Active member
Registriert
9 Dez. 2007
Beiträge
1.228
Habe mich gestern mit den veralteten und mittlerweise eher konfusen Informationen auf thinkwiki.org/wiki/How_to_hotswap_Ultrabay_devices auseinandergesetzt, um das bereits früher schon mal funktionierende Hotswapping der UltraBay meiner T61 wieder zum Laufen zu bringen, und die dort verfügbaren Skripte etwas überarbeitet.

Das Ergebnis habe ich bereits im internationalen ThinkPad-Forum unter forum.thinkpads.com/viewtopic.php?p=707974#p707974 verfügbar gemacht.

Sobald ich rausgefunden habe, wie man einen neuen Beitrag im deutschsprachigen ThinkWiki anlegen kann (finde nach erfolgter Anmeldung als "rumbero" keinerlei Option ausser der Bearbeitung bereits existierender Artikel), werde ich ein entsprechendes Thema beitragen.
 
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Dank des nach linrunners entscheidendem Hinweis nachträglich bestandenen Eignungstest als angehender Wikiautor ist nun folgender Artikel entstanden:

thinkwiki.de/Linux_UltraBay_Hotswap

@linrunner: Danke einstweilen für Deine überaus hilfreichen Hinweise! Mit dem portableren Matching der Attribute muss ich mich aber erst nochmal genauer auseinandersetzen, bevor ich das Ganze womöglich nur blind verschlimmbessere. Ich muss gestehen, die in dem Artikel auf thinkwiki.org bereits enthaltenen udev-Regeln einfach nur übernommen und angepasst zu haben, ohne deren Syntax bereits wirklich gründlich zu verstehen.
 
HotSwap heist du kannst die Geräte im Betrieb rausziehen. http://de.wikipedia.org/wiki/Hot_Swapping

Unter Windows mit dem UBay soweit kein Problem, betätigst den Schieberegler, oder sagst entfernen, das Gerät wird umountet und stromlos gemacht. Unter Linux musstes du das Gerät vorab händisch umounten und so Kram, damit das Gerät ordentlich entfernbar ist.

Schöne Sache rumbero
 
Zuletzt bearbeitet:
Mittlerweile ist bereits die 5te Version der ultrabay-scripts notwendig geworden. Es hat sich leider rausgestellt, dass die umount-Funktion des ultrabay_eject Skripts ziemlich unbrauchbar, wenn nicht sogar gefährlich ist. Ich habe sie deswegen lieber mal ersatzlos rausgeworfen, um grössere Schäden zu vermeiden.

Stattdessen habe ich einen Check eingebaut, der erstmal verifiziert, ob das entsprechende Gerät überhaupt irgendwie in Benutzung ist, um sich dann mit einer Warnung zu beenden, falls dies tatsáchlich der Fall sein sollte. Zwar bleibt dadurch dem Anwender immer noch die Aufgabe überlassen, alle noch das Gerät blockierenden Prozesse selbst zu beenden, aber wenigstens wird ihm dadurch nicht mehr so wie vorher der Boden unter den Füssen weg gezogen.
 
Hi,

ich bin noch nicht zum Anschauen gekommen, wird aber nachgeholt.

Thema Unmount: ich hab es damals in TLP für die Bayoff-Funktion verworfen, weil mir davor graute alle möglichen Permutationen von Partition/LVM/dmcrypt/was-auch-immer berücksichtigen und vor allem testen zu müssen ;). Also prüfe ich nur, ob es ein optisches LW ist.
 
ich bin noch nicht zum Anschauen gekommen, wird aber nachgeholt.
Je länger Du damit wartest, desto mehr Zeit bleibt mir, die allerpeinlichsten Fehler noch schnell zu beseitigen. ;)

Thema Unmount: ich hab es damals in TLP für die Bayoff-Funktion verworfen, weil mir davor graute alle möglichen Permutationen von Partition/LVM/dmcrypt/was-auch-immer berücksichtigen und vor allem testen zu müssen ;). Also prüfe ich nur, ob es ein optisches LW ist.
Mittlerweile testen die Skripts erfolgreich sowohl auf das optische Laufwerk, und mittels "hdparm -z" auch, ob eine entsprechende UltraBay-HDD noch irgendwie in Benutzung ist. Das scheint soweit auch ganz verlässlich zu funktionieren.

Mein Testmöglichkeiten sind halt leider nur auf meinen eigenen T6x-Horizont beschränkt. Ob es also tatsächlich die beste Lösung ist, ist mir deswegen noch nicht so ganz klar. Nur weil ich bisher keine bessere gefunden habe, muss man das nicht unbedingt als die ultimative Lösung hinnehmen.

EDIT: ultrabay-scripts (0.7-1) wurde zwischenzeitlich hochgeladen.
 
Zuletzt bearbeitet:
Hi,

ein paar Anmerkungen (Code nur überflogen, für ein volles Review reicht die Zeit grade nicht;)):

1. "Designfrage": Hast du dich bewusst für bash statt sh entschieden? Das einzige bash-Feature, das du momentan nutzt, ist der Gleichheitstest mit "==" statt "=". Ansonsten wäre der Code wohl auch mit zB dash lauffähig. "export NAME=WERT" ist streng genommen auch ein spezifisches Feature, wird aber von vielen Shells implementiert (u.a. dash).

2. Bei der Verkettung von Überprüfungen mittels "-a" oder "-o" aufpassen! Bspw. [usr/share/ultrabay-scripts/]ultrabay_common, Zeile 56:

Code:
ultrabay_battery_interface ()
{
battery=$(dirname $(/bin/grep -l battery_bay /sys/devices/platform/dock.?/type))
if [ ! -n "$battery" -a -d "$battery" ]; then
    logger "$SCRIPTNAME": Cannot locate UltraBay battery dock device
    notify-send -u critical -t 100000 "ThinkPad UltraBay battery dock found" "Cannot locate UltraBay battery dock device"
    exit 1
fi
}

Das "!" verhält sich wie ein Vorzeichen (unärer Operator) und wirkt damit nur auf "-n $battery". Ist mit Blick auf die nachfolgenden Aktionien mEn nicht beabsichtigt. Vermutlich hast du hier "-n $battery -a -d $battery" verneinen wollen, was sprachlich "exit, falls $battery leerer String und/oder $battery-Verzeichnis fehlt" entspricht, und im Code wie folgt darstellbar ist:

Code:
if [ -z "$battery" ] || [ ! -d "$battery" ]; then
   ...
fi

# alternativ (Beibehaltung von "-a"):
if [ ! \( -n "$battery" -a -d "$battery" \) ]; then

vg,
dywi
 
1. "Designfrage": Hast du dich bewusst für bash statt sh entschieden? Das einzige bash-Feature, das du momentan nutzt, ist der Gleichheitstest mit "==" statt "=".
Genau aus diesem Grunde habe ich den "shebang" auch erstmal auf "#!/bin/bash" belassen. Zudem ist es im ursprünglich von thinkwiki.org/wiki/How_to_hotswap_Ultrabay_devices übernommenen Script genau so definiert.

2. Bei der Verkettung von Überprüfungen mittels "-a" oder "-o" aufpassen! Bspw. [usr/share/ultrabay-scripts/]ultrabay_common, Zeile 56:

Code:
if [ ! -n "$battery" -a -d "$battery" ]; then

Das "!" verhält sich wie ein Vorzeichen (unärer Operator) und wirkt damit nur auf "-n $battery". Ist mit Blick auf die nachfolgenden Aktionien mEn nicht beabsichtigt. Vermutlich hast du hier "-n $battery -a -d $battery" verneinen wollen, was sprachlich "exit, falls $battery leerer String und/oder $battery-Verzeichnis fehlt" entspricht,

Das entstammt indirekt dem bestehenden Code aus Zeile 18 ("if [ -n "$dock" -a -d "$dock" ]; then") des bereits oben genannten Scripts von thinkwiki.org, den ich einfach genau so übernahm und entsprechend anpasste, nachdem ich ihn gemäss der man page zu "[" wie folgt verstand und zu nutzen beabsichtigte: "EXPRESSION1 -a EXPRESSION2 = both EXPRESSION1 and EXPRESSION2 are true". Allerdings wäre das im beabsichtigten Kontext trotzdem nicht richtig, wie Du korrekt erkannt hast, sondern tatsächlich besser genau das von Dir vorgeschlagene Konstrukt:
Code:
if [ -z "$battery" ] || [ ! -d "$battery" ]
then
   ...
Das betrifft dann gleich die beiden Funktionen "ultrabay_dock_interface ()" und "ultrabay_battery_interface ()" in /usr/share/ultrabay-scripts/ultrabay_common, und wird gleich mit der nächsten Ausgabe behoben worden sein. Sehr schön, dass Du mich darauf aufmerksam gemacht hast! Es geht doch nichts über einen direkten Hinweis auf einen blinden Fleck!

Allein die Tatsache, dass man erst eine man page bemühen muss, um sich einen offensichtlich missverständlichen Ausdruck zu verdeutlichen, nur um ihn im gegebenen Kontext dann doch nicht richtig zu verstehen, bestätigt eigentlich bestens, dass er durch einen eindeutigeren Ausdruck ersetzt werden sollte.

Danke auch dafür, mich auf diesen peinlichen Fehler aufmerksam gemacht zu haben, bevor ihn mir linrunner gnadenlos um die Ohren schlägt! ;)

EDIT: ultrabay-scripts (0.8-1) ist ab sofort von sourceforge.net/projects/wmlive/files/ultrabay-scripts verfügbar.
 
Zuletzt bearbeitet:
bevor ihn mir linrunner gnadenlos um die Ohren schlägt!
Du irrst. Ich hab wenig Übung im formalen Codereview, ich schaue eher auf funktionale Themen. dywi unterzieht übrigens freundlicherweise (neben dem Gentoo Packaging) jedes TLP-Release einem Codereview. Er macht das wirklich sehr gut :).

Zum Thema: ich finde Shellcode sollte generell POSIX-kompatibel sein und mit #!/bin/sh beginnen. Nur weil jemand es nicht besser wusste und #!/bin/bash eingetragen hat bei thinkwiki.org, muss das noch lange nicht für das konkrete Skript erforderlich sein.

Also schaun mer mal:

ultrabay-common
Zeile 23: if [ "$(/usr/sbin/dmidecode -t 1 | grep -c "Family: ThinkPad")" == "0" ]
-> Ich würde statt dmidecode -t 1 das "leichtgewichtigere" /sys/class/dmi/id/product_version nehmen.

Fortsetzung folgt ... bin heute zu müde.
 
Zuletzt bearbeitet:
Zum Thema: ich finde Shellcode sollte generell POSIX-kompatibel sein und mit #!/bin/sh beginnen.
Ok, ihr beiden habt mich rumgekriegt. Ist in ultrabay-scripts (0.9-1) umgesetzt und ab sofort am bereits bekannten Ort verfügbar.

-> Ich würde statt dmidecode -t 1 das "leichtgewichtigere" /sys/class/dmi/id/product_version nehmen.
Das ist richtig gut und war mir bis jetzt noch nicht bewusst! Wird dann demnächst angepasst. Danke!
 
Zuletzt bearbeitet:
Habe mal auf wmlive.sourceforge.net/wmlive ein apt-Repositorium angelegt, damit man sich die lästige manuelle Installation sparen kann.

Der entsprechende Eintrag in der /etc/apt/sources.list lautet
Code:
deb http://wmlive.sourceforge.net/wmlive wheezy main
Den zugehörigen Public-Key installiert man wie folgt:
Code:
wget -O - http://wmlive.sourceforge.net/wmlive/wmlive.key | sudo apt-key add -

Mittlerweile ist dort ultrabay-scripts (0.10-1) verfügbar.
 
Habe die 'ultrabase-scripts' mittlerweile als öffentliches Projekt auf https://github.com/wmlive/ultrabay-scripts verfügbar gemacht.
Wenn sich jemand dazu berufen fühlen sollte, eventuelle Fehler zu beheben oder gar Verbesserungen beizutragen, dann nur zu.

Fertige Debian-Pakete sind ab sofort über das folgende Repository abruf- und installierbar: http://wmlive.rumbero.org/repo/

Code:
# echo "deb http://wmlive.rumbero.org/repo jessie main" >> /etc/apt/sources.list
# wget -O - http://wmlive.rumbero.org/repo/wmlive@rumbero.org.gpg.key | sudo apt-key add -
# apt-get update
# apt-get -u -m install ultrabase-scripts
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben