Tutorial : Αλλαγή Δίσκου σε Dedicated Server στη Hetzner

Η hetzner αποτελεί την αγαπημένη επιλογή αρκετών εταιρειών web development λόγο προσιτών τιμών . Φυσικά αυτό έρχεται με το αντίστοιχο τίμημα μιας και απαιτείται το monitoring του server μας να γίνεται από εμάς .

Μία από τις πιο δύσκολες περιπτώσεις που μπορεί να συναντήσουμε σε έναν dedicated server είναι να έχει χτυπήσει ένας ή περισσότεροι σκληροί δίσκοι. Η διαδικασία που θα πρέπει να ακολουθήσουμε για να μην κλαίμε την μοίρα μας είναι η άμεση αντικατάσταση του δίσκου . Στον παρακάτω οδηγό περιγράφω τα βήματα μιας και είναι ιδιαίτερα αγχωτικό .

Αρχικά να ξεκαθαρίσω πώς το βήμα 0 είναι να έχετε πάρει backup το server σας με κάποιο τρόπο δεν θα το συζητήσουμε εδώ αυτό και το βήμα 1 είναι να έχετε πάρει ξανά backup το server σας .

Στη συνέχεια θα χρειαστούμε ένα χρήσιμο εργαλείο το οποίο θα μας βοηθήσει να δούμε σε τί κατάσταση είναι οι δίσκοι μας , τα serial number αυτών κλπ . Το εργαλείο αυτό είναι το smartmontools. Επίσης σε επόμενο post θα γράψω πώς μπορεί το συγκεκριμένο εργαλείο να χρησιμοποιηθεί για monitoring των δίσκων του server.

Η εγκατάστασή του γίνεται με την εντολή :

yum install smartmontools

Στη συνέχεια πριν τρέξουμε SMART Tests τρέχουμε την παρακάτω εντολή για να δούμε πόσους δίσκους έχουμε στο μηχάνημά μας :

cat /proc/mdstat για να δώ πόσους δίσκους έχει το μηχάνημα

Παρακάτω βλέπουμε το output


[root@dtekhost01 ~]# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda2[2] sdb2[1]
      523712 blocks super 1.2 [2/2] [UU]
      
md2 : active raid1 sda3[2] sdb3[1]
      1073610752 blocks super 1.2 [2/2] [UU]
      bitmap: 4/8 pages [16KB], 65536KB chunk

md0 : active raid1 sda1[2] sdb1[1]
      16760832 blocks super 1.2 [2/2] [UU]
      
md3 : active raid1 sda4[2] sdb4[1]
      1839090112 blocks super 1.2 [2/2] [UU]
      bitmap: 0/14 pages [0KB], 65536KB chunk

unused devices: none

Στη συνέχεια θα τρέξουμε τα test με το εργαλείο που εγκαταστήσαμε παραπάνω. Δίνουμε επομένως τις παρακάτω δύο εντολές

smartctl -a /dev/sdb
smartctl -a /dev/sda

οι οποίες αναφέρονται στους δίσκους sda και sdb που βρήκαμε πώς έχουμε στο μηχάνημά μας .

Όπως και βλέπετε στο output υπάρχουν αρκετά errors στον sda τα οποία χρήζουν άμεση αντικατάστασή του. Συγκεκριμένα ο δίσκος ξεπέρασε το προσδόκιμο ζωής του.

smartctl 6.5 2016-05-07 r4318 [x86_64-linux-3.10.0-957.5.1.el7.x86_64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.14 (AF)
Device Model:     ST3000DM001-9YN166
Serial Number:    W1F1ACJ5
LU WWN Device Id: 5 000c50 0538770f2
Firmware Version: CC4B
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Feb 27 09:38:21 2019 CET

==> WARNING: A firmware update for this drive may be available,
see the following Seagate web pages:
http://knowledge.seagate.com/articles/en_US/FAQ/207931en
http://knowledge.seagate.com/articles/en_US/FAQ/223651en

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: 		(  584) seconds.
Offline data collection
capabilities: 			 (0x7b) SMART execute Offline immediate.
					Auto Offline data collection on/off support.
					Suspend Offline collection upon new
					command.
					Offline surface scan supported.
					Self-test supported.
					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.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   1) minutes.
Extended self-test routine
recommended polling time: 	 ( 343) minutes.
Conveyance self-test routine
recommended polling time: 	 (   2) minutes.
SCT capabilities: 	       (0x3085)	SCT Status supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   113   083   006    Pre-fail  Always       -       56752808
  3 Spin_Up_Time            0x0003   093   093   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       21
  5 Reallocated_Sector_Ct   0x0033   098   098   036    Pre-fail  Always       -       3184
  7 Seek_Error_Rate         0x000f   086   060   030    Pre-fail  Always       -       449236795
  9 Power_On_Hours          0x0032   038   038   000    Old_age   Always       -       54481
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       21
183 Runtime_Bad_Block       0x0032   097   097   000    Old_age   Always       -       3
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   001   001   000    Old_age   Always       -       842
188 Command_Timeout         0x0032   100   099   000    Old_age   Always       -       2 4 8
189 High_Fly_Writes         0x003a   097   097   000    Old_age   Always       -       3
190 Airflow_Temperature_Cel 0x0022   065   053   045    Old_age   Always       -       35 (Min/Max 21/39)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       13
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       1671
194 Temperature_Celsius     0x0022   035   047   000    Old_age   Always       -       35 (0 19 0 0 0)
197 Current_Pending_Sector  0x0012   100   001   000    Old_age   Always       -       8
198 Offline_Uncorrectable   0x0010   100   001   000    Old_age   Offline      -       8
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       49556h+56m+00.806s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       70119270344750
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       164905064976389

SMART Error Log Version: 1
ATA Error Count: 831 (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 831 occurred at disk power-on lifetime: 54403 hours (2266 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 80 ff ff ff 4f 00  18d+08:07:37.015  READ FPDMA QUEUED
  60 00 80 ff ff ff 4f 00  18d+08:07:37.015  READ FPDMA QUEUED
  60 00 80 ff ff ff 4f 00  18d+08:07:37.015  READ FPDMA QUEUED
  60 00 80 ff ff ff 4f 00  18d+08:07:37.015  READ FPDMA QUEUED
  60 00 80 ff ff ff 4f 00  18d+08:07:37.015  READ FPDMA QUEUED

Error 830 occurred at disk power-on lifetime: 54402 hours (2266 days + 18 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 80 ff ff ff 4f 00  18d+06:41:30.727  READ FPDMA QUEUED
  60 00 00 ff ff ff 4f 00  18d+06:41:30.727  READ FPDMA QUEUED
  60 00 00 ff ff ff 4f 00  18d+06:41:30.727  READ FPDMA QUEUED
  60 00 00 ff ff ff 4f 00  18d+06:41:30.726  READ FPDMA QUEUED
  ea 00 00 00 00 00 a0 00  18d+06:41:30.694  FLUSH CACHE EXT

Error 829 occurred at disk power-on lifetime: 54400 hours (2266 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 30 03 6f 03  Error: UNC at LBA = 0x036f0330 = 57606960

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 80 78 0c 6f 43 00  18d+04:56:29.037  READ FPDMA QUEUED
  60 00 00 78 08 6f 43 00  18d+04:56:29.037  READ FPDMA QUEUED
  60 00 00 78 04 6f 43 00  18d+04:56:29.037  READ FPDMA QUEUED
  60 00 00 78 00 6f 43 00  18d+04:56:29.037  READ FPDMA QUEUED
  60 00 00 78 ff 6e 43 00  18d+04:56:29.036  READ FPDMA QUEUED

Error 828 occurred at disk power-on lifetime: 54400 hours (2266 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 50 09 6d 03  Error: UNC at LBA = 0x036d0950 = 57477456

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 80 f8 0e 6d 43 00  18d+04:56:13.723  READ FPDMA QUEUED
  60 00 00 f8 0a 6d 43 00  18d+04:56:13.723  READ FPDMA QUEUED
  60 00 00 f8 06 6d 43 00  18d+04:56:13.722  READ FPDMA QUEUED
  60 00 00 f8 02 6d 43 00  18d+04:56:13.722  READ FPDMA QUEUED
  61 00 08 60 4a 05 43 00  18d+04:56:13.722  WRITE FPDMA QUEUED

Error 827 occurred at disk power-on lifetime: 54400 hours (2266 days + 16 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 18 f1 2c 02  Error: UNC at LBA = 0x022cf118 = 36499736

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  60 00 80 00 f1 2c 42 00  18d+04:49:25.950  READ FPDMA QUEUED
  60 00 80 80 f1 2c 42 00  18d+04:49:25.949  READ FPDMA QUEUED
  60 00 80 00 f2 2c 42 00  18d+04:49:25.949  READ FPDMA QUEUED
  61 00 08 40 b4 2d 42 00  18d+04:49:25.949  WRITE FPDMA QUEUED
  61 00 08 f8 0f ee 43 00  18d+04:49:25.949  WRITE FPDMA QUEUED

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%     34206         -
# 2  Extended offline    Completed without error       00%     34188         -
# 3  Extended offline    Completed without error       00%     33008         -
# 4  Extended offline    Completed without error       00%     32990         -
# 5  Extended offline    Completed without error       00%     32928         -
# 6  Short offline       Completed without error       00%     32919         -
# 7  Extended offline    Completed without error       00%      6379         -
# 8  Extended offline    Aborted by host               90%      6373         -
# 9  Short offline       Completed without error       00%      6373         -
#10  Extended offline    Completed without error       00%         5         -

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.

Πριν ξεκινήσουμε το rebuild σημειώνουμε τα serial numbers τα οποία μας τα δίνει το smartctl για κάθε δίσκο . Στη συνέχεια αφαιρώ τον δίσκο από το raid table . Προσπάθησα να ακολουθήσω τις εντολές που πρότεινε η hetzner αλλά πήρα το παρακάτω error :

[root@otinanai rebuild]# mdadm /dev/md0 -r /dev/sda1
mdadm: hot remove failed for /dev/sda1: Device or resource busy

Για το λογο αυτό έτρεξα την εντολη :

mdadm --manage /dev/md1 --fail /dev/sda2 

για καθε partition του sda. Χρειάζεται προσοχή εδώ επομένως αν το κάνετε πρώτη φορά κάντε καλή επαλήθευση.

Στη συνέχεια τρέχουμε την εξής εντολή :

mdadm /dev/md0 -r /dev/sda1
Θα πρέπει να μας επιστρέψει κάτι τέτοιο :
mdadm: hot removed /dev/sda1 from /dev/md0

Αυτό σημαινει ότι αφαιρεθηκε κανονικά επομενως ΠΡΟΣΕΧΤΙΚΑ προχωραμε για τα υπολοιπα

Αφου γίνουν όλα τότε τρέχουμε cat /proc/mdstat όπου ο δίσκος που αφαιρέσαμε θα συμβολίζεται με _

Personalities : [raid1]
md2 : active raid1 sdb3[1]
      1073610752 blocks super 1.2 [2/1] [_U]
      bitmap: 7/8 pages [28KB], 65536KB chunk

md3 : active raid1 sdb4[1]
      1839090112 blocks super 1.2 [2/1] [_U]
      bitmap: 0/14 pages [0KB], 65536KB chunk

md0 : active raid1 sdb1[1]
      16760832 blocks super 1.2 [2/1] [_U]

md1 : active raid1 sdb2[1]
      523712 blocks super 1.2 [2/1] [_U]

To παραπάνω μας δείχνει ότι αφαιρέσαμε τον sda από το RAID επομένως μπορούμε να πούμε την εταιρεία (HETZNER) να αφαιρέσει τον δίσκο . Θα μας ζητήσει το serial number του δίσκου το οποιο το έχουμε βγάλει πιο πάνω

Μόλις ολοκληρώσουν την διαδικάσια θα στείλουν mail οποτε και συνδεομαστε με ssh . Πρέπει να ξέρουμε αν ο δίσκος είανι με MBR ή με GPT

Στη δικια μας περιπτωση ήταν GPT (και GTP φυσικά εννοειται)

Επομένως τρέχουμε τα παρακατω για να γινει αντιγραφη του partition :

sgdisk --backup=sdb_parttable_gpt.bak /dev/sdb
sgdisk --load-backup=sdb_parttable_gpt.bak /dev/sda
Και την παρακατω εντολή για να βάλουμε καινουριο UUID
sgdisk -G /dev/sdb

Αποτελέσματα των παραπάνω εντολών :

[root@otinanai ~]# sgdisk --backup=sdb_parttable_gpt.bak /dev/sdb
The operation has completed successfully.
[root@otinanai ~]# sgdisk --load-backup=sdb_parttable_gpt.bak /dev/sda
Creating new GPT entries.
The operation has completed successfully.
[root@otinanai ~]# sgdisk -G /dev/sda
The operation has completed successfully.

Χτίζουμε ξανα το raid όπου κάνου αντιστοιχιση του sda σε αυτό .

[root@otinanai ~]# mdadm /dev/md0 -a /dev/sda1
mdadm: added /dev/sda1
[root@otinanai ~]# mdadm /dev/md1 -a /dev/sda2
mdadm: added /dev/sda2
[root@otinanai ~]# mdadm /dev/md2 -a /dev/sda3
mdadm: added /dev/sda3
[root@otinanai ~]# mdadm /dev/md3 -a /dev/sda4
mdadm: added /dev/sda4

Ο συγχρονισμός έχει ξεκινήσει .. Περιμένουμε να τελειώσει. Το συγκεκριμένο σημείο είναι κρίσιμο. Σε ότι πιστεύετε είτε ζητήστε τη βοήθειά του είτε πολύ απλά μην το εξοργίσετε.

[root@otinanai ~]# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda2[2] sdb2[1]
      523712 blocks super 1.2 [2/1] [_U]
        resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
      1073610752 blocks super 1.2 [2/1] [_U]
        resync=DELAYED
      bitmap: 7/8 pages [28KB], 65536KB chunk

md0 : active raid1 sda1[2] sdb1[1]
      16760832 blocks super 1.2 [2/1] [_U]
      [=======>.............]  recovery = 37.0% (6212864/16760832) finish=3.4min speed=50984K/sec

md3 : active raid1 sda4[2] sdb4[1]
      1839090112 blocks super 1.2 [2/1] [_U]
        resync=DELAYED
      bitmap: 2/14 pages [8KB], 65536KB chunk

Αφού τελειώσει ο συγχρονισμός τρέχουμε grub2-install /dev/sda προκειμένου να μπορούμε να boot σε περίπτωση επανακκίνησης.

Τώρα στην περίπτωση που είναι χτυπημένος και ο δεύτερος δίσκος όπως συνέβαινε σε εμένα απλά επαναλαμβάνουμε την παραπάνω διαδικασία ξανά αλλά για τον δεύτερο δίσκο.

Οποιοσδήποτε χρειαστεί τη βοηθειά μου ευχαρίστως . Η όλη διαδικασία γνωρίζω πώς είναι ιδιαίτερα αγχωτική για το λόγο αυτό φροντίστε να παίρνετε τακτικά backup.

?>