2014年12月21日日曜日

ThinkPad W520 の HDD を SSD へ引越し

4年間ほどメインマシンとして ThinkPad T510 (Core i7 M620) を使っており、まだまだ使えそうなのですが、ついついと中古で ThinkPad W520 (Core i7 2960XM) を入手してしまいました。いくつかのベンチマークで、T510 よりも 1.5 倍程度の性能でした。W520 は、メモリスロットが4スロットあり、最大で32Gまで対応できますが、そこまでは不要と判断して、16G(4Gx4枚)としました。そして、W520 は SATA 3.0 対応であり、わたしの自宅マシンとしては初モノです。
というわけで、仕上げに、HDD を SSD に引っ越しましたので、その手順をメモしておきたいと思います。

内蔵されていた HDD は、HITACHI HTS725050A9A364 の容量 500G 7200RPM でした。
どのベンダーの SSD に換装しようかと思ったのですが、今回は自分の中でイメージが良い SanDisk のものを使ってみることにしました。今も使っている Sony CLIE TH55 で、SanDisk 製の MemoryStick を長年使っており、高速だし実績もあるというイメージを持っています。
そんなわけで、Extreme PRO 240G をチョイスしました。

引越し作業は、USB HDD 上にインストールした CentOS 7 から起動して行いました。ちなみに W520 は、USB 3.0 対応でもあるのですが、残念ながら USB 3.0 では CentOS 7 を起動できず、USB 2.0 ポートから起動して作業しました。
プリインストールされていた Win7 のパーティションは、次のようになっていました。
# fdisk -u -l /dev/sda

Disk /dev/sda: 500.1 GB, 500107862016 bytes, 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x153c11d0

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     3074047     1536000    7  HPFS/NTFS/exFAT
/dev/sda2         3074048   944003071   470464512    7  HPFS/NTFS/exFAT
/dev/sda3       944003072   976771071    16384000    7  HPFS/NTFS/exFAT
sda1 が Win7 のシステムパーティション、sda2 が Win7 の本体、sda3 がリカバリ領域 (所謂 D2D 領域) です。

まず最初に、sda2 を gparted で縮小しました。ここで、NTFS パーティションを操作するためには、ntfs-3g と ntfsprogs を入れておく必要があります。どちらも EPEL に収録されています。
縮小後のサイズは、次の通りです。
# fdisk -u -l /dev/sda
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     3074047     1536000    7  HPFS/NTFS/exFAT
/dev/sda2         3074048   134146047    65536000    7  HPFS/NTFS/exFAT
/dev/sda3       944003072   976771071    16384000    7  HPFS/NTFS/exFAT
次に、ディスクの先頭から sda2 の末尾 (sector 134146047) までを、dd コマンドで SSD にコピーしました。SSD は、2nd HDD アダプターに接続。
# echo "134146047 * 512 / 65536" | bc
1048015
# dd if=/dev/sda of=/dev/sdb bs=65536 count=1050000 conv=sparse
必ずそうであるとは断言できませんが、新品の SSD は、全領域がゼロデータのはずなので、conv=sparse でゼロデータをスキップしてコピーしました。ここで、パーティションテーブルも一緒にコピーされたので、不正になった sdb3 を fdisk で削除して、正確に同じサイズの sdb3 を作成しました。
# fdisk -u -l /dev/sdb

Disk /dev/sdb: 240.1 GB, 240057409536 bytes, 468862128 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: 0x153c11d0

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048     3074047     1536000    7  HPFS/NTFS/exFAT
/dev/sdb2         3074048   134146047    65536000    7  HPFS/NTFS/exFAT
/dev/sdb3       134146048   166914047    16384000    7  HPFS/NTFS/exFAT
不要かもしれないとは思いつつ、パーティション 3 の D2D 領域もコピーしました。
# blkdiscard /dev/sdb3  ※1回目の dd で少し余分にコピーしたので、TRIM でクリア
# dd if=/dev/sda3 of=/dev/sdb3 bs=65536 conv=sparse
うまくコピーできたかどうか、md5sum 値を確認。
# dd if=/dev/sda1 bs=65536 | md5sum
# dd if=/dev/sdb1 bs=65536 | md5sum

# dd if=/dev/sda2 bs=65536 | md5sum
# dd if=/dev/sdb2 bs=65536 | md5sum

# dd if=/dev/sda3 bs=65536 | md5sum
# dd if=/dev/sdb3 bs=65536 | md5sum
これで、完全にコピーが終わったので、HDD を取り出して SSD に換装して起動、、、うまくいきました!
D2D リカバリーが出来るかどうかまでは確認していませんが、マシン起動時に ThinkVantage ボタンで D2D リカバリーのメニューには辿り着けました。

余談になりますが、CentOS 7 向けの ntfs-3g は、fstrim に対応しているようです。
# rpm -q --changelog ntfs-3g | less
...
* Thu Jul 31 2014 Richard W.M. Jones <rjones@redhat.com> - 2:2014.2.15-4
- Upstream patches which add fstrim support.
いちおう、最後のしめに、コピーした Win7 のパーティションに fstrim をかけました。
本当に fstrim が機能しているか、念のため小さいパーティションで試しましたが、ちゃんと動いているようでした。削除したファイル(ある程度大きいサイズのファイル)の痕跡が消えることを確認しました。

2015-09-08追記
その後、SSD の後半に CentOS を入れて、MBM でマルチブート運用しているのですが、その状態だと ThinkVantage ボタンで D2D リカバリーのメニューを呼び出すことが出来なくなるようです。しかし、MBM で Win7 のシステムパーティションを選択後に F2 連打、そのあと F8 押下で、「システムの回復」を選択すれば D2D リカバリに辿り着けました。ただし、本当にリカバリできて、しかも後半の CentOS パーティションに影響ないのか不明。試行してません。

ZFS の upgrade について

ZFS on Linux を利用し始めた初期 (2012年前半) に作成した zpool のバージョンが、古いままだった(version 23)ので、lz4 圧縮を使うために zpool upgrade を行いました。そうしたところ、なぜか tar ファイル展開で、展開したファイルのパーミッションがおかしくなる(mode 000 になる)現象に遭遇しました。
最初から新しいバージョン (version 5000) で作成した zpool では、正常に tar 展開されるし、何が原因だろうか?と違いを調べたところ、あまり意識していませんでしたが、zpool のバージョンとは別に zfs のバージョンもあり、これが古いまま (version 4) であることがわかりました。
# zfs get version
NAME              PROPERTY  VALUE    SOURCE
tankX             version   4        -
きっとこれだろうと思い、zfs upgrade tankX を実行して、バージョンを 5 に上げました。そうしたところ、正常なファイルパーミッションで tar 展開できるようになりました。以上、備忘録ですが、どなたかの参考になることがあれば幸いです。
なお、ZFS on Linux を使い始めて約2年半、今回のようなデータ保全に関わるトラブルは初めてです。わたしの利用の範囲ではということですけども。

2014年11月19日水曜日

CentOS 5 + UEKr2 で XFS を利用

CentOS 5 にオラクルの UEKr2 カーネルを入れて利用しているマシンで、実験・学習目的に XFS も動かしているのですが、この環境で xfs_db が segfault していて、気持ち悪いと思っていたのですが、よくよく考えてみると、カーネルが 3.0 系(見た目のバージョンは 2.6.39)なのに対して、xfsprogs のバージョンが古い(xfsprogs-2.9.4-1.el5.centos を使ってた)ため、何か不整合が起きているのではないかと考えました。
[root@hoge ~]# dmesg | grep xfs
xfs_db[24513]: segfault at 40 ip 0000003525408dd0 sp 00007fff34d904b8 error 4 in libpthread-2.5.so[3525400000+16000]
xfs_db[28592]: segfault at 40 ip 0000003525408dd0 sp 00007fff73492348 error 4 in libpthread-2.5.so[3525400000+16000]
xfs_db[24414]: segfault at 40 ip 0000003525408dd0 sp 00007fffdcd64d58 error 4 in libpthread-2.5.so[3525400000+16000]
xfs_db[28242]: segfault at 40 ip 0000003525408dd0 sp 00007fff890c31d8 error 4 in libpthread-2.5.so[3525400000+16000]
まず、xfs_db なんぞ自分で明示的に動かした記憶がなく、調べたところ system-config-lvm を動かすと、裏で実行されるらしく、再現性を確認しました。
そして、コミュニティ最新版 xfsprogs 3.2.1 に置き換えたところ、segfault が出なくなったことを確認しました。

以下、備忘録、xfsprogs 3.2.1 のビルド手順です。どなたかのご参考まで。

1. xfsprogs-2.9.4-1.el5.centos.src.rpm をダウンロードして展開。この中の SPEC ファイルを利用する。
# rpm -ivh xfsprogs-2.9.4-1.el5.centos.src.rpm
...
# cd /usr/src/redhat/SPEC
# cp -p xfsprogs.spec xfsprogs.spec.org
2. xfsprogs-3.2.1.tar.gz をダウンロードして、/usr/src/redhat/SOURCES へコピー
# cp xfsprogs-3.2.1.tar.gz /usr/src/redhat/SOURCES
3. xfsprogs.spec を手直しする。これが少々時間を要しました。差分です。
--- xfsprogs.spec.org   2007-10-20 23:17:33.000000000 +0900
+++ xfsprogs.spec       2014-11-18 07:43:06.000000000 +0900
@@ -1,11 +1,11 @@
 Summary: Utilities for managing the XFS filesystem
 Name: xfsprogs
-Version: 2.9.4
-Release: 1%{?dist}
+Version: 3.2.1
+Release: 1.el5.staka
 License: GPL
 Group: System Environment/Base
 URL: http://oss.sgi.com/projects/xfs/
-Source0: ftp://oss.sgi.com/projects/xfs/download/cmd_tars/%{name}_%{version}-1.tar.gz
+Source0: ftp://oss.sgi.com/projects/xfs/download/cmd_tars/%{name}-%{version}.tar.gz
 Source1: xfsprogs-wrapper.h
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: autoconf, libtool, gettext
@@ -13,7 +13,7 @@
 BuildRequires: /usr/include/uuid/uuid.h
 Provides: xfs-cmds
 Obsoletes: xfs-cmds <= %{version}
-Conflicts: xfsdump < 2.0.0
+Conflicts: xfsdump < 3.0.0
 
 %description
 A set of commands to use the XFS filesystem, including mkfs.xfs.
@@ -69,10 +69,14 @@
 rm -f $RPM_BUILD_ROOT/{%{_lib}/*.{la,a,so},%{_libdir}/*.la}
 # fix up symlink to be correct
 rm -f $RPM_BUILD_ROOT/%{_libdir}/libhandle.so
+mkdir -p $RPM_BUILD_ROOT/%{_libdir}
 ln -s ../../%{_lib}/libhandle.so.1 $RPM_BUILD_ROOT/%{_libdir}/libhandle.so
 # remove non-versioned docs location
 rm -rf $RPM_BUILD_ROOT/%{_datadir}/doc/xfsprogs/
 
+mkdir -p $RPM_BUILD_ROOT/usr/sbin
+(cd $RPM_BUILD_ROOT/sbin ; mv xfs_{admin,bmap,copy,db,estimate,freeze,fsr,growfs,info,io,logprint,mdrestore,metadump,mkfile,ncheck,quota,rtcp} ../usr/sbin)
+
 # ugly hack to allow parallel install of 32-bit and 64-bit -devel packages:
 mv -f $RPM_BUILD_ROOT%{_includedir}/xfs/platform_defs.h \
       $RPM_BUILD_ROOT%{_includedir}/xfs/platform_defs-%{_arch}.h
@@ -89,11 +93,11 @@
 
 %files -f %{name}.lang
 %defattr(-,root,root)
-%doc doc/CHANGES doc/COPYING doc/CREDITS doc/PORTING README
+%doc doc/CHANGES.gz doc/COPYING doc/CREDITS README
 /sbin/fsck.xfs
 /sbin/mkfs.xfs
 /sbin/xfs_repair
-/%{_lib}/*.so.*
+%attr(0644,root,root)   /%{_lib}/*.so.*
 %{_mandir}/man8/*
 %{_mandir}/man5/*
 %{_sbindir}/*
@@ -101,12 +105,15 @@
 %files devel
 %defattr(-,root,root)
 %{_mandir}/man3/*
-%{_includedir}/disk
+#%{_includedir}/disk
 %{_includedir}/xfs
-%{_libdir}/*.a
+#%{_libdir}/*.a
 %{_libdir}/*.so
 
 %changelog
+* Sat Nov 15 2014 s-taka  3.2.1-1
+- upgraded to upstream version 3.2.1
+
 * Sat Oct 20 2007 Johnny Hughes  2.9.4-1
 - upgraded to upstream version 2.9.4-1
 
4. RPM パッケージをビルド。
# rpmbuild -ba xfsprogs.spec
...
# ls -1 /usr/src/redhat/RPMS/x86_64/xfsprogs-*
/usr/src/redhat/RPMS/x86_64/xfsprogs-3.2.1-1.el5.staka.x86_64.rpm
/usr/src/redhat/RPMS/x86_64/xfsprogs-debuginfo-3.2.1-1.el5.staka.x86_64.rpm
/usr/src/redhat/RPMS/x86_64/xfsprogs-devel-3.2.1-1.el5.staka.x86_64.rpm
# ls -1 /usr/src/redhat/SRPMS/xfsprogs-*
/usr/src/redhat/SRPMS/xfsprogs-3.2.1-1.el5.staka.src.rpm
5. 出来上がった RPM パッケージをインストール。
# cd /usr/src/redhat/RPMS/x86_64
# rpm -Uvh xfsprogs-3.2.1-1.el5.staka.x86_64.rpm xfsprogs-devel-3.2.1-1.el5.staka.x86_64.rpm

xfsdump については、Fedora 21 のパッケージ(xfsdump-3.1.4-2.fc21.src.rpm)を利用して、CentOS 5 向けに RPM 再ビルドしました。SPEC ファイルの差分は次の通りです。
--- xfsdump.spec.org    2014-08-19 13:24:24.000000000 +0900
+++ xfsdump.spec        2014-11-15 22:11:10.000000000 +0900
@@ -1,7 +1,7 @@
 Summary: Administrative utilities for the XFS filesystem
 Name: xfsdump
 Version: 3.1.4
-Release: 2%{?dist}
+Release: 2.el5.staka
 # Licensing based on generic "GNU GENERAL PUBLIC LICENSE"
 # in source, with no mention of version.
 License: GPL+
@@ -10,7 +10,7 @@
 Source0: ftp://oss.sgi.com/projects/xfs/cmd_tars/%{name}-%{version}.tar.gz
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: libtool, gettext, gawk
-BuildRequires: xfsprogs-devel, libuuid-devel, libattr-devel ncurses-devel
+BuildRequires: xfsprogs-devel, libattr-devel, ncurses-devel
 Requires: xfsprogs >= 2.6.30, attr >= 2.0.0
 
 %description
@@ -65,6 +65,9 @@
 %{_sharedstatedir}/xfsdump/inventory
 
 %changelog
+* Sat Nov 15 2014 s-taka  - 3.1.4-2.el5.staka
+- Rebuilt for EL5
+
 * Mon Aug 18 2014 Fedora Release Engineering  - 3.1.4-2
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
 

■関連記事
CentOS 5 + UEK で ZFS on Linux を利用
CentOS 5 + UEKr2 で Btrfs raid1
人気ブログランキングへ にほんブログ村 IT技術ブログへ