Linuxサーバーを移行する方法パート3-最終ステップ
序章
データと運用要件をあるサーバーから別のサーバーに移動しなければならないシナリオはたくさんあります。 ソリューションを新しいデータセンターに実装するか、より大きなマシンにアップグレードするか、新しいハードウェアまたは新しいVPSプロバイダーに移行する必要がある場合があります。
理由が何であれ、あるシステムから別のシステムに移行する際には、さまざまな考慮事項を考慮する必要があります。 Chef、Puppet、Ansibleなどの構成管理ソリューションを使用していない場合、機能的に同等の構成を取得するのは難しい場合があります。 データを転送するだけでなく、新しいマシンでも同じように動作するようにサービスを構成する必要があります。
前回の記事では、 rsyncを使用してデータを転送し、データベースを移行する方法について説明しました。 この記事では、ユーザー、グループ、メール、crontab、およびその他の設定を移行することにより、移行を継続します。
ユーザーとグループの移行
あなたの主な関心事はあなたのサービスとプログラムかもしれませんが、私たちはユーザーとグループにも注意を払う必要があります。
動作するために特定のユーザーを必要とするほとんどのサービスは、インストール時にこれらのユーザーとグループを作成します。 ただし、これにより、手動または他の方法で作成されたユーザーとグループが残ります。
幸いなことに、ユーザーとグループのすべての情報は、いくつかのファイルに含まれています。 確認する必要のある主なファイルは次のとおりです。
- / etc / passwd :このファイルは、ユーザーと基本属性を定義します。 その名前にもかかわらず、このファイルにはパスワード情報が含まれていません。 代わりに、ユーザー名、ユーザーとプライマリグループ番号、ホームディレクトリ、およびデフォルトのシェルに焦点を当てています。
- / etc / shadow :このファイルには、各ユーザーのパスワードに関する実際の情報が含まれています。
passwd
ファイルで定義されている各ユーザーの行と、パスワードのハッシュおよびパスワードポリシーに関する情報が含まれている必要があります。 - / etc / group :このファイルは、システムで使用可能な各グループを定義します。 基本的に、これには、グループ名と関連するグループ番号、およびこれを補足グループとして使用するユーザー名が含まれます。
- / etc / gshadow :このファイルには、システム上の各グループの行が含まれています。 基本的に、グループ、グループ以外のメンバーがグループにアクセスするために使用できるパスワード、管理者と非管理者のリストが一覧表示されます。
これらのファイルをソースシステムから新しいシステムに直接コピーすることは良い考えのように思えるかもしれませんが、これは複雑さを引き起こす可能性があるため、お勧めしません。
発生する可能性のある主な問題の1つは、グループID番号とユーザーID番号の競合です。 独自のユーザーとグループを作成するソフトウェアがシステム間で異なる順序でインストールされている場合、ユーザー番号とグループ番号が異なる可能性があり、競合が発生する可能性があります。
代わりに、これらのファイルの大部分をそのままにして、必要な値のみを調整することをお勧めします。 これはさまざまな方法で実行できます。
移行ファイルの作成
新しいシステムにユーザーを追加するために使用する方法に関係なく、ユーザー、グループなどのリストを生成する必要があります。 転送して追加する必要があります。
しばらくの間インターネット上を漂っていた方法を以下に示します。
変更が必要な上記の各ファイルに関連付けられたファイルを作成します。 それらには、適切な転送情報がすべて含まれます。
まず、通常のユーザーとシステムユーザーの間のID制限がマシン上にあるかどうかを把握します。 これは通常、システムに応じて500または1000のいずれかになります。 通常のユーザーがいる場合、簡単に見つける方法は、/etc/passwd
ファイルを調べて、通常のユーザーアカウントがどこから始まるかを確認することです。
less /etc/passwd
その後、この番号(3列目の最初の通常のユーザーID番号)を使用して、コマンドの制限を設定できます。 この制限を下回るユーザーまたはグループはエクスポートされません。 また、ユーザーIDが「65534」の「nobody」アカウントも除外します。
これを入力すると、/etc/passwd
ファイルの同期ファイルを作成できます。 /etc/passwd
ファイルで検出した最小の通常のユーザー番号でlimit#を置き換えます。
awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534)' /etc/passwd > /root/passwd.sync
その後、同様のことを行ってグループ同期ファイルを作成できます。
awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534)' /etc/group > /root/group.sync
/etc/passwd
ファイルから関心のある範囲内のユーザー名を使用して、シャドウファイルから必要な値を取得できます。
awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=35534) {print $1}' /etc/passwd | tee - | egrep -f - /etc/shadow > /root/shadow.sync
/etc/gshadow
ファイルについても、同様の操作を行います。
awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534) {print $1}' /etc/group | tee - | egrep -f - /etc/gshadow > /root/gshadow.sync
実行するコマンドがわかったら、通常のSSHコマンドの後にスクリプトに追加し、次のようにrsyncをオフにします。
ssh 111.222.333.444 "awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534)' /etc/passwd > /root/passwd.sync" ssh 111.222.333.444 "awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534)' /etc/group > /root/group.sync" ssh 111.222.333.444 "awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=35534) {print $1}' /etc/passwd | tee - | egrep -f - /etc/shadow > /root/shadow.sync" ssh 111.222.333.444 "awk -v LIMIT=limit# -F: '($3>=LIMIT) && ($3!=65534) {print $1}' /etc/group | tee - | egrep -f - /etc/gshadow > /root/gshadow.sync" rsync 111.222.333.444:/root/passwd.sync /root/ rsync 111.222.333.444:/root/group.sync /root/ rsync 111.222.333.444:/root/shadow.sync /root/ rsync 111.222.333.444:/root/gshadow.sync /root/
ユーザーを手動で追加する
スクリプトファイルにコメントを追加して手動で行う場合は、vipw
およびvigr
コマンドをお勧めします。これらのコマンドは、編集中にファイルをロックし、破損を防ぎます。 次のように入力して、ファイルを手動で編集できます。
vipw
-s
フラグを渡すと、関連するシャドウファイルが編集され、-g
フラグを渡すと、グループファイルが編集されます。
次のように、ファイルの行を新しいシステムの関連ファイルの最後に直接追加したくなるかもしれません。
cat /root/passwd.sync >> /etc/passwd
このルートを選択する場合、IDが新しいシステムの別のユーザーによってすでに取得されていると、IDの競合が発生する可能性があることに注意する必要があります。
ソースコンピューターからリストを取得した後、システムで使用可能なツールを使用して各ユーザー名を追加することもできます。 useradd
コマンドを使用すると、ソースコンピューターに一致するユーザーアカウントをすばやく作成できます。
useradd -s /path/to/shell -m -d /home/username -p password -G supplementary_groups
*.sync
ファイルを参照用に使用し、この方法で追加できます。
ユーザーを自動的に追加
代わりに、ファイル内でユーザーとグループの追加をスクリプト化する場合は、それも簡単に実行できます。 ただし、スクリプトはユーザー/グループを複数回作成しようとするため、最初の実行が成功した後でこれらをコメントアウトする必要があります。
ファイルからユーザーを一括追加できるnewusers
というコマンドがあります。 これは私たちにとっては完璧ですが、最初にファイルを変更してユーザーIDとグループIDを削除したいと思います。 このコマンドは、新しいシステムで次に使用可能なユーザーとグループを生成します。
次のように、passwdファイルからグループIDとユーザーIDを取り除くことができます。
awk 'BEGIN { OFS=FS=":"; } {$3=""; $4=""; } { print; }' /root/passwd.sync > /root/passwd.sync.mod
この新しい変更されたファイルは、次のように適用できます。
newusers /root/passwd.sync.mod
これにより、ファイルのすべてのユーザーがローカルの/etc/passwd
ファイルに追加されます。 また、関連付けられたユーザーグループが自動的に作成されます。 ユーザーに関連付けられていないグループを/etc/group
ファイルに手動で追加する必要があります。 移行ファイルを使用して、適切なファイルを編集します。
/etc/shadow
ファイルの場合、shadow.sync
ファイルの2番目の列を、新しいシステムの関連するアカウントの2番目の列にコピーできます。 これにより、アカウントのパスワードが新しいシステムに転送されます。
これらの変更のスクリプトを作成することもできますが、これは手動で行う方が簡単な場合の1つです。 ユーザーとグループを構成した後は、ユーザーまたはグループの行をコメントアウトすることを忘れないでください。
メールとジョブを新しいシステムに転送する
ユーザーが古いシステムから転送され、実行中のrsyncコマンドによってユーザーのホームディレクトリにデータが入力されるようになったので、各ユーザーのメールも移行できます。 cronジョブも複製したいと思います。
スプールディレクトリに対して別のrsyncコマンドを実行することから始めることができます。 ソースシステムのスプールディレクトリ内には、通常、いくつかの重要なファイルが表示されます。
ls /var/spool
anacron cron mail plymouth rsyslog
メールディレクトリをターゲットサーバーに転送したいので、移行スクリプトに次のようなrsync行を追加できます。
rsync -avz --progress 111.222.333.444:/var/spool/mail/* /var/spool/mail/
/var/spool
ディレクトリ内で注目したいもう1つのディレクトリは、cron
ディレクトリです。 このディレクトリは、スケジューリングに使用されるcronとatジョブを保持します。 内のcrontabs
ディレクトリには、個々のユーザーのcrontabが含まれており、ジョブのスケジュールに使用されます。
ユーザーが割り当てた自動化されたタスクを保持したいと考えています。 これは、さらに別のrsyncコマンドで実行できます。
rsync -avz --progress 111.222.333.444:/var/spool/cron/crontabs/* /var/spool/cron/crontabs/*
これにより、個々のユーザーのcronタブが新しいシステムに追加されます。 ただし、移動する必要のあるcrontabは他にもあります。 /etc
ディレクトリ内には、crontabと、cron情報を含む他の多くのディレクトリがあります。
ls /etc | grep cron
anacrontab cron.d cron.daily cron.hourly cron.monthly crontab cron.weekly
crontab
ファイルには、システム全体のcronの詳細が含まれています。 他のアイテムは、他のcron情報を含むディレクトリです。 それらを調べて、必要な情報が含まれているかどうかを判断します。
もう一度、rsyncを使用して、関連するcron情報を新しいシステムに転送します。
rsync -avz --progress 111.222.333.444:/etc/crontab /etc/crontab
新しいシステムでcron情報を取得したら、それが機能することを確認する必要があります。 これは手動の手順なので、最後にこれを行う必要があります。
これを正しく行う唯一の方法は、個々のユーザーとしてログインし、各ユーザーのcrontabでコマンドを手動で実行することです。 これにより、これらのコマンドが自動的に実行されたときにサイレントに失敗するのを防ぐアクセス許可の問題やファイルパスの欠落がないことが保証されます。
サービスを再起動します
移行スクリプトの最後に、適切なサービスがすべて再起動、再ロード、フラッシュなどされていることを確認する必要があります。 使用しているオペレーティングシステムに適したメカニズムを使用してこれを行う必要があります。
たとえば、UbuntuでLAMPスタックを移行する場合は、次のように入力して重要なプロセスを再開できます。
service mysql restart service apache2 restart service php5-fpm restart
これらをそのまま移行スクリプトの最後に追加でき、期待どおりに動作するはずです。
テストサイトとサービス
移行スクリプトを終了し、すべての同期と変更を加えて実行し、必要なすべての手動手順を実行したら、新しいシステムをテストする必要があります。
確認したい領域がかなりあります。 問題が発生するかどうかを確認するためにテストしているときに、関連するログファイルに注意してください。
まず、転送後にディレクトリサイズをテストする必要があります。 たとえば、同期した/data
パーティションがある場合は、ソースコンピューターとターゲットコンピューターの両方でそのディレクトリに移動し、du
コマンドを実行します。
cd /data du -hs
471M .
サイズがほぼ同じであることを確認します。 元のシステムと新しいシステムの間にはわずかな違いがあるかもしれませんが、それらは近いはずです。 大きな格差がある場合は、その理由を調査する必要があります。
次に、各マシンで実行されているプロセスを確認できます。 これを行うには、ps
出力で重要な情報を探します。
ps auxw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 27024 2844 ? Ss Feb26 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S Feb26 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Feb26 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S Feb26 0:00 [kworker/0:0] root 5 0.0 0.0 0 0 ? S< Feb26 0:00 [kworker/0:0H] . . .
また、ソースマシンで最初に行ったチェックの一部を複製して、新しいマシンで環境をエミュレートしたかどうかを確認することもできます。
netstat -nlp
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1564/dnsmasq tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2886/cupsd tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 752/smbd tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 752/ . . .
繰り返しますが、別のオプションは次のとおりです。
lsof -nPi
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME smbd 752 root 26u IPv6 9705 0t0 TCP *:445 (LISTEN) smbd 752 root 27u IPv6 9706 0t0 TCP *:139 (LISTEN) smbd 752 root 28u IPv4 9707 0t0 TCP *:445 (LISTEN) smbd 752 root 29u IPv4 9708 0t0 TCP *:139 (LISTEN) . . .
重要なパッケージのバージョンと一致するかどうかを確認するには、最初の記事で行ったように、重要なサービスのパッケージバージョンを確認する必要があります。 これを行う方法は、システムによって異なります。
WebサーバーまたはLAMPスタックを転送した場合は、新しいサーバーでサイトを確実にテストする必要があります。
古いサーバーではなく新しいサーバーを指すようにhostsファイル(ローカルコンピューター上)を変更することで、これを簡単に行うことができます。 次に、サーバーが要求を正しく受け入れ、すべてのコンポーネントが正しい方法で一緒に動作しているかどうかをテストできます。
ローカルhostsファイルを変更する方法は、使用しているオペレーティングシステムによって異なります。 OS XやLinuxなどの*nixベースのデザインのオペレーティングシステムを使用している場合は、次のようにローカルシステムのhostsファイルを変更できます。
sudo nano /etc/hosts
内部では、ドメイン名を新しいサーバーのIPアドレスにポイントするエントリを追加する必要があります。これにより、コンピューターが要求をインターセプトし、テストのために新しい場所にルーティングします。
追加できる行は次のようになります。
111.222.333.444 www.domain.com 111.222.333.444 domain.com
サイト構成全体で使用されるサブドメインも追加します( images.domain.com 、 files.domain.com など)。 ホスト行を追加したら、ファイルを保存して閉じます。
OS Xを使用している場合、新しいコンテンツを表示するには、コンピューターのhostsファイルをフラッシュする必要があります。
sudo lookupd -flushcache
Linuxでは、これは自動的に機能するはずです。
Windowsでは、管理者としてC:\Windows\Wystem32\Drivers\etc\hosts
ファイルを編集する必要があります。 上記の*nixバージョンで行ったのと同じ方法で行を追加します。
ローカルワークステーションでhostsファイルを編集した後、ドメイン名に移動してテストサーバーにアクセスできるようになります。 可能な限りすべてをテストし、すべてのコンポーネントが相互に通信し、正しい方法で応答できることを確認します。
テストが完了したら、hostsファイルを再度開いて、追加した行を削除することを忘れないでください。
ファイアウォールルールの移行
ファイアウォールルールを新しいサーバーに移行する必要があることに注意してください。 これを行う方法については、次のチュートリアルに従ってください:Iptablesファイアウォールルールを新しいサーバーに移行する方法。
ルールを新しいサーバーにロードする前に、IPアドレスや範囲の変更など、更新が必要なものがないかどうかを確認する必要があることに注意してください。
DNS設定を変更する
新しいサーバーを徹底的にテストしたら、移行スクリプトを調べて、サーバーの一部が行った変更を元に戻さないことを確認します。
その後、スクリプトをもう一度実行して、ソースサーバーから最新のデータを取得します。
ターゲットサーバーに最新のデータがすべて揃ったら、ドメインのDNSサーバーを変更して、新しいサーバーを指すようにすることができます。 古いサーバーのIPへのすべての参照が、新しいサーバーの情報に置き換えられていることを確認してください。
DigitalOceanのDNSサーバーを使用している場合は、ドメイン名の構成方法についてここで読むことができます。
DNSサーバーの更新には時間がかかります。 すべてのDNSサーバーが新しい変更を取得した後、移行スクリプトを最後に実行して、元のサーバーにまだ送信されていた漂遊要求が転送されることを確認する必要がある場合があります。
MySQLコマンドを注意深く調べて、古いサーバーまたは新しいサーバーに書き込まれたデータを破棄したり上書きしたりしていないことを確認します。
結論
すべてがうまくいけば、新しいサーバーが稼働し、リクエストを受け入れ、以前のサーバーにあったすべてのデータを処理するはずです。 引き続き状況を注意深く監視し、発生する可能性のある異常に注意する必要があります。
適切に実行された場合、移行は簡単ではなく、多くの問題が発生する可能性があります。 ライブサーバーの移行が成功する可能性が最も高いのは、開始する前に、システムをできる限り理解することです。 システムはそれぞれ異なり、毎回、新しい問題を回避する必要があります。 発生する可能性のある問題のトラブルシューティングを行う時間がない場合は、移行を試みないでください。