こんにちは、Habr! Denis Savenkoによる記事「 CentOSシステムをHDDからXFSファイルシステム上のより小さなSSDに移行する 」のロシア語版を紹介します 。
この記事は、以前に公開された英語の記事のロシア語版であり、視聴者に多少の調整が加えられています。 私はすぐに予約をします-私はLinuxマニアでもプロのシステム管理者でもないので、時々珍しい、または愚かなソリューションを使用できる可能性は十分にあります。 コメントでそれらを指摘していただければ、私は非常に感謝します。それにより、記事をただじっと見るのではなく、このガイドを改善することができます。 事前にありがとうございます。
ある時点で、稼働中のシステム用にSSDドライブを購入することにしたのは私だけではないと思います。 私の場合、それは私の小さなホームサーバー上のCentOS 7で動作するシステムでした。 次に、「そのまま」新しいディスクに転送したかった。 しかし、判明したように、これは次のことを考えるとそれほど簡単ではありません:
- 新しいSSDは、既にインストールされているHDDよりもはるかに小さいものでした(真剣に、SSDはまだディスクドライブに比べてかなり高価です)。
- 同じドライブ上のパーティションは、
xfs
ファイルシステムでフォーマットされています。 CentOSがバージョン7以降、このファイルシステムを「デフォルトで」提供するという事実を考えると、これは驚くことではありません(実際、 Red Hat Enterprise Linux 7 、 Oracle Linux 7などのRHELベースの他のシステムと一緒に)またはScientific Linux 7 )。 - 動作中のシステムは、構成、インストールされているソフトウェア、アクセス権、およびファイルシステムの他の属性など、変更されないままにしておく必要があります。
上記で説明したことが私たちの仕事の深刻な合併症である理由を説明しましょう。
まず、新しいディスクのサイズが前のディスクと同じかそれより大きければ、データパーティションの完全なクローンを適用することが可能です。 これには、 dd 、 ddrescue 、 partclone、さらにはclonezillaなど、 多数 のユーティリティがあります。 あとで行わなければならない唯一のことは、ブートセクションでいくつかの設定ファイルを修正することです。 パーティションにLVMを使用する場合(これはCentOS 7のデフォルトオプションでもあります)、タスクはさらに単純になる可能性があります-新しいディスクが論理ボリュームに追加され、その後pvmove
を使用してpvmove
データが論理ボリューム内の別の物理メディアに転送され、古いディスクはパーティションから削除されますが、新しい物理メディアのサイズが小さい場合、これは不可能です。
次に、 xfs
以外のファイルシステム、たとえばかなり一般的なext4
xfs
した場合、古いディスクパーティションを新しいディスクのサイズに「圧縮」することができます。 次に、上記のアクションのいずれかが実行され、女性になります。 ただし、 xfs
パーティションのサイズを変更することxfs
、その実装のために不可能です-使用するときにのみパーティションを増やすことができます。
最後に重要なことですが、すべてのメタデータが保存された稼働中の構成済みシステムを転送するタスクがなければ、新しいディスクにシステムを最初からインストールする方が簡単で、事前にいくつかの重要なファイルを保存できます。 これは2つの理由で私には不向きでした。1つ目は、数日間連続して行っていたのと同じ行動をすべて繰り返さなければならないという考えで、髪の毛が逆立ちしていたことです。 技術的な機能を適切に理解すれば、稼働中のシステムを別のディスクに移行することは不可能な作業ではないはずです。
それでも、私は少なくとも2つの異なる環境を開発し、上記のすべての制限を考慮に入れて、稼働中のシステムを転送するための詳細な段階的な計画をテストしました。
ステージ1.準備
転送する必要があるもののリストは次のとおりです。
- 実際には、移行される作業システム。 私の場合、それはCentOS 7.4でしたが、状況は
xfs
実行されている他のLinuxシステムと変わらないはずです。 - LinuxディストリビューションのライブCDまたはフラッシュドライブ。 簡単にするために、同じCentOS 7.4 Live CDでビルドします。 私はGnome付きのバージョンを好みますが、これは好みの問題です。 このディストリビューションの選択は、第一に、すでに持っていたという事実、そして第二に、特に
xfsdump
ですぐに提供される、転送する必要がある一連のユーティリティxfsdump
。 ここでは、ライブCDディストリビューションを使用してブートディスクまたはUSBフラッシュドライブを作成する方法については説明しません。 - 古いドライブのデータ量は、新しいディスクのサイズを超えないようにする必要があります(SSDまたはその他の小さなディスク)。 私の場合は、約10 GBしか占有されていなかったため、何を取り除くべきかさえ考えませんでした。
- ホットコーヒー1杯。
ステージ2.移行
コーヒーを飲み込み、準備されたLive CDディストリビューションからシステムの起動から移行するプロセスを開始します。 次に、端末を開き、 su -
コマンドを使用してスーパーユーザーモードに切り替えますsu -
このガイドの残りの部分では、すべてのコマンドがroot
として実行されることを前提としています。
手順1.リモートアクセスを許可する(オプション)
転送先のマシンにリモートアクセスできると便利です。なぜなら、 準備済みのコマンドをPuTTYターミナルに簡単にコピーして貼り付けることができます。 このマニュアルをターゲットマシンのブラウザにダウンロードした場合は、次のステップに進んでください。ここで説明されているものはすべて必要ありません。
リモートアクセスを許可するには、 root
パスワードを設定し、SSHデーモンを実行する必要があります。
su passwd systemctl start sshd
これで、SSHクライアント(たとえばPuTTY )を使用してターゲットマシンに接続できます。
手順2.ディスクをパーティション分割する
これにはお気に入りのユーティリティを使用できます。 たとえば、Gnomeにはディスク管理ユーティリティがプリインストールされています。 彼らはまた、インターネットでgparted
を称賛しgparted
たが、たとえば、 gparted
単にNVMe SSDを認識しなかったため、意図的にfdisk
使用しました。
ディスクは、前のディスクのイメージと肖像に分割する必要があります。 私はパーティションマニアではないので、私のパーティションスキームは標準でした:
-
/boot
boot-標準の1GBパーティション。 - 4Gスワップパーティション。
-
/
-ルートパーティション、「main」という名前のLVMボリュームグループ、残りのディスク領域を占有します。
それでは、新しいディスクの分割を始めましょう。
lsblk # , nvme0n1 fdisk /dev/nvme0n1 n # ( /boot) p # primary partition # (1- ) # ( ) +1G # /boot # n # ( LVM volume group) p # primary partition # (2- ) # ( ) # (100% ) # a # "bootable" 1 # 10 p # , w #
/boot
パーティションは標準のLinuxパーティションである必要があるため、すぐにファイルシステムを作成します。
mkfs.xfs /dev/nvme0n1p1 -f
次に、ディスク上の2番目のパーティションのLVM構造を作成する必要があります。 新しいLVMグループにnewmain
(後で名前を変更します):
pvcreate /dev/nvme0n1p2 # LVM- vgcreate newmain /dev/nvme0n1p2 # LVM- LVM- lvcreate -L 4G -n swap newmain # 4 swap lvcreate -l 100%FREE -n root newmain #
これで、新しい論理パーティションにファイルシステムを作成する準備ができました。
mkfs.xfs /dev/newmain/root # mkswap -L swap /dev/newmain/swap # swap swapon /dev/newmain/swap
ステップ3.アクティブフェーズ
開始する前に、両方のLVMグループをアクティブにします(Live CDから作業する場合)。
vgchange -ay main vgchange -ay newmain
マウントポイントのディレクトリを作成し、ディスクの古いパーティションと新しいパーティションをシステムにマウントします。
mkdir -p /mnt/old/boot mkdir -p /mnt/old/root mkdir -p /mnt/new/boot mkdir -p /mnt/new/root mount /dev/sda1 /mnt/old/boot mount /dev/nvme0n1p1 /mnt/new/boot mount /dev/main/root /mnt/old/root mount /dev/newmain/root /mnt/new/root
lsblk
ですべてが正常であることを確認します。
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk ├─sda1 8:1 0 1G 0 part /mnt/old/boot └─sda2 8:2 0 930.5G 0 part ├─main-swap 253:0 0 3.6G 0 lvm [SWAP] └─main-root 253:1 0 926.9G 0 lvm /mnt/old/root nvme0n1 259:0 0 119.2G 0 disk ├─nvme0n1p1 259:3 0 1G 0 part /mnt/new/boot └─nvme0n1p2 259:4 0 118.2G 0 part ├─newmain-swap 253:5 0 4G 0 lvm [SWAP] └─newmain-root 253:6 0 114.2G 0 lvm /mnt/new/root
このようなものが表示された場合は、すべてが正しく行われています。 そして、ここで本当の魔法が始まりますxfsdump
を使用してデータを移行します。 このユーティリティは非常にスマートであり、 xfs
ファイルシステムの内部構造を認識しています。これにより、データが占有しているブロックのみをコピーできます。これにより、最初にデータをより小さなディスクにコピーできるようになり、次に転送プロセスが大幅に高速化されます。 そのため、このユーティリティを使用してデータをダンプし、これらのデータをその場で新しい場所に展開します。
xfsdump -l0 -J - /mnt/old/boot | xfsrestore -J - /mnt/new/boot xfsdump -l0 -J - /mnt/old/root | xfsrestore -J - /mnt/new/root
使用されるフラグに関するいくつかの言葉:
-
-J
は、フィードバックのサイズを縮小します。 -
xfsdump
およびxfsrestore
に、ファイルの代わりに標準のstdout
およびstdin
ストリームをそれぞれ使用するように指示します。
この手順には時間がかかる場合があります(データの量によって異なります)。 したがって、ここでは、事前に準備されたコーヒーカップが必要になります。これは飲む時間です。
すべてがうまくいけば、すべてのメタデータが保存された状態でデータが完全にバックアップされました。 ここで、いくつかの構成ファイルを修正し、Grub2を新しいディスクに再インストールして起動可能にする必要があります。
手順4.新しいディスクを起動可能にする
最初に行うことは、 blkid
を使用して、古いブートセクションと新しいブートセクション( /boot
)のUUIDを見つけることです。
blkid ... /dev/nvme0n1p1: UUID="3055d690-7b2d-4380-a3ed-4c78cd0456ba" TYPE="xfs" ... /dev/sda1: UUID="809fd5ba-3754-4c2f-941a-ca0b6fb5c86e" TYPE="xfs" ...
sda1
が古い\boot
パーティションであり、 nvme0n1p1
が新しいパーティションであるとnvme0n1p1
して、構成ファイルのUUIDを新しいマウントポイントに置き換えます。
sed -i "s/809fd5ba-3754-4c2f-941a-ca0b6fb5c86e/3055d690-7b2d-4380-a3ed-4c78cd0456ba/g" /mnt/new/root/etc/fstab sed -i "s/809fd5ba-3754-4c2f-941a-ca0b6fb5c86e/3055d690-7b2d-4380-a3ed-4c78cd0456ba/g" /mnt/new/boot/grub2/grub.cfg
これらの2つのコマンドは、新しいドライブ用のシステム構成ファイルを準備します。
ここで、LVMグループの名前を変更してディスクをアンマウントします。
umount /mnt/{old,new}/{boot,root} vgrename -v {,old}main vgrename -v {new,}main
あとは、ブートローダーを再インストールするだけです。 これはchroot
を使用して実行する必要があります。
mount /dev/main/root /mnt mkdir -p /mnt/boot mount /dev/nvme0n1p1 /mnt/boot mount -t devtmpfs /dev /mnt/dev mount -t proc /proc /mnt/proc mount -t sysfs /sys /mnt/sys chroot /mnt/ grub2-install /dev/nvme0n1
ステップ5.最後の仕上げ
この段階で、すべてのデータがすでに転送され、新しいディスクが起動可能になっているはずです。 再起動し、ドライブからLive CDを取り出し、BIOSで新しいディスクを選択して起動するだけです。
systemctl reboot -f
何かがうまくいかず、システムが起動しない場合は、Live CDから再び起動し、vgrename -v {,new}main
およびvgrename -v {old,}main
をvgrename -v {old,}main
してLVMグループの名前を変更することにより、いつでも古いドライブに「ロールバック」できます。vgrename -v {old,}main
、そして再起動します。
これでプログラムの必須部分が完了し、作業システムを新しいディスクに正常に転送しました。 古いディスクはコンピューターから削除できます。
古いHDDをメディアストレージとして使用する
私のように、システムの移動後に古いドライブをメディアストレージとして使用したい場合、これも簡単です。
最初に、古いドライブを再パーティションします
fdisk /dev/sda d # 2 d # 1 n # p # primary partition # 1 # # # p # , w #
ディスク上にファイルシステムを直接作成しません。 代わりに、このディスクを追加する新しいLVMグループを作成します。 これにより、将来、不必要なトラブルなしにこのグループに新しいディスクを簡単に追加できるようになります(論理ディスクは同じままです)。
pvcreate /dev/sda1 # LVM- vgcreate media /dev/sda1 # LVM- lvcreate -l 100%FREE -n media1 media # vgchange -ay media # LVM- mkfs.xfs /dev/media/media1 # mkdir -p /var/media # mount /dev/media/media1 /var/media #
システムの再起動後に変更を保存するには、マウントポイントに関するエントリも/etc/fstab
追加する必要があります。
/dev/mapper/media-media1 /var/media xfs defaults 0 0
できた!
これで、 xfs
ベースのシステムを新しい小さなドライブに正常に移行したと言えます。 ボーナスとして、古いディスクをメディアストレージとして使用し始めました。
UPDATE 04/02/2018
システムをSSDに転送しているので、コメントで、動作中のシステムに転送した後、 trim
コマンド(SSDディスクのガベージコレクターで、時間の経過とともにパフォーマンスが低下しないようにする)を定期的に実行することをお勧めします。 これを行うには、次のコマンドを実行します。
systemctl enable fstrim.timer
これにより、 systemd
システムで週に1回、新しいシステムでtrim
が有効になりtrim
。 あなたまたはあなたのシステムがsystemd
使用しない場合、DigitalOceanからのほぼすべての機会のための包括的なガイドがあります。
間違いを見つけたり、特定のアクションを実行するより良い方法を知っている場合は、コメントを残してください。 このマニュアルがお役に立てば幸いです!