Wednesday, 17 December 2008

Juletip 17: Hey Rudolf bak lige kanen, vi tabte lige en disk

« Juletip 16: vågner vågner danske helte | Main | Juletip 18: Hip hurra for Peter og relayd »

Har du prøvet at miste data?

Ja, svarer de fleste - uanset om det så er 5 minutters tekstdokument, eller hele billedegalleriet og din musik. I det sidste tilfælde med mistet "MGP musik" kan det dog være verden er blevet et bedre sted, så måske skal vi sige tak til tyven for at have medvirket til at bevare lidt julefred ;-)

Nå - dagens tip er en blanding og forhåbentlig kommer det i tide, og før du kastes endegyldigt ind i tørretumbleren som vi kalder julehygge, gaveindkøb, madlavning, gaveindpakning, afbrænding af adventskransens sidste lys, opsamling af juletræ, rensning af hænderne med rensebenzin efter du kom hjem med juletræet, osv. :-)

Dagens tip er forøvrigt inspireret af Flemming Jacobsen, og er et mix af gode råd - som jeg håber får dig til at stoppe op og gøre det vigtige!

Bemærk at nedenstående ikke er en komplet og endegyldig liste - og udvid gerne med gøremål i huset, lejligheden.

Du skal i denne tid, nu da der er gået omkring et år siden sidste jul og nytår, forsøge at komme problemerne i forkøbet.

Del 1 - blæsere

Check dine blæsere i dine IT-systemer, er alle blæsere på plads, er der fri adgang til lufthullerne eller hænger der en nullermand på størrelse med en halvstor yeti fra Himalaya

Netop nu er der en smule køligere i mit serverrum og derfor vil jeg ikke opdage det hvis en blæser i kabinettet står af - men til sommer vil maskinen måske brænde af. Så check lige blæserne i dine systemer.

Del 2 - diske, levetid og temperatur

Et andet godt sted lige at checke status er på dine harddiske og det kan du gøre med Smartmontools, som du straks bør installere. Med dette værktøj kan du se en frygtelig masse information om dine harddiske, se eksempelvis denne (kræver at du har slået SMART til på diskene):

hlk@sunny:hlk$ sudo smartctl -a /dev/wd0c
smartctl version 5.37 [x86_64-unknown-openbsd4.3] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF INFORMATION SECTION ===
Model Family: Maxtor DiamondMax Plus 9 family
Device Model: Maxtor 6Y080M0
Serial Number: Y2JW81WE
Firmware Version: YAR511W0
User Capacity: 81,964,302,336 bytes
Device is: In smartctl database [for details use: -P show]
ATA Version is: 7
ATA Standard is: ATA/ATAPI-7 T13 1532D revision 0
Local Time is: Wed Dec 17 15:11:32 2008 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status: (0x82) Offline data collection activity
was completed without error.
Auto Offline Data Collection: Enabled.
Self-test execution status: ( 0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 241) seconds.
Offline data collection
capabilities: (0x5b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities: (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability: (0x01) Error logging supported.
No General Purpose Logging support.
Short self-test routine
recommended polling time: ( 2) minutes.
Extended self-test routine
recommended polling time: ( 37) minutes.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
3 Spin_Up_Time 0x0027 224 219 063 Pre-fail Always - 5779
4 Start_Stop_Count 0x0032 253 253 000 Old_age Always - 47
5 Reallocated_Sector_Ct 0x0033 253 252 063 Pre-fail Always - 1
6 Read_Channel_Margin 0x0001 253 253 100 Pre-fail Offline - 0
7 Seek_Error_Rate 0x000a 253 252 000 Old_age Always - 0
8 Seek_Time_Performance 0x0027 253 240 187 Pre-fail Always - 47953
9 Power_On_Minutes 0x0032 193 193 000 Old_age Always - 189h+09m
10 Spin_Retry_Count 0x002b 253 252 157 Pre-fail Always - 0
11 Calibration_Retry_Count 0x002b 253 252 223 Pre-fail Always - 0
12 Power_Cycle_Count 0x0032 253 253 000 Old_age Always - 93
192 Power-Off_Retract_Count 0x0032 253 253 000 Old_age Always - 0
193 Load_Cycle_Count 0x0032 253 253 000 Old_age Always - 0
194 Temperature_Celsius 0x0032 253 253 000 Old_age Always - 52
195 Hardware_ECC_Recovered 0x000a 253 252 000 Old_age Always - 10358
196 Reallocated_Event_Count 0x0008 248 248 000 Old_age Offline - 5
197 Current_Pending_Sector 0x0008 253 253 000 Old_age Offline - 0
198 Offline_Uncorrectable 0x0008 248 248 000 Old_age Offline - 5
199 UDMA_CRC_Error_Count 0x0008 199 199 000 Old_age Offline - 0
200 Multi_Zone_Error_Rate 0x000a 252 252 000 Old_age Always - 0
201 Soft_Read_Error_Rate 0x000a 253 252 000 Old_age Always - 39
202 TA_Increase_Count 0x000a 253 181 000 Old_age Always - 0
203 Run_Out_Cancel 0x000b 253 251 180 Pre-fail Always - 31
204 Shock_Count_Write_Opern 0x000a 253 252 000 Old_age Always - 0
205 Shock_Rate_Write_Opern 0x000a 253 252 000 Old_age Always - 0
207 Spin_High_Current 0x002a 253 252 000 Old_age Always - 0
208 Spin_Buzz 0x002a 253 252 000 Old_age Always - 0
209 Offline_Seek_Performnce 0x0024 187 187 000 Old_age Offline - 0
99 Unknown_Attribute 0x0004 253 253 000 Old_age Offline - 0
100 Unknown_Attribute 0x0004 253 253 000 Old_age Offline - 0
101 Unknown_Attribute 0x0004 253 253 000 Old_age Offline - 0

SMART Error Log Version: 1
Warning: ATA error count 56 inconsistent with error log pointer 5

ATA Error Count: 56 (device log contains only the most recent five errors)
CR = Command Register [HEX]
FR = Features Register [HEX]
SC = Sector Count Register [HEX]
SN = Sector Number Register [HEX]
CL = Cylinder Low Register [HEX]
CH = Cylinder High Register [HEX]
DH = Device/Head Register [HEX]
DC = Device Command Register [HEX]
ER = Error register [HEX]
ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 56 occurred at disk power-on lifetime: 5429 hours (226 days + 5 hours)
When the command that caused the error occurred, the device was in an unknown state.

After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 51 20 00 71 5b e4 Error: UNC 32 sectors at LBA = 0x045b7100 = 73101568

Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
c8 03 20 00 71 5b e4 00 00:06:44.976 READ DMA
ca 03 20 e0 70 5b e4 00 00:06:44.720 WRITE DMA
c8 03 20 e0 70 5b e4 00 00:06:43.696 READ DMA
ca 03 20 c0 70 5b e4 00 00:06:43.696 WRITE DMA
c8 03 20 c0 70 5b e4 00 00:06:43.696 READ DMA

Error 55 occurred at disk power-on lifetime: 5429 hours (226 days + 5 hours)
When the command that caused the error occurred, the device was in an unknown state.

After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 51 01 e0 70 5b e4 Error: UNC 1 sectors at LBA = 0x045b70e0 = 73101536

Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
c8 03 20 e0 70 5b e4 00 00:06:43.696 READ DMA
ca 03 20 c0 70 5b e4 00 00:06:43.696 WRITE DMA
c8 03 20 c0 70 5b e4 00 00:06:43.696 READ DMA
ca 03 20 a0 70 5b e4 00 00:06:43.696 WRITE DMA
c8 03 20 a0 70 5b e4 00 00:06:43.696 READ DMA

Error 54 occurred at disk power-on lifetime: 5524 hours (230 days + 4 hours)
When the command that caused the error occurred, the device was in an unknown state.

After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 59 01 a3 58 60 e5 Error: UNC at LBA = 0x056058a3 = 90200227

Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
20 00 01 a3 58 60 e5 00 4d+18:27:40.368 READ SECTOR(S)
c6 00 10 00 00 00 a0 00 4d+18:27:40.352 SET MULTIPLE MODE
ef 03 0c 00 00 00 a0 00 4d+18:27:40.352 SET FEATURES [Set transfer mode]
10 00 01 01 00 00 a0 00 4d+18:27:40.352 RECALIBRATE [OBS-4]
20 00 01 a3 58 60 e5 04 4d+18:27:39.872 READ SECTOR(S)

Error 53 occurred at disk power-on lifetime: 5524 hours (230 days + 4 hours)
When the command that caused the error occurred, the device was in an unknown state.

After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 59 01 a3 58 60 e5 Error: UNC at LBA = 0x056058a3 = 90200227

Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
20 00 01 a3 58 60 e5 00 4d+18:27:38.864 READ SECTOR(S)
c6 00 10 00 00 00 a0 00 4d+18:27:38.864 SET MULTIPLE MODE
ef 03 0c 00 00 00 a0 00 4d+18:27:38.864 SET FEATURES [Set transfer mode]
10 00 01 01 00 00 a0 00 4d+18:27:38.848 RECALIBRATE [OBS-4]
c4 00 04 a3 58 60 e5 04 4d+18:27:38.384 READ MULTIPLE

Error 52 occurred at disk power-on lifetime: 5524 hours (230 days + 4 hours)
When the command that caused the error occurred, the device was in an unknown state.

After command completion occurred, registers were:
ER ST SC SN CL CH DH
-- -- -- -- -- -- --
40 51 04 a3 58 60 e5 Error: UNC at LBA = 0x056058a3 = 90200227

Commands leading to the command that caused the error were:
CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name
-- -- -- -- -- -- -- -- ---------------- --------------------
c4 00 04 a3 58 60 e5 00 4d+18:27:37.376 READ MULTIPLE
c6 00 10 00 00 00 a0 00 4d+18:27:37.360 SET MULTIPLE MODE
ef 03 0c 00 00 00 a0 00 4d+18:27:37.360 SET FEATURES [Set transfer mode]
10 00 01 01 00 00 a0 00 4d+18:27:37.360 RECALIBRATE [OBS-4]
c4 00 04 a3 58 60 e5 04 4d+18:27:36.880 READ MULTIPLE

SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]


SMART Selective self-test log data structure revision number 1
SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS
1 0 0 Not_testing
2 0 0 Not_testing
3 0 0 Not_testing
4 0 0 Not_testing
5 0 0 Not_testing
Selective self-test flags (0x0):
After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Så med dette værktøj er det muligt at holde øje med status på disken, helst før den brænder af. Det jeg holder øje med er om den viser fejl, periodiske eller permanente, temperaturen på diskene og alderen på diskene. Mine diske der har faktisk holdt lang tid :-)

Tidligere lavede jeg endda grafer med RRDtool ud fra smartmontools og sensors aflæsninger. Fine grafer over CPU temperatur, diskene osv. Gad vidst hvor de er blevet af? De scripts jeg brugte ligger på http://www.kramse.org/files/tools/net/rrdtool/ og er oprindeligt lavet af Flemming.

Del 3 - Backup

Nu er disken ovenfor ikke den eneste disk i systemet, jeg bruger RAID1 spejling via OpenBSD RAIDframe, så hvis den ene disk skulle gå i stykker kører systemet videre. Derfor har jeg i mit loginscript lagt følgende kommando ind: sudo raidctl -p all, så hver gang jeg logger på får jeg status på mine RAIDs:

raid6: Parity status: clean
raid5: Parity status: clean
raid4: Parity status: clean
raid3: Parity status: clean
raid2: Parity status: clean
raid1: Parity status: clean
raid0: Parity status: clean

Husk dog at RAID ikke er en erstatning for backup, så husk også at lave en backup. Jeg har netop lavet en backup af ovenstående system og det tog under en halv time at lave en remote dump over SSH. Til det formål har jeg lavet et script som så er linket til flere navne, check $0 hvis du ikke kender dette trick.

#! /bin/sh
#
# dump all filesystems from remote host
# Henrik Lund Kramshoej
# hlk@security6.net
#
# will figure out host to backup
# - based on the name used when called
#
# arguments are
# $1 is the target host
PROGRAM=`basename $0`
DATE=`date +%Y-%m-%d`

BACKUP_PATH=/userdata/dumps

# prepare for execution, parse arguments etc
case "$PROGRAM" in
betty.dump-remote) HOST="betty" ;;
sunny.dump-remote) HOST="sunny" ;;
kris.dump-remote) HOST="kris" ;;
fiona.dump-remote) HOST="fiona" ;;
timon.dump-remote) HOST="timon" ;;
*) echo "$0 unknown host"; exit 127;;
esac

FILESYSTEMS=`ssh $HOST "mount | cut -d ' ' -f 1"`

mkdir -p $BACKUP_PATH/$HOST/$DATE
cd $BACKUP_PATH/$HOST/$DATE

for fs in $FILESYSTEMS
do
current=`echo $fs | sed "s/dev//g" | tr -d '/' `
ssh $HOST "sudo dump -0auf - $fs " | gzip > $HOST-$current.dump.gz
done

og en kørsel - starter med:

hlk@fluffy:hlk$ sunny.dump-remote                                                                                                                  
DUMP: Date of this level 0 dump: Wed Dec 17 15:26:48 2008
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/rraid0a (/) to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 62462 tape blocks.
DUMP: Volume 1 started at: Wed Dec 17 15:26:51 2008
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: 63998 tape blocks
DUMP: Date of this level 0 dump: Wed Dec 17 15:26:48 2008
DUMP: Volume 1 completed at: Wed Dec 17 15:27:04 2008
DUMP: Volume 1 took 0:00:13
DUMP: Volume 1 transfer rate: 4922 KB/s
DUMP: Date this dump completed: Wed Dec 17 15:27:04 2008
DUMP: Average transfer rate: 4922 KB/s
DUMP: level 0 dump on Wed Dec 17 15:26:48 2008
DUMP: DUMP IS DONE
... og så kommer alle de andre filsystemer

Vupti, mens du gnasker pebernødder henter serveren en fuld backup med dump der er lige til at restore, har testet det :-)
Bemærk forøvrigt at mit dump-script ikke har en fast liste over filsystemer, men dynamisk tager allesammen!

Update: efter kommentaren nedenfor fra Dennis. Ovenstående script afvikler jeg på fluffy som er en af mine maskiner med meget disk. Det kører som almindelig bruger på fluffy, sender kommandoer over SSH, en af kommandoerne er sudo med dump som kommando, denne sudo+dump kan lave dump. Data fra dumpet sendes retur gennem SSH forbindelsen og skrives som en fil på Fluffy :-) Dette gøres manuelt fra tid til anden og udnytter at jeg bruger SSH keys og der er derfor ingen password prompts ovenfor.

Løsningen nedenfor som har med rsnapshot at gøre er anderledes, idet rsnapshot er lavet til at køre fra cron, dvs uden min indblanding. Det kører fra en speciel SSH key som jeg har oprettet og lagt på Fluffy. Denne specfikke nøgle er uden passphrase og derfor skal den KUN have lov til at udføre bestemte kommandoer på Sunny, når der tages backup med rsync. Derfor er der en hel masse "besværlig opsætning" nedenfor.

Update - slut

Hvis du istedet for en fuld backup har behov for løbende backup bruger jeg rsnapshot, som på mine systemer virker fordi jeg i min sshd_config har: PermitRootLogin forced-commands-only, og for denne bruger er der en authorized_keys:

root@sunny:.ssh# cat authorized_keys                                                               
from="1.2.3.4",command="/root/bin/validate-rsync" ssh-dss AAAAB3Nkeykeykey..ac= root@sylvester.kramse.org

Der igen betyder at kun een kommando kan udføres som root ved login, det er scriptet validate-rsync:

#!/bin/sh

case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\>*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
test\ --server*)
echo Test OK
echo $SSH_ORIGINAL_COMMAND
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac

Rsnapshot kræver egentlig kun at der er rsync på systemerne der skal tages backup af, derfor er det nemt at komme igang med. NB: forvent ikke at alle permissions fra NTFS eller resources fra HFS+ kommer med over - men til flade filer er det super.

Der er altså ingen undskyldning, sæt en backup over - tag en komplet, skriv det på DVD'er og læg en kopi hos din mor, far, i bankboksen eller under gulvbrædderne :-)

Mens backuppen kører kan du så se på løsninger til daglig backup, i stil med Time Machine på OSX eller rsnapshot som gør noget i samme stil. Rent faktisk er backup i mit hus en dejlig blanding af Time Machine til fruen, rsnapshot til mig, brænding af DVD'er med Burn Folders i OSX og så Prosoft Data Backup som fulgte med en ekstern diskløsning til min laptop (ahhhh 500GB disk i min Macbook Pro er dejligt).

PS Når backuppen så er kørt færdig kan du måske med ro i sindet fjerne noget bit-rot fra dine systemer - filer du ikke bruger mere, opdateringer der er ligegyldige, gammel mail osv. Jeg fik vist fjernet en +20GB ved sidste oprydning!

Posted by hlk at CET 11:12 17/12/2008 in Toolbox entries

 

[Trackback URL for this entry]

Comment: Dennis Decker Jensen at Wed, 17 Dec 4:21 PM

Jeg forstår ikke din backup-løsning.

Hvis det eneste, du må køre på sunny ifølge din sshd_config, er validate-rsync, hvordan kan du så køre sunny.dump-remote fra fluffy, som kører både mount, cut, echo, sed, tr og dump på sunny?

Jeg er heller ikke sikker på, at validate-rsync giver mening. Hvad er SSH_ORIGINAL_COMMAND egentlig, og hvem har sat den, for den er åbenbart ikke lig med validate-rsync, som jeg ville mene den skulle være...

Ellers rigtigt gode juletip! Jeg er ved at tabe pusten lidt. De er alle sammen puttet i min virtuelle julesok, som bliver gemt hele vinteren og fordøjet i små bidder.

Your comment:

(not displayed)
 
 
 

Live Comment Preview:

 
« september »
mationtofr
  12345
6789101112
13141516171819
20212223242526
27282930