labunix's blog

labunixのラボUnix

3TBのデータディスクを増設してみた。

■3TBのデータディスクを増設してみた。
 古いハードディスクマウンタを切り分けたときの
 kernelの認識と報告されたハードディスク情報の差異の記録。
 3TBというサイズのHDDも古くない?というツッコミにはここでは触れない。

$ lsb_release -d
Description:	Debian GNU/Linux 9.4 (stretch)

■Kernelの認識は747GiB。

$ sudo dmesg | grep sdb
[143777.577717] sd 6:0:0:0: [sdb] 1565565872 512-byte logical blocks: (802 GB/747 GiB)
[143777.578113] sd 6:0:0:0: [sdb] Write Protect is off
[143777.578123] sd 6:0:0:0: [sdb] Mode Sense: 21 00 00 00
[143777.578519] sd 6:0:0:0: [sdb] No Caching mode page found
[143777.578534] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[143777.631969]  sdb:
[143777.633420] sd 6:0:0:0: [sdb] Attached SCSI disk

■ディスクの認識は正常

$ ls -l /dev/disk/by-id/* | grep sdb\$
lrwxrwxrwx 1 root root  9  73 01:25 /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F2R540 -> ../../sdb
lrwxrwxrwx 1 root root  9  73 01:25 /dev/disk/by-id/wwn-0x5000c50050410a64 -> ../../sdb

$ sudo hdparm -I /dev/sdb | grep size
	Logical  Sector size:                   512 bytes
	Physical Sector size:                  4096 bytes
	device size with M = 1024*1024:     2861588 MBytes
	device size with M = 1000*1000:     3000592 MBytes (3000 GB)
	cache/buffer size  = unknown

■バルクディスクなのでシールに「AF」のマークがあるのも確認できる。

 アドバンスト・フォーマット
 https://toshiba.semicon-storage.com/jp/product/storage-products/trends-technology/advanced-format.html

■物理セクタサイズの報告がおかしい。
 AFT(Advanced Format 512e)を無視して746.5Gしか認識していない。

$ find /sys/class/block/sdb/queue/ -type f -name "[lp]*size" | grep . `xargs`
/sys/class/block/sdb/queue/physical_block_size:512
/sys/class/block/sdb/queue/logical_block_size:512

$ sudo lsblk /dev/sdb
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdb    8:16   0 746.5G  0 disk 

■KernelのEFIサポートは有効になっている。

$ sudo apt-get install -y kernel-package
$ grep EFI /usr/share/kernel-package/Config/config.$(uname -r | awk -F\- '{print $NF}')
CONFIG_EFI_PARTITION=y

■sdaもAFTなので問題ないはず。

$ sudo fdisk -l /dev/sda | grep ^Sec
Sector size (logical/physical): 512 bytes / 4096 bytes

$ sudo fdisk -l /dev/sdb | grep ^Sec
Sector size (logical/physical): 512 bytes / 512 bytes

$ sudo blockdev --getpbsz /dev/sda
4096

$ sudo blockdev --getpbsz /dev/sdb
512

■ブロック数から算出しても確かに746.52GiBしか認識していない。

$ cat /proc/partitions
major minor  #blocks  name

   8        0  488386584 sda
   8        1     291840 sda1
   8        2   31250432 sda2
   8        3   58593280 sda3
   8        4  202930176 sda4
   8        5  195318784 sda5
   8       16  782782936 sdb

$ awk '/sdb/{print $(NF-1)/1024/1024"GiB"}' /proc/partitions
746.52GiB

■セクタサイズも、ファイルサイズも同じ。

$ echo $(cat /sys/class/block/sdb/size) $(sudo blockdev --getsize /dev/sdb) | awk '{if($1==$2){print $1"="$2}}'
1565565872=1565565872

$ echo $(sudo blockdev --getsize64 /dev/sdb) | awk '{print $1/1024/1024/1024"GiB"}'
746.52GiB

■テストもパスするので、やはりHWの異常や認識の誤りでは無い。

$ apt-file search bin/smartctl
smartmontools: /usr/sbin/smartctl

$ sudo smartctl -H /dev/sdb
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.9.0-6-amd64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

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

$ sudo smartctl --info /dev/sdb | grep "^User\|^Sector"
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical

■PC側の挿入口が青い3.0の1箇所を含めて計4箇所のUSBポートに繋げても同じ。
 USBケーブルのポートが黒、USB2.0モデルのハードディスクマウンタが古すぎるのか?

$ sudo lsusb | awk '/hub/'
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

■そうでした。ハードディスクマウンタが古すぎました。
 USBケーブルのポートが青、USB3.0モデルのハードディスクのマウンタを購入して接続

$ sudo dmesg | grep sdb | tail -7
[234153.746023] sd 6:0:0:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.73 TiB)
[234153.746028] sd 6:0:0:0: [sdb] 4096-byte physical blocks
[234153.746452] sd 6:0:0:0: [sdb] Write Protect is off
[234153.746458] sd 6:0:0:0: [sdb] Mode Sense: 43 00 00 00
[234153.746618] sd 6:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[234153.800960]  sdb:
[234153.802079] sd 6:0:0:0: [sdb] Attached SCSI disk

$ ls -l /dev/disk/by-id/* | grep sdb\$
lrwxrwxrwx 1 root root  9  7月  5 20:42 /dev/disk/by-id/ata-ST3000DM001-1CH166_Z1F2R540 -> ../../sdb
lrwxrwxrwx 1 root root  9  7月  5 20:42 /dev/disk/by-id/wwn-0x5000c50050410a64 -> ../../sdb

$ sudo hdparm -I /dev/sdb | grep size
	Logical  Sector size:                   512 bytes
	Physical Sector size:                  4096 bytes
	device size with M = 1024*1024:     2861588 MBytes
	device size with M = 1000*1000:     3000592 MBytes (3000 GB)
	cache/buffer size  = unknown

$  find /sys/class/block/sdb/queue/ -type f -name "[lp]*size" | grep . `xargs`
/sys/class/block/sdb/queue/physical_block_size:4096
/sys/class/block/sdb/queue/logical_block_size:512

$  sudo lsblk /dev/sdb
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  2.7T  0 disk 

$ sudo fdisk -l /dev/sdb | grep ^Sec
GPT PMBR size mismatch (1565565871 != 5860533167) will be corrected by w(rite).
Sector size (logical/physical): 512 bytes / 4096 bytes

$ sudo blockdev --getpbsz /dev/sdb
4096

$ cat /proc/partitions
major minor  #blocks  name

   8        0  488386584 sda
   8        1     291840 sda1
   8        2   31250432 sda2
   8        3   58593280 sda3
   8        4  202930176 sda4
   8        5  195318784 sda5
   8       16 2930266584 sdb

$ awk '/sdb/{print $(NF-1)/1024/1024"GiB"}' /proc/partitions
2794.52GiB

$ echo $(cat /sys/class/block/sdb/size) $(sudo blockdev --getsize /dev/sdb) | awk '{if($1==$2){print $1"="$2}}'
5860533168=5860533168

$ echo $(sudo blockdev --getsize64 /dev/sdb) | awk '{print $1/1024/1024/1024"GiB"}'
2794.52GiB

$ sudo smartctl -H /dev/sdb
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.9.0-6-amd64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

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

$ sudo smartctl -i /dev/sdb | \
    awk -F\: '{if($1=="Serial Number"||$1=="LU WWN Device Id"){printf "%-18sXXXXXX\n",$1":"}else{print}}'
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.9.0-6-amd64] (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-1CH166
Serial Number:    XXXXXX
LU WWN Device Id: XXXXXX
Firmware Version: CC26
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
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:    Thu Jul  5 21:08:01 2018 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

■ということであとは普通にフォーマットするのだけど。。。

$ sudo parted /dev/sdb print
Model: ASMT 2115 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags

$ sudo parted /dev/sdb mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes                                                               
Information: You may need to update /etc/fstab.

■partedが報告する3001GBと「0でなく0%」というgoogle先生のナレッジでも警告が出る。

$ sudo parted /dev/sdb "mkpart primary ext4 0% 3001GB"
Warning: You requested a partition from 0.00B to 3001GB (sectors 0..5860533167).
The closest location we can manage is 17.4kB to 33.6MB (sectors 34..65534).
Is this still acceptable to you?
Yes/No? Yes                                                               
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Cancel

■計算してみると「65535」。fdiskでもそう報告している。

$ awk '{print ($0+0)/512}' /sys/block/sdb/queue/optimal_io_size
65535

$ sudo fdisk -l /dev/sdb | grep -B 1 ^/
Device     Start        End    Sectors  Size Type
/dev/sdb1  65535 5860532909 5860467375  2.7T Linux filesystem
Partition 1 does not start on physical sector boundary.

$ sudo parted /dev/sdb "mkpart primary ext4 65535s 100%"
Information: You may need to update /etc/fstab.

$ sudo parted /dev/sdb "print"
Model: ASMT 2115 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      33.6MB  3001GB  3001GB               primary

$  sudo fdisk -l /dev/sdb | grep -B 1 ^/
Partition 1 does not start on physical sector boundary.
Device     Start        End    Sectors  Size Type
/dev/sdb1  65535 5860532909 5860467375  2.7T Linux filesystem

$ sudo mkfs /dev/sdb1 | awk -F\: '{if($1=="Filesystem UUID"){printf "%-18sXXXXXX\n",$1":"}else{print}}'
mke2fs 1.43.4 (31-Jan-2017)
/dev/sdb1 alignment is offset by 512 bytes.
This may result in very poor performance, (re)-partitioning suggested.
Creating filesystem with 732558421 4k blocks and 183140352 inodes
Filesystem UUID: 9762df53-d940-4a9b-bead-bc550aaf2e9c
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information:      done      

$ sudo mount /dev/sdb1 /media/sdb1

$ env LANG=C df -h  | grep "File\|sdb"
Filesystem                                Size  Used Avail Use% Mounted on
/dev/sdb1                                 2.7T   73M  2.6T   1% /media/sdb1