Published: Thursday, Oct 3, 2013 Last modified: Monday, Dec 9, 2024
So I bought a “SanDisk SDSSDHP-128G-G25 128GB Ultra Plus SATA 3.0 6GB/s 7mm Internal SSD” aka “sandisk” to complement my existing “OCZ 120GB Nocti SSD - mSATA SATA-II - Read 280MB/s Write 260MB/s” aka “nocti” disk connected to my Mini-SATA port.
I primarily thought I would experiment with cloning nocti to the sandisk, so that if nocti failed I could use sandisk. Or I could see performance differences running the same system. Or I could do fun things like upgrade one, but not the other and see if I could measure or debug something.
Straight up dd
Note: In hindsight you are almost always better off mkfs.ext4
and rsync -a
files over instead off dd
!
I first tried, whilst running and mounted on /dev/sdb (nocti):
dd if=/dev/sdb | pv | dd of=/dev/sda
pv
supposed to “monitor the progress of data through a pipe”, however it
didn’t give me a proper progress bar. It only told me that I was copying at a
rate of about 10MB/sec, which I found a bit disappointing.
# parted --list | grep .
Model: ATA SanDisk SDSSDH21 (scsi)
Disk /dev/sda: 128GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32.3kB 120GB 120GB primary ext4 boot
Model: ATA OCZ-NOCTI (scsi)
Disk /dev/sdb: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 32.3kB 120GB 120GB primary ext4 boot
First problem is that I’m wasting 8GB. Second problem is that I’m dd-ing from a running system. Lets try boot into sandisk!
Uh oh, lots of errors. dd
simply didn’t work, even after running a fsck
upon it. Also scarily, the “sandisk” was referring to itself as “nocti” when I was using it. That’s because when I dd-ed it, the label came across:
x220:~$ sudo e2label /dev/sda1
nocti
x220:~$ sudo e2label /dev/sdb1
nocti
Sadly one can’t do a top level label, you have to do it on a partition:
sudo e2label /dev/sda sandisk
e2label: Bad magic number in super-block while trying to open /dev/sdb
Couldn't find valid filesystem superblock.
Lets try a dd from a live USB like Webconverger
In 20 minutes I successfully managed to clone “nocti” to “sandisk” using 4M as
the block size. I ran e2label /dev/sda1 sandisk
and now we have:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
└─sda1 ext4 sandisk 5d40f591-086f-407a-9b6c-fb3fec1dc046 /
sdb
└─sdb1 ext4 nocti 5d40f591-086f-407a-9b6c-fb3fec1dc046
Notice they have the exact same UUID.
hdparm to compare disk speed
So the sandisk shows:
# hdparm -tT /dev/sda
/dev/sda:
Timing cached reads: 6672 MB in 2.00 seconds = 3336.70 MB/sec
Timing buffered disk reads: 1466 MB in 3.00 seconds = 488.37 MB/sec
And nocti is:
[root@x220 ~]# hdparm -tT /dev/sdb
/dev/sdb:
Timing cached reads: 10298 MB in 2.00 seconds = 5152.28 MB/sec
Timing buffered disk reads: 338 MB in 3.01 seconds = 112.21 MB/sec
I added “noatime,discard” to my mount options and sda seems faster or hdparm is just variable?
[root@x220 ~]# hdparm -tT /dev/sda
/dev/sda:
Timing cached reads: 10688 MB in 2.00 seconds = 5347.33 MB/sec
Timing buffered disk reads: 1368 MB in 3.00 seconds = 455.69 MB/sec
[root@x220 ~]# hdparm -tT /dev/sdb
/dev/sdb:
Timing cached reads: 10156 MB in 2.00 seconds = 5081.24 MB/sec
Timing buffered disk reads: 338 MB in 3.01 seconds = 112.13 MB/sec
Next, expanding the sandisk to take all the space by recreating the partition (BAD IDEA)
Parted seems unable to detect the dimensions of the disk for partition creation, hence I used fdisk
.
# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23.2).
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-250069679, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-250069679, default 250069679):
Using default value 250069679
Partition 1 of type Linux and of size 119.2 GiB is set
Command (m for help): p
Disk /dev/sda: 128.0 GB, 128035676160 bytes, 250069680 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xba6fb7fd
Device Boot Start End Blocks Id System
/dev/sda1 2048 250069679 125033816 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# resize2fs /dev/sda1
resize2fs 1.42.8 (20-Jun-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/sda1
Couldn't find valid filesystem superblock.
I think the problem is that fdisk seems to think the start is at default
2048, when looking back to original parted
output after the dd, it’s in fact
32.3kB. I do not know how to specify 32.3kB as the start for fdisk.
WARNING: http://askubuntu.com/a/115337/676 is bad advice, since fdisk
will forcibly start at 2048 (default since fdisk 2.17.2), and will not allow to start at a lower sector!
SATA speeds
On my X220 system, I have a number of SATA ports:
# ls /sys/class/ata_port/
ata1 ata2 ata3 ata4 ata5 ata6
To determine the speed:
# dmesg | grep -i sata | grep 'link up'
ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
IIUC, sandisk is on ata1:
# journalctl -b | grep -i sandisk | grep ata
Oct 07 15:26:41 x220 kernel: ata1.00: ATA-8: SanDisk SDSSDH2128G, X211200, max UDMA/133
And nocti is on ata3:
# journalctl -b | grep -i nocti | grep at
Oct 07 15:26:41 x220 kernel: ata3.00: ATA-8: OCZ-NOCTI, 2.15, max UDMA/133
Finally, the right way to clone a disk
The best approach I’ve found is to boot Archlinux install disk. Assuming your destination is sandisk at /dev/sda and source is nocti at /dev/sdb.
lsblk -f
fdisk /dev/sda
n, p, enter, enter # Create partition
mkfs.ext4 /dev/sda1
e2label /dev/sda1 sandisk
mkdir /mnt/{nocti,sandisk}
mount /dev/sdb1 /mnt/nocti
mount /dev/sda1 /mnt/sandisk -o noatime,rw,discard
rsync -a /dev/nocti/ /mnt/sandisk
vim /mnt/sandisk/etc/fstab # update LABEL=sandisk
vim /mnt/sandisk/boot/syslinux/syslinux.cfg # update root=LABEL=sandisk
syslinux-install_update.sh -i -a -m -c /mnt/sandisk