계산기 사용방법 :
계산기 : http://www.csgnetwork.com/mediasizecalc.html
위 계산기로 계산시 fdisk 정보값을 바탕으로 아래 4가지 입력값을 입력 후 계산하면 결과값이 아래와 같이 산출.
입력값 :
Number Of Heads : 255 Per Drive
Number Of Cylinders : 182401 Per Drive
Number Of Sectors : 63 Per Track
Number Of Byte : 512 Per Sector
결과값 :
Number Of Tracks : 46512255 Total
Number Of Sectors : 2930272065 Total
Number Of Bytes : 1500299297280 Total
Number Of MegaBytes : 1500299.297280 Total
Number Of GigaBytes : 1500.299297280 Total
배드섹터 위치 찾기 :
1. HDD 파티션 정보와 모델명은 아래와 같다.
[root@Sample-local data1]# fdisk -l
Disk /dev/sda: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 10 80293+ 83 Linux
/dev/sda2 11 75 522112+ 82 Linux swap
/dev/sda3 76 140 522112+ 83 Linux
/dev/sda4 141 182401 1464011482+ 5 Extended
/dev/sda5 141 401 2096451 83 Linux
/dev/sda6 402 499 787153+ 83 Linux
/dev/sda7 500 515 128488+ 83 Linux
/dev/sda8 516 182401 1460999263+ 8e Linux LVM
[root@Sample-local data1]# sfdisk -d /dev/sda > sda.sf
[root@Sample-local data1]# cat sda.sf
# partition table of /dev/sda
unit: sectors
/dev/sda1 : start= 63, size= 160587, Id=83, bootable
/dev/sda2 : start= 160650, size= 1044225, Id=82
/dev/sda3 : start= 1204875, size= 1044225, Id=83
/dev/sda4 : start= 2249100, size=2928022965, Id= 5
/dev/sda5 : start= 2249163, size= 4192902, Id=83
/dev/sda6 : start= 6442128, size= 1574307, Id=83
/dev/sda7 : start= 8016498, size= 256977, Id=83
/dev/sda8 : start= 8273538, size=2921998527, Id=8e
[root@Sample-local data1]# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST31500341AS Rev: CC1H
Type: Direct-Access
[root@Sample-local data1]# df -kh
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 494M 107M 362M 23% /
/dev/sda1 76M 12M 61M 16% /boot
none 252M 0 252M 0% /dev/shm
/dev/sda7 122M 5.6M 110M 5% /tmp
/dev/sda5 2.0G 1.6G 278M 86% /usr
/dev/sda6 756M 100M 618M 14% /var
/dev/mapper/lvm_0-home
1.4T 1.1T 311G 78% /home
2. 커널 에러메시지 정보는 아래와 같다.
ata1: translated ATA stat/err 0x51/40 to SCSI SK/ASC/ASCQ 0x3/11/04
ata1: status=0x51 { DriveReady SeekComplete Error }
ata1: error=0x40 { UncorrectableError }
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Read (10) 00 88 e6 14 af 00 00 03 00
Current sda: sense key Medium Error
Additional sense: Unrecovered read error - auto reallocate failed
end_request: I/O error, dev sda, ata1: translated ATA stat/err 0x51/40 to SCSI SK/ASC/ASCQ 0x3/11/04
ata1: status=0x51 { DriveReady SeekComplete Error }
ata1: error=0x40 { UncorrectableError }
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Read (10) 00 88 e6 14 af 00 00 03 00
Current sda: sense key Medium Error
Additional sense: Unrecovered read error - auto reallocate failed
end_request: I/O error, dev sda, sector 2296779951
3. 에레메시지에 표기된 배드섹터의 값으로 배드섹터 위치 찾기.
bad sector : 2296779951
해당 HDD는 Track 당 512Byte 섹터를 적용한 제품으로
(4K 섹터가 적용된 HDD라도 해당 CentOS 4.7_Kernel 2.6.9-78에선 HDD 펌웨어단에서 512Byte로 에뮬레이팅 된다.)
2296779951(배드섹터) * 512 = 1175,951,334,912 Byte 값이 나온다.
위 값을 기바바이트(9자리수를 빼면)로 환산하면 약 1175 Gbyte다.
fdisk의 파티션 정보값과 df 정보를 바탕으로 어림 짐작해도 /dev/sda8 파티션내에서 배드섹터가 발생되었음을 알 수 있다.
즉 /home(유저데이터) 부분에서 발생했다.
* 참고로 해당 서버는 /dev/sda8이 lvm(Single PV)으로 구성되어 있으며, LV 명은 /dev/lvm_0/home 이다.
* 이 문서에 표기된 용량값은 HDD 제조사의 Byte 표기법이다. 즉, OS에서 포맷 후 표기되는 용량이 아니다.
(df 정보값은 OS 포맷 후 용량이다.)
해당 배드섹터의 위치를 정확히 찾아보면 아래와 같다.(sda.sf 값의 size 참조)
/dev/sda1 ~ /dev/sda7 까지의 값 : (160587 + 1044225 + 1044225 + 4192902 + 1574307 + 256977) * 512 = 4,235,890,176 Byte
/dev/sda8의 값 : 2921998527 * 512 = 1496,063,245,824 Byte
따라서 약 4.3 Gbyte 부터 1,500 Gbyte 사이를 사용하는 /dev/sda8 내의 1175 Gbyte 부분에서 배드섹터가 발생하였으므로
/home 디렉토리내의 데이터 중에 일부가 문제가 생겼다.
* 참고로 sda.sf 값을 참조하지 않고 fdisk -l 의 각 파티션의 Blocks 값을 이용해도 된다.
(Blocks값 * 2) + 1 = 값 ---> 결과 값이 sfdisk -d 에 표시된 size 값과 같다.
그러므로 System(OS) 영역인 /dev/sda1 ~ /dev/sda7 까지 dd로 덤프를 뜬후 System 영역을 복구를 해도 문제가 없겠다.
복구 후 home 디렉토리만 따로 rsync 등으로 백업을 받아서 복구를 마무리하면 된다.