Disaster Recovery mit cvfsdb für Xsan
Dieses Beispiel behandelt ein Szenario, in dem sich ein low level Hardwarefehler ausbreitet und das cvfsck Kommando keine Fehler feststellen kann.
Es könnten auch die inodes sb_NTSecurityIdxInode und sb_NTSecurityDatInode im Superblock aufgrund von Schwierigkeiten mit den ACLs oder low-level Plattenproblemen beschädigt sein. Im Falle eines größeren Problems mit dem sb_NTSecurityIdxInode kann es passieren, dass sich das Filesystem starten lässt, das Volume aber nicht gemountet werden kann. Ist der sb_NTSecurityDatInode betroffen, könnte es sogar so aussehen, als ließe sich das Filesystem mounten, eine nähere Untersuchung im Terminal wuerde dann aber I/O-Errors und fehlende Dateien oder Ordner zutage fördern. Der Finder dagegen würde das Dateisystem möglicherweise überhaupt nicht anzeigen, oder fehlerhaft darstellen (Ordner werden beispielsweise als Dateien angezeigt, andere Dateien haben die falschen Icons).
Interessanterweise kann jedoch in manchen Fällen, in denen sb_NTSecurityDatInode beschädigt ist, das betroffene Filesystem wie folgt gemountet und darauf zugegriffen werden: Das Konfigurationsfile des Volumes muss editiert und der Wert “No” für die folgenden Parameter verwendet werden: “Quotas,” “WindowsSecurity” und “EnforceACLs”. Anschließend muss das Volume neu gestartet und dann gemountet werden (Falls der Wert fuer “Quotas” “Yes” ist, so hat der Wert “No” fuer “WindowsSecurity” keinerlei Auswirkung, was der Grund dafür ist, warum wir beide auf “No” setzen).
Entsprechend der Manpage für cvfs_config ” berücksichtigt das Filesystem Windows Accesslisten für den Zeitraum, für den das Filesystem gemountet ist, ganz gleich was der Wert für “WindowsSecurity” ist, sofern “WindowsSecurity” anfangs aktviert wurde”. Das bedeutet dass sb_NTSecurityIdxInode und sb_NTSecurityDatInode bei einmal aktivierten ACLs nicht leer sein können, selbst wenn die ACLs später deaktiviert worden sind. Wird sb_NTSecurityIdxInode nun beschädigt, könnte es sein, dass sich das Volume nicht mounten lässt, obwohl die Werte fuer “Quotas,” “WindowsSecurity” und “EnforceACLs” im Konfigurationsfile des Volumes auf “No” gesetzt worden sind.
Man kann zum Beispiel im Finder das Verzeichnis Projects auf dem Xsan nicht mehr sehen. Ein ls -al auf dieses Verzeichnis liefert einen Input/Output error. Ein Fileystem check mit cvfsck zeigt allerdings keine Probleme.
Im Folgenden gehen wir davon aus, dass der Administrator auf dem Metadaten Controller eingeloggt ist. Der Name des Xsan Volumes ist Testvol.
- Schritt I.
Als ersten Schritt unmounten und stoppen Sie das Volume. Dann führen Sie das folgende Kommando aus, um eine Liste mit Files zu erhalten, die Xsan noch “sehen” kann:
# cvfsck –x Testvol > allfilesfolders
Sie erhalten eine komma-separierte Liste mit den folgenden Informationen:
Inode#, Mode, Size, Block Count, Affinity, Path, Extent Count, Extent Number, Storage pool, File Relative Block, Base, End, Depth, Breadth
Beispiel:
3c4dcd,16877,2048,1,Data,Projects/sunshine,1,0,0,0,3858,3858,0,256
3c4de8,33188,0,0,none,Projects2/moonshine,0,0,0,0,0,0,0,0
Achtung: Entgegen der Aussage der man page für cvfsck wird die Inode# in hex dargestellt und nicht dezimal. Die restlichen numerischen Werte sind dezimal.
Der zweite Wert “mode” ist von spezieller Bedeutung. Wenn der mode Wert 16877 ist, also oktal 040775, so entspricht der Eintrag einem Directory mit 755 Berechtigungen. Der Wert 33206, oktal 100666, entspricht einem File mit den Berechtigungen 666. 33188, also oktal 100644, ist ein File mit Berechtigungen 644. 41471 also oktal 0120777 ist ein symbolic link.
In unserem Beispiel ist nur der “fehlende” Projects Folder interessant. Mit dem folgenden Kommando erhalten Sie alle Files und Folder unter dem Projects Verzeichnis.
# grep ,[-_A-Za-z0-9][-_A-Za-z0-9]*,Projects, allfilesfolders > alllostProjects
# grep ,[-_A-Za-z0-9][-_A-Za-z0-9]*,Projects\/ allfilesfolders >> alllostProjects
Man sollte die Pfad-Einträge (das sechste Feld) an das Ende schieben. Das hilft später bei der Sortierung spezieller numerischer Felder.
# sed -e ‘s/^\([0-9a-f][0-9a-f]*\),\([0-9][0-9]*,[0-9][0-9]*,[0- 9][0-9]*,[-_A-Za-z0-9][-_A-Za-z0-9]*\),\(.*\),\([0-9][0-9]*,[0- 9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0- 9]*,[0-9][0-9]*\)$/0x\1,\2,\4,\3/’ > alllostProjects.$$ < alllostProjects
Ein File kann mehrere Extents haben und wir brauchen nur einen Eintrag für diese Prozedur. Der Finder erlaubt alle möglichen Sonderzeichen für Filenamen und Directorynamen. (z.B. ‘, /, \,@,%,¬,®,€,£,~, [, }) Außerdem alle möglichen Unicode Zeichen wie Ç, Ä,ö,Ã,ß. Das wichtigste ist nun das Zeichen ' zu maskieren, da wir es für viele der folgenden Kommandos benötigen. Diese würden sonst nicht funktionieren. Ein Kommando wie das folgende könnte das vornehmen:
# sort -t , -k 1,6 -um < alllostProjects.$$ | sed -e "s/'/'\\\''/g" > alllostProjects. onlyonce.$$
- Schritt II.
Man kann ungefähr abschätzen, wie viel Platz benötigt wird, um weiter zu verfahren.
estimatedsize=`awk -F, '$2 ~ /^3[0-9][0-9]*/ {s += $3}; END{print s}’ < alllostProjects.onlyonce.$$ | xargs -J % echo % /1024 | bc`
Basierend auf dieser Größe muss ein weiteres Volume angehängt werden. z.B. /Volumes/restore, auf welches alle Files und Folder restored werden.
Unix hard und soft links können separiert werden. Diese kann man später behandeln:
cut -f 1-13 -d”,” alllostProjects.onlyonce.$$ | sort | uniq -d > alllostProjects _hlnopath.$$
exec 3<&0
exec 0< alllostProjects_hlnopath.$$
while read line
do
grep “$line” alllostProjects.onlyonce.$$ >> alllostProjects_hard_links.$$
sed -i tmp1 “/$line/d” alllostProjects.onlyonce.$$
done
exec 0<&3 3<&-
cut -f 1-13 -d”,” alllostProjects_symbolic_links.$$ > alllostProjects_slnopath.$$
exec 3<&0
exec 0< alllostProjects_slnopath.$$
while read line
do
sed -i tmp2 “/$line/d” alllostProjects.onlyonce.$$
done
exec 0<&3 3<&-
- Schritt III.
Die inodes, modes und paths können folgendermaßen extrahiert werden:
# sed -e ‘s/^\(0x[0-9a-f][0-9a-f]*\),\([0-9][0-9]*\),\([0-9][0- 9]*,[0-9][0-9]*,[-_A-Za-z0-9][-_A-Za-z0-9]*,[0-9][0-9]*,[0-9][0- 9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0- 9]*,[0-9][0-9]*\),\(.*\)$/\1,\2,\4/’ > alllostProjects_inode_mode_path.$$ < alllostProjects.onlyonce.$$
- Schritt IV.
Die Directory Einträge können mit dem mode Wert extrahiert werden. Möglicherweise ist der Schaden aber schon so groß, dass nicht alle Directories erkannt werden. Der letzte Eintrag des File Pfades kann dann abgeschnitten werden und die fehlenden Diretories extrahiert werden. Dann können alle Directories unter /Volumes/restore erstellt werden:
# awk -F, ‘$2 ~ /^1[0-9][0-9]*/ {print}’ < alllostProjects_inode_mode_path.$$ | sed -e “s/^\(0x[0-9a-f][0-9a-f]*\),\([0-9][0-9]*\),\(.*\)$/\3/g” > alllostProjects_dirlist.$$
# awk -F, ‘$2 ~ /^3[0-9][0-9]*/ {print}’ < alllostProjects_inode_mode_path.$$ | sed -e “s/^\(0x[0-9a-f][0-9a- f]*\),\([0-9][0-9]*\),\(.*\)$/dirname ‘\3′/g” | /bin/sh >> alllostProjects_dirlist.$$
# sed -e “s/’/'\\\”/” < alllostProjects_dirlist.$$ | sed -e “s/\(.*\)/mkdir -p \/Volumes\/restore\/’\1′/” | sort -r | uniq | /bin/sh
Erinnern Sie sich daran, dass man mit Finder alle möglichen Sonderzeichen vergeben kann. cvfsdb kann diese Zeichen nicht verarbeiten, aber das Unix mv Kommando kann es. Sie können jedem File einen alphanumerischen “unique identifier” geben unter welchem dieses File zunächst abgespeichert wird und dann später wieder in den ursprünglichen Namen umbenannt wird. (mit mv). Man könnte somit jeden File Pfad mit seiner md5 checksum assoziieren:
# mkdir -p /Volumes/restore/md5_files
# awk -F, ‘$2 ~ /^3[0-9][0-9]*/ {print}’ < alllostProjects_inode_mode_path.$$ | sed -e “s/^\(0x[0-9a-f][0-9a-f]*\),\([0-9][0-9]*\),\(.*\)$/\/bin\/echo \1,\`echo \/Volumes\/restore\/’\3′ \| md5 \`,’\3′/g” | /bin/sh | sed -e “s/’/'\\\”/g” > alllostProjects.inodes_md5checksum_path.$$
Die Inhalte der File Inodes können nun mit cvfsdb als md5 checksum abgespeichert werden:
# awk -F, ‘{print “echo save “$1″ \/Volumes\/restore\/md5_files\/”$2″ \| cvfsdb Testvol”}’ < alllostProjects.inodes_md5checksum_path.$$ | /bin/sh
Jetzt müssen die md5 checksums nur noch dem ursprünglichen Namen zugeordnet werden:
# sed -e “s/^\(0x[0-9a-f][0-9a-f]*\),\([a-z0-9][a-z0- 9]*\),\(.*\)$/mv \/Volumes\/restore\/md5_files\/’\2′ \/Volumes\/restore\/’\3′/” < alllostProjects.inodes_md5checksum_path.$$ | /bin/sh
Mit den mode Werten können die Permissions für die Files extrahiert und angepasst werden. Der mode Wert kann so benutzt werden:
# sed -e “s/^\(0x[0-9a-f][0-9a-f]*\),\([0-9][0-9]*\),\(.*\)$/chmod \`printf \”\%lo\” \2 \| cut -c 3-6 \| awk \’\{print \$1 + 0\}\’\` \/Volumes\/restore\/’\3′/g” < alllostProjects_inode_mode_path.$$ | /bin/sh
# sed -e “s/^\(0x[0-9a-f][0-9a-f]*\),\([0-9][0-9]*,[0-9][0-9]*,[0- 9][0-9]*,[-_A-Za-z0-9][-_A-Za-z0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0- 9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0-9]*,[0-9][0- 9]*\),\(.*\)/echo show inode \1 \| cvfsdb Testvol \| grep -e idi_uid -e idi_gid \| awk -F\”= \” ‘\{printf \”\%d\\\n\”,\$2\}’ \| xargs -n 2 \| tr \” \” : \| xargs -J \% chown \% \/Volumes\/restore\/’\3′/” < alllostProjects.onlyonce.$$ | /bin/sh
- Schritt V.
Jetzt ist alles wiederhergestellt unter /Volumes/restore/Projects. Nur die hard links und symbolic links sind noch nicht am Platz.
Wir benötigen die files alllostProjects_symbolic_links.$$ und alllostProjects_hard_links.$$ welche wir vorher erstellt haben.
Führen sie cvfsdb auf jede inode in alllostProjects_symbolic_links.$$ aus und überprüfen Sie die “Extended Attributes” Sektion, um den originalen File Pfad zu finden und die symbolic links analog im restore Folder zu erstellen.
Für hardlinks verfahren Sie genauso mit Hilfe des files alllostProjects_hard_links.$$
Ein Beispielskript für die obigen Ausführungen finden Sie hier.
- Hinweis:
Benutzung auf eigene Gefahr! ConSol* übernimmt keine Haftung!




Fachjury wählte die besten Projekte der österreichischen Beratungs- und IT-Branche
ConSol*-Partner op5 veranstaltet Best Practice Tag zu op5 Monitor
Informationen und 