HiPath 3800 mit HG1500 Baugruppe via SIP an Asterisk und Skype anbinden
Mir hat sich vor Kurzem die Aufgabe gestellt, Skype an unsere interne Telefonanlage anzubinden. Denn ich hasse es, wenn ich mittels Headset bzw. Mikrofon und Lautsprecher am PC telefonieren muss, statt bequem das Telefon nutzen zu können. Generell halte ich ja nicht sehr viel von Skype, und versuche daher, wenn möglich, SIP bzw. offene Standards zu verwenden anstatt diesem proprietären, undurchschaubaren Ressourcenfresser. Aber wie dem auch sei, diese Aufgabe galt es zu bewältigen.
Zum Thema Anbindung der HG1500 an Asterisk habe ich diese bebilderte Anleitung gefunden. Sie ist allerdings etwas lückenhaft dokumentiert und beinhaltet für mich unnötige Schritte wie das Anlegen von virtuellen Klappen. Ich habe daher beschlossen, hier eine komplette Schritt-für-Schritt Anleitung zu zeigen, wie ich es bewerkstelligt habe.
Voraussetzungen:
- HiPath Manager E für die Telefonanlage mit entsprechenden Benutzerprivilegien
- HG1500 Baugruppe
- Asterisk Server
1) Als erstes muss man der HiPath mindestens eine IP-Leitung zur HG1500 zur Verfügung stellen (Typ: IP Trunking)

2) Das Hinzufügen des IP-Trunnks fügt auch eine neue Richtung hinzu, nämlich “Rtg. 16″. Zwecks Übersichtlichkeit kann man diese auf TCP/IP umbenennen:

3) Nun wechselt man in die Wahlplan-Maske (Einstellungen / Automatische Wegsuche… / Wahlplan) und klickt dort auf den Button “Wahlregeltabelle”, um eine neue Wahlregel zu erstellen:

4) Nun kann man einen Wahlplan erstellen. Ich hab einen bei mir noch nicht belegten freien Nummernkreis (400-499) hergenommen und eine Wahlregel damit erstellt. Die gewählten Ziffern sind folglich bei mir: -4XX
Für die Routung habe ich eine neue Wegetabelle hinzugefügt, welche Richtung TCP/IP geht und unsere soeben erstelle Wahlregel (HG1500 SIP) verwendet.
Diese Wegetabelle wird dann der Ziffernfolge zugeordnet:

Die Einrichtung der HiPath3800 ist damit abgeschlossen (Neue Konfiguration in Anlage laden) und man kann sich der Konfiguration der HG1500 widmen.
Bei der HG1500 ist noch anzumerken, dass man die Werte ändern kann, indem man links in der Baumstruktur jeweils rechts klickt und aus dem Kontextmenü die entsprechende Aufgabe wählt. Das ist etwas gewöhnungsbedürftig und nicht gerade sehr benutzerfreundlich, aber egal.
5) Unter Explorer/Sprachgateway/PBX/Knoten wird ein neuer Knoten angelegt.
Das LAN-Trunking Protokoll ist “Native SIP”, die Knotenüberwachung sollte deaktiviert werden. Es ist die IP des Asterisk-Servers einzutragen:

6) Nun ist noch eine Routen-Rufnummer unter “Routing” hinzuzufügen. Als Rufnummer nimmt man einfach den Präfix des verwendeten Nummernkreises, in meinem Fall also 4:

Per Klick auf die Floppy speichert man die Einstellungen ab.
Die Einrichtung der Telefonanlage ist nun abgeschlossen, nun muss noch Asterisk konfiguriert werden, um mit der HG1500 zu reden. Dies ist relativ einfach:
sip.conf
[hg1500sip]
type=peer
host=192.168.210.26 ; IP Adresse der HG1500 eintragen
canrenvite=no
insecure=very
qualify=no
nat=no
disallow=all
allow=ulaw
allow=alaw
context=home
In der extensions.conf sind dann die entsprechenden Klappen einzutragen.
Eingehen wird man den 4XX Zuweisen, also z.B., wenn man so wie ich in meinem Beispiel Skype mit anbindet:
exten => 499,1,Dial(SIP/skype/echo123)
Ausgehend in die HiPath habe ich andere Klappen genommen als jene, die man auf der HiPath hat, weil das bei mir mit anderen Telefonen am Asterisk kollidieren würde. Daher habe ich ein stuipides Mapping im 500er Nummernkreis ohne Makro gemacht (oh Graus! Aber zum Testen ausreichend):
exten => 500,1,Dial(SIP/100@hg1500sip,30,tTr)
Nun asterisk mit der neuen Konfiguration neu laden:
asterisk -r
reload
So, nun muss noch Skype angebunden werden.
In der sip.conf trägt man auf der Asterisk für den jeweiligen PC, auf welchem die Skype-instanz zur Vermittlung läuft, einen Abschnitt ein:
[skype]
username=skype ; use same as in brackets above
type=friend
context=home ; Most people will use “default” here, but I have “home”
secret=skypepwd ; password for authentication
host=dynamic ; if not dynamic, you will need to set port also
nat=no
dtmfmode=auto
canreinvite=no ; possibly set to yes if you know what you are doing
qualify=yes ; optional
defaultip=192.168.210.35 ; optional - ip of the client where instance is running
incominglimit=1
outgoinglimit=1
call-limit=1
busylevel=1
Dies kann man mit dem kleinen Programm siptosis bewerkstelligen.
Auf dem Rechner, welcher das Routing übernimmt, muss der fette Skype-Client installiert sein. Das Programm kommuniziert über die Skype-API mit dem Programm.
Als Version empfiehlt sich Version 3.8.0.188, da diese vom Ressourcenverbrauch her noch halbwegs im erträglichen Rahmen ist (SkypeExtras bitte nicht mitinstallieren) und außerdem keine Probleme mit siptosis macht. Bei den neusten Verisonen von Skype hatte ich diesbezüglich Probleme beim Stummschalten des Audioequipments am PC und ich hatte mit Abbrüchen des Audiostreams zu kämpfen.
Man kann sich theoretisch auch einen Telefonieserver einrichten, wo man mehrere Skype-Instanzen unter verschiedenen Usern laufen lässt.
Für nähere Fragen hierzu einfach einen Kommentar hinterlassen.
In SkypeToSipAuth.props trägt man die Weiterleitung von eingehenden Skype-Telefonaten auf die entsprechende Klasse an der ASterisk ein, welche wiederum aufgrund der Regel in der extensions.conf in die HiPath weiterroutet:
*,sip:500@192.168.210.13:5060
Die siptosis.cfg muss entsprechend auf den Rechner angepasst werden.
Lässt man mehrere Instanzen auf demselben Rehcner laufen, muss man ggf. den Port immer entsprechend anpassen, damit die Instanzen koexistieren können. Auch iher im Beispiel wird nicht der Standardport 5060, sondern 5070 genommen, um mit eventuellen SIP Softphones am PC friedlich koexistieren zu können.
#via_addr generally should be your PC's IP address.
via_addr=192.168.210.135
#Sample Asterisk registration example - comment out NO registration info above first and uncomment the following.
host_port=5070
realm=asterisk
expires=3600
do_register=yes
minregrenewtime=120
regfailretrytime=15
contact_url=sip:skype@192.168.210.135:5070
from_url="skype"
username=skype
passwd=skypepwd
Das sollte es mehr oder weniger gewesen sein. Man kann nun versuchen, echo123 von der Telefonanlage aus anzurufen.
Bei Fragen, einfach Kommentar hinterlassen.
Rfc2898DeriveBytes in plain C with Win32 Crypto API
Ich habe unlängst Fremdherstellercode gesehen, welcher leidergottes in .NET programmiert war und auch Cryptographiefunktionen verwendet hat.
Nun stellt sich für den Win32 Native-Programmierer natürlich die Frage, wie er mit den so erstellten Daten umgehen kann, um den Datenstrom ver/entschlüsseln zu können.
Zum Einsatz kam im .NET Code die Funktion Rfc2898DeriveBytes:
Rfc2898DeriveBytes bytes2 = new Rfc2898DeriveBytes(Password, keySalt);
Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(Password, IVSalt);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
stream = new CryptoStream(stream2, provider.CreateDecryptor(bytes2.GetBytes(8), bytes.GetBytes(0x10)), CryptoStreamMode.Read);
Nach einiger Recherche stellte sich heraus, dass diese PBKDF2 implementiert, welche in der Win32 CryptoAPI wincrypt.h wohl noch nicht implementiert ist.
Was also tun?
Glücklicherweise fand ich die Funktion “SpcPBKDF2″ im Secure programming cookbook for C and C++ in C implementiert.
Diese lässt sich dann leicht in eine kompatible Version Wrappen:
BOOL Rfc2898DeriveBytes (char *pszPassword, BYTE *pbSalt, DWORD cbSalt, BYTE *pbOut, DWORD cbOut)
{
return SpcPBKDF2 (pszPassword, lstrlen(pszPassword), pbSalt, cbSalt, 1000, pbOut, cbOut);
}
Der dort angegebene Democode hat allerdings einen kleinen Fehler:
In PKCS5FinalPRF steht
while (dwIteration < dwIterations)wobei dwIteration nie inkrementiert wird, richtig ist also
while (dwIteration++ < dwIterations)
Sonst funktioniert der Code allerdings ausgezeichnet.
Ich habe das Ganze in ein C-Modul zum download online gestellt:
pbkdf2.c
Nun gilt es noch, den DESCryptoServiceProvider zu implementieren.
Dies geht im Prinzip recht einfach mit der Win32 Cryptoapi mit CryptImportKey und CryptDecrypt. Ich habe eine einfache Implementierung ohne Errorchecking hier ebenfalls mal Online gestellt:
des.c
Damit lässt sich das Ganze dann auch in einer vernünftigen Programmiersprache abbilden
Windows Mobile POOM API, Fehler in pimstore.h
In der Datei pimstore.h wird im Windows Mobile SDK (Version 5 - 6.5) die COM-API definiert, welche zum Ansprechen des Pocket Outlook Objektmodells (POOM) verwendet wird.
Seit Windows Mobile Version 5 gibt es endlich auch eine IItem Klasse, mit welcher man auf die generischen Properties eines PIM-Items zugreifen kann.
Leider fehlt die Deklaration des Objekts für das C-only Interface, sodass man als C-Programmierer gezwungen ist, sich selber seine Interface-Definition zu schreiben.
Ich hab mir mal die Mühe gemacht, das Interface händisch zu deklarieren. Ich hoffe, es kann wer brauchen:
#if !defined(__cplusplus)
DEFINE_GUID(IID_IItem, 0xfb8998d0, 0x38f0, 0x4d12, 0xac, 0x56, 0x4e, 0xc8, 0xfc, 0xe9, 0xf3, 0xd5);
typedef struct IItemVtbl
{
BEGIN_INTERFACE
// IUnknown
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
IItem __RPC_FAR * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
IItem __RPC_FAR * This);
ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
IItem __RPC_FAR * This);
// No IDispatch, inherits directly from IUnknown
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetProps )(
IItem __RPC_FAR * This,
const CEPROPID* rgPropID,
ULONG ulFlags,
WORD cProps,
CEPROPVAL** prgVals,
ULONG *pcbBuffer,
HANDLE hHeap);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SetProps )(
IItem __RPC_FAR * This,
ULONG ulFlags,
WORD cProps,
CEPROPVAL* rgVals
);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Save )(
IItem __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Delete )(
IItem __RPC_FAR * This);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Display )(
IItem __RPC_FAR * This,
HWND hwndParent);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Edit )(
IItem __RPC_FAR * This,
HWND hwndParent);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Copy )(
IItem __RPC_FAR * This,
/* [retval][out] */ IItem __RPC_FAR *__RPC_FAR *ppolCopy);
/* [propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Oid )(
IItem __RPC_FAR * This,
/* [retval][out] */ long __RPC_FAR *poid);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OpenProperty )(
IItem __RPC_FAR * This,
CEPROPID propID,
DWORD dwMode,
IStream **ppStream);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_DefaultItemType )(
IItem __RPC_FAR * This,
int *polItem);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Application )(
IItem __RPC_FAR * This,
IPOutlookApp **ppolApp);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Parent )(
IItem __RPC_FAR * This,
IFolder **ppIFolder);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *AddCategory )(
IItem __RPC_FAR * This,
LPCWSTR pszwCategory);
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *RemoveCategory )(
IItem __RPC_FAR * This,
LPCWSTR pszwCategory);
END_INTERFACE
} IItemVtbl;
interface IItem
{
CONST_VTBL struct IItemVtbl __RPC_FAR *lpVtbl;
};
#endif
Toad for Oracle 10 bringt Oracle 9.2.0.2 Server zum Absturz
Der heutige Tag begann alles Andere als gut.
Um 8 Uhr bekam ich den Anruf, dass sich niemand mehr auf der Datenbank einloggen kann, alles steht, nichts geht mehr. Sowas hört man doch gerne in alle Früh, zumal mir schon am Vortag ein Internetverbindungsproblem mit dem Kabelmodem unseres Providers die gute Laune verdorben hat.
Eine kurze Überprüfung ergab, dass die Datenbank wirklich nicht mehr lief. Datenbank neu gestartet und alles funktionierte wieder. Aber nur für ca. 3 Stunden, dann war sie plötzlich wieder down.
Grund genug, sich einmal das Logfile /oracle9/admin/dba/bdump/alert_dba.log anzusehen.
Thu Dec 16 14:10:17 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_20397.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:10:17 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_20397.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:17:10 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21514.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:17:10 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21514.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:18:12 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21687.trc:
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 14:18:12 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_21687.trc:
ORA-07445: exception encountered: core dump [kssadf_stage()+20] [SIGSEGV] [Address not mapped to object] [0x0] [] []
ORA-00600: internal error code, arguments: [12333], [0], [0], [0], [], [], [], []
Thu Dec 16 19:43:12 2010
Thread 1 advanced to log sequence 2304
Current log# 2 seq# 2304 mem# 0: /udsk_d01/dba/redo02.log
Thu Dec 16 21:30:05 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_16097.trc:
ORA-00600: internal error code, arguments: [kqrfrpo], [0x5AECABA4], [11], [], [], [], [], []
Thu Dec 16 21:30:05 2010
Errors in file /oracle9/admin/dba/udump/dba_ora_16097.trc:
ORA-00600: internal error code, arguments: [kqrfrpo], [0x5AECABA4], [11], [], [], [], [], []
Also gegen 14 Uhr kam ein Internal Error 12333. Danach lief die DB noch ein paar STunden, bis sie dann schließlich mit internal Error kqrfrpo crashte.
Netterweise bietet Oracle in /oracle9/admin/dba/udump/ die entsprechenden Dumpfiles an. Hierbei entdeckte ich beim jeweils ersten Crash, welchem dann die anderen Crashes oft erst nach Stunden folgten, dass dort
(CID=(PROGRAM=]
A97FE80 505C3A43 72676F72 656D6D61 6575515C [C:\Programme\Que]
A97FE90 53207473 7774666F 5C657261 64616F54 [st Software\Toad]
A97FEA0 726F6620 61724F20 20656C63 545C3031 [ for Oracle 10\T]
A97FEB0 2E64616F 29657865 534F4828 43503D54 [oad.exe)(HOST=PC]
im Memory Dump drinnnen stand.
Dies machte mich dann doch etwas stutzig. Error 12333 tritt ja u.A. auf, wenn ungültige Daten von einem Client übermittelt wurden.
Schließlich fand ich im Internet dann auch noch folgenden Thread:
http://tech.dir.groups.yahoo.com/group/toad/message/51012
welcher ebenso sehr große Parallelen zu meinem Fall aufwies.
Ich habe dann den betreffenden User informiert, und der bestätigte mir, dass er TOAD 10 seit dem Vortag einsetzt und dieser aber auch schon so manchen komischen Fehler geliefert hat.
Auch der Verwendungszeitpunkt passte genau zusammen, sodass hier durchaus ein kausaler Zusammenhang vermutet werden kann.
Ich habe den betreffenden Benutzer dann gebeten, das Programm nicht mehr zu benutzen. Bis jetzt läuft die Datenbank wieder stabil ( so wie sie 2 Jahre lang auch schon gelaufen ist).
Falls jemand ein ähnliches Problem haben sollte, hier ist die Konstellation, die das verursachte:
Client: Oracle 8i client und Toad for Oracle 10
Server: Oracle 9.2.0.2
Eventuell irgendein Speicherüberschreiber, der damit zur nachhaltigen Destabilisierung des DB-Servers führt?
TOAD 7.5.2.0 läuft übrigens ohne Probleme.
kvm (KernelVirtualMachine) mit WinXP Gast
Nachdem XEN als virtuelle Maschine doch relativ kompliziert aufzusetzen ist, gibt es seit einiger Zeit eine sehr nützliche Alternative, nämlich die KVM, die im Kernel bereits integriert ist und sehr einfach zu installieren ist.
Noch dazu haben einige führende Linux-Distributoren bereits angekündigt, in Zukunft eher auf KVM zu setzen als auf XEN.
Grund genug, KVM einmal auszuprobieren. In meinem Fall wollte ich eine virtuelle Windows XP VM aufsetzen.
Das Aufsetzen ging relativ einfach über PXE (dazu brauche ich dann nicht extra die XP CD rüberzukopieren), Anleitungen hierfür findet man genug im Internet, z.B. hier. Mit dd erstellt man einfach ein leeres Image und verwendet dieses dann als virutelle HDD. Angeblich kann man sogar VMware-Images mit KVM booten, habe ich aber nicht ausprobiert. Über die Installation einer Netzwerkbridge für kvm werde ich mich jetzt hier nicht detailliert auslassen, Anleitungen hierzu gibt es ansich genügend im Internet.
Interessant sind vielmehr die Problemchen, auf die man so stößt:
So hatte ich beispielsweise, das Problem, dass der Mauscursor im VNC nicht exakt mit meinem client-Mauscursor mitfuhr, also ich hatte einen offset, welcher sich immer mehr vergrößerte. Das ist in der Praxis dann eher mühsam.
Abhilfe schafft hier folgender zusätzlicher Startparameter für kvm:
-usbdevice tablet
Nun stellt sich dann noch das Problem des Herunterfahrens der virtuellen Maschine.
Grundsätzlich kann man dies mit dem ACPI Poweroff-Signal erledigen. Hierzu bindet man den Monitor des qemu, welcher die Emulation der virtuellen CPU vornimmt auf einen Socket, z.B. mit:
-monitor "unix:/var/run/kvm/monitors/winxp,server,nowait"
Beim Herunterfahren sendet man dann ein ACPI Poweroff mit:
echo 'system_powerdown' |socat - unix-connect:/var/run/kvm/monitors/winxp >/dev/null
Das Problem bei Windows XP mit dieser Lösung ist jedoch, dass auf dem Hauptschirm hier eine Dialogbox erscheint, die fragt, ob man wirklcih herunterfahren möchte, da noch Benutzer angemeldet sind (zumindest soweit dies der Fall ist). Nachdem man eine virtualisierte Windows XP Maschine höchstwahrschienlich mittels RemoteDesktop verwenden möchte, hat man also mit großer Wahrscheinlichkeit diese Dialogbox stehen und der Gast fährt nicht herunter.
Bei Windows Server 2003 gäbe es hierfür eine Lösung, indem man folgenden Timeout-Wert in die Registry einträgt:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
“ShutdownWarningDialogTimeout”=dword:00000001
Bei Windows XP ist dies jedoch wirkungslos. Nun gäbe es noch einen anderen Trick, und zwar, indem man Windows mitteilt, dass es auf alle Fehlermeldungen automatisch mit der Standardantwort antwortet:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Error Message Instrument]
“EnableDefaultReply”=dword:00000001
Doch auch dies stellt keine zufriedenstellende Lösung dar, da hier z.B. dann auch der Dialog “Neue USB-Hardware gefunden, wollen Sie neustarten?” standardmäßig mit Ja beantwortet wird, was einen ungewollten Neustart der Maschine zur Folge hat.
Die für mich am praktikabel erscheinendste Lösung ist daher, dem Rechner über RPC mitzuteilen, dass er bitte ohne Wenn und Aber herunterfahren möge.
Hierzu muss in Windows die einfache Dateifreigabe ggf. deaktiviert werden (WIN+E/Extras/Ordneroptionen/Ansicht/[ ] Einfache Dateifreigabe verwenden).
Weiters muss die Windows Firewall abgeschaltet werden (Systemsteuerung/Windows Firewall).
Danach kann man vom Linux-Hostsystem aus mit Kenntnis der IP-Adresse des Systems, und vorausgesetzt, man hat SAMBA installiert, den Rechner mit folgendem Kommando herunterfahren:
net rpc SHUTDOWN -C "The system is going down for SHUTDOWN now" -f -I [IP der VM] -U [Benutzer]%[Passwort]
Der Benutzer muss natürlich ein authorisierter Benutzer sein, welcher Rechte zum Herunterfahren hat, z.B. der Administrator.
Ich hoffe, das hilft dem Einen oder Anderen weiter, der vor dem selben Problem steht und aggregierte Informationen hierzu haben möchte.
Visual C 7 oder höher Projekte auf VC6 konvertieren
Sehr nützlich: Codeproject
Keine Verzeichnisfarben in Midnight commander nach Upgrade auf Ubuntu 10.04.1 LTS
Nach dem Upgrade von Ubuntu Systemen auf 10.04.1 LTS fiel mir auf, dass der Midnight-commander nun die Verzeichnisse nicht mehr richtig highlightet und genauso darstellt wie Dateien, was etwas irritierend ist.
Der Bug ist hier beschrieben und kann wie folgt gefixt werden:
apt-get source mc; sudo cp mc-4.7.0/misc/filehighlight.ini /etc/mc
Doch das ist leider noch nicht Alles. Noch schlimmer hat es die Übersetzungen erwischt, der Midnight Commander erscheint in einem Kauderwelsch aus Englisch und Deutsch.
Der Grund dafür scheint zu sein, dass einige Übersetzungen im Sprachfile der Source als “fuzzy” gekennzeichnet sind und somit bei der normalen .mo Erstellung nicht berücksichtigt werden.
Nachdem wir im vorhergehenden Schritt ohnehin schon die Sourcen geholt haben, können wir auch das beheben:
sudo msgfmt -f -o /usr/share/locale/de/LC_MESSAGES/mc.mo mc-4.7.0/po/de.po
Alles in Allem ist es doch erstaunlich, dass scheinbar niemand das Paket ordentlich getestet hat, bevor es in die Release eingebunden wurde.
Windows Vista/7 und DbgPrint
Unter Windows 7 werden Debugmeldungen von Treibern standardmäßig nicht mehr ausgegeben.
Um Debugmeldungen temporär für die aktuelle Sitzung einzuschalten, kann in WinDbg folgendes Kommando verwendet werden:
ed nt!Kd_DEFAULT_Mask 0xffffffff
gdb und SIGTTOU
Vornehmlich beim Debuggen von Multithreaded Programmen (kA warum gerade da) erhält man von gdb oft die Meldung
Program received signal SIGTTOU, Stopped (tty output).
und der Debugger vertschüsst sich in den Hintergrund. Dagegen hilft einfach, die Terminalflags mit stty umzustellen:
stty -tostop
Reparaturinstallation mit Unattended XP CD
Unattended XP Installations-CDs, wie sie sich z.B. mit nLite erstellen lassen, sind sehr praktisch, da man auf ihnen alles gleich vorkonfigurieren und entsprechende Treiber hineinslipstreamen kann. Sie haben allerdings auch einen entscheidenden Nachteil: Man kann mit derartigen CDs weder die Reparaturkonsole aufrufen, noch kann man eine Reparaturinstallation machen, da die Datei winnt.sif ja den Installationsverlauf mehr oder minder bereits vorgibt.
Nun könnte man sich natürlich eine eigene CD ohne diese Datei brennen, aber nur deswegen einen extra Datenträger erstellen scheint auch nicht sehr zielführend. Wie ich heute herausgefunden habe geht es auch einfacher:
Man erstellt einfach eine Datei winnt.sif ohne Inhalt und platziert diese auf einer Diskette. Diese lässt man dann bei der XP-Installation im Laufwerk. Die XP-installation durchsucht automatisch die eingelegte Diskette nach allfälligen RAID-Treibern und eben auch Installationsanweisungen wie winnt.sif, welche die winnt.sif auf der CD “overrulen”.
System programmer