如何迁移Linux服务器的第一部分 - 系统准备

有很多原因,你可能需要您的服务器在你的项目中的某些点迁移到一个新的环境。迁移是困难的,而且每一个都是独一无二的。在这个系列中,我们将讨论如何去建立一个成功的迁移。本文将介绍如何来准备你的系统,使迁移顺利进行。

介绍


在许多情况下,您可能必须将数据和操作需求从一个服务器移动到另一个服务器。 您可能需要在新的数据中心中实施解决方案,升级到更大的计算机,或转换到新的硬件或新的VPS提供程序。

无论你的原因,当从一个系统迁移到另一个系统时,你应该做许多不同的考虑。 如果您不使用配置管理解决方案(如Chef,Puppet或Ansible)运行,获取功能等效的配置可能会很困难。 您不仅需要传输数据,还需要配置服务以在新计算机上以相同的方式运行。

在本指南中,我们将讨论如何准备用于迁移的源系统和目标系统。 这将包括让您的两台计算机与SSH密钥进行通信,以及对需要传输哪些组件进行深入调查。 我们将在在实际的移植工作的下一篇文章

进行备份


执行任何潜在的破坏性步骤时采取的第一步是创建新的备份。 只是因为不应该有一个问题并不意味着意想不到的事情不会发生。 您不希望在替换启动并运行之前,命令在当前生产机器上中断某些操作的情况。

备份服务器有多种不同的方法。 您的选择将取决于什么选项对您的方案有意义,以及您最舒适的。

如果您可以访问物理硬件和备份空间(磁盘驱动器,USB等),则可以使用许多可用的映像备份解决方案中的任何一个克隆磁盘。 与VPS机器打交道时的功能相当于是采取快照或图像从内部控制面板界面

其他选项通常会保留数据和可能的一些有关您的服务的信息。 这一切取决于你希望实现的备份机制。 我们的社区网页上有许多不同的备份选项文章 选择一个对您的数据和系统有意义的。

完成备份后,即可继续。 对于本指南的其余部分,我们假设您以root身份登录到这两个系统。

收集有关源系统的信息


在开始迁移之前,我们应该采取初始步骤来设置我们的目标系统以匹配源系统。

我们希望在当前服务器和我们计划迁移的服务器之间尽可能匹配。 如果您希望迁移顺利进行,那么您不应该将此作为升级到最新版本或尝试新功能的机会。 做出改变可能导致不稳定和问题。

大多数的基本信息,这将有助于你决定创建新机可以用一个简单的检索该服务器系统uname命令:

uname -r

3.2.0-24-virtual

这是我们当前系统运行的内核版本。 为了使事情顺利进行,尝试在目标系统上匹配它总是一个好主意。

uname -m

i686

这是该系统的体系结构。 i686表明这是一个32位的系统。 如果返回的字串是x86_64 ,这将意味着,这是一个64位的系统。

您还应该尝试匹配源服务​​器的发行版和版本。 如果您不知道在源计算机上安装的分发版本,可以通过键入以下内容找到:

cat /etc/issue

Ubuntu 12.04.2 LTS \n \l

如果可能,应使用这些相同的参数创建新服务器。 在这种情况下,我们将创建一个32位的Ubuntu 12.04系统。 如果可能,我们还会尝试匹配新系统上的内核版本。

在源服务器和目标服务器之间设置SSH密钥访问


我们需要我们的服务器能够进行通信,以便他们可以传输文件。 最简单的方法是使用SSH密钥。 你可以学习如何在Linux服务器上配置SSH密钥在这里。

我们希望我们的目标服务器上创建一个新的密钥,使我们可以添加到我们的源服务器的authorized_keys文件。 这比其他方式更清洁,因为那时新的服务器将不会在其流浪关键authorized_keys文件迁移完成时。

首先,在目标计算机上,键入以下内容,检查您的root用户是否已没有SSH密钥(您应以root身份登录):

ls ~/.ssh

authorized_keys

如果你看到的文件名为id_rsa.pubid_rsa ,那么你已经有钥匙,你就只需要将他们转移。

如果您没有看到这些文件,请通过键入以创建新的密钥对:

ssh-keygen -t rsa

在所有提示中按“Enter”键接受默认值。

现在,通过键入以下内容将密钥传输到源服务器:

cat ~/.ssh/id_rsa.pub | ssh other_server_ip "cat >> ~/.ssh/authorized_keys"

您现在应该能够通过键入以下命令从目标系统自由地SSH访问源服务器:

ssh other_server_ip

如果配置正确,则不应提示您输入密码。

创建需求列表


这实际上是你将要对你的系统和需求进行深入分析的第一部分。

在操作过程中,您的软件需求可能会改变。 有时老服务器有一些服务和软件,需要在一个点,但已被替换。

虽然不必要的服务应该被禁用,如果完全不必要,卸载,这并不总是发生。 您需要了解源服务器上正在使用的服务,然后确定这些服务是否应该存在于新服务器上。

发现服务和运行级别的方式在很大程度上取决于服务器使用的“init”系统的类型。 init系统负责启动和停止服务,无论是在用户的命令或自动。

发现System V服务器上的服务和运行级别


System V是当今在许多服务器上仍然使用的较早的init系统之一。 Ubuntu试图切换到Upstart init系统,并且将来可能会转换到Systemd init系统。

目前,System V风格的init文件和更新的Upstart init文件可以在同一个系统上找到,这意味着你将有更多的地方看。 其他系统也使用系统V. 您可以通过键入以下内容查看您的服务器是否使用System V:

which service

/usr/sbin/service

如果命令返回一个系统路径,如上所述,您的系统上有System V。

您可以通过键入以下内容来了解​​当前正在运行的服务:

service --status-all

 [ ? ]  acpid
 [ ? ]  anacron
 [ + ]  apache2
 [ ? ]  atd
 [ - ]  bootlogd
 [ ? ]  console-setup
 [ ? ]  cron
 [ ? ]  cryptdisks
 . . .

这将列出System-V init系统了解的所有服务。 “+”表示服务已启动,“ - ”表示已停止,“? 意味着System-V不知道服务的状态。

如果System-V不知道服务的状态,可能是由另一个init系统控制的。 在Ubuntu系统上,这通常是Upstart。

除了弄清楚哪些服务当前正在运行之外,另一个好的信息是服务在哪个运行级别是活动的。运行级别指示当服务器处于不同状态时应当使哪些服务可用。 您可能想要匹配新系统上的源服务器的配置。

您可以发现每个服务将使用许多工具处于活动状态的运行级别。 一种方式是通过类似的工具chkconfigsysv-rc-conf

在Ubuntu或Debian系统,你可以安装和使用chkconfig来检查它的System V服务,可在不同的运行级别这样。 大多数基于RHEL的系统应该已经安装了此软件:

apt-get update
apt-get install chkconfig
chkconfig --list

acpid                     0:off  1:off  2:off  3:off  4:off  5:off  6:off
anacron                   0:off  1:off  2:off  3:off  4:off  5:off  6:off
apache2                   0:off  1:off  2:on   3:on   4:on   5:on   6:off
atd                       0:off  1:off  2:off  3:off  4:off  5:off  6:off
bootlogd                  0:off  1:off  2:off  3:off  4:off  5:off  6:off
console-setup             0:off  1:off  2:off  3:off  4:off  5:off  6:off
cron                      0:off  1:off  2:off  3:off  4:off  5:off  6:off
cryptdisks                0:on   1:off  2:off  3:off  4:off  5:off  6:off
cryptdisks-early          0:on   1:off  2:off  3:off  4:off  5:off  6:off
. . .

另一种选择是sysv-rc-conf ,它可以被安装和运行是这样的:

apt-get update
apt-get install sysv-rc-conf
sysv-rc-conf --list

acpid       
anacron     
apache2      0:off  1:off   2:on    3:on    4:on    5:on    6:off
atd         
bootlogd    
console-setu
cron        
cryptdisks   0:on   6:on
cryptdisks-e 0:on   6:on
. . .

如果您想改为手动检查使用的工具,你可以通过检查一个数字,采取的形式目录做/etc/rc*.d/ 星号将替换为运行级别的编号。

例如,要查看运行级别2中的System V激活了哪些服务,可以检查以下文件:

cd /etc/rc2.d
ls -l

total 4
-rw-r--r-- 1 root root 677 Jul 26  2012 README
lrwxrwxrwx 1 root root  18 Dec 28  2012 S20php5-fpm -> ../init.d/php5-fpm
lrwxrwxrwx 1 root root  15 Apr 26  2012 S50rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root  14 Jun 21  2013 S75sudo -> ../init.d/sudo
lrwxrwxrwx 1 root root  17 Dec 28  2012 S91apache2 -> ../init.d/apache2
. . .

这些链接位于配置文件/etc/init.d/ 以“S”开头的每个链接意味着它用于启动服务。 以“K”开头的脚本在该运行级别关闭服务。

在Upstart服务器上发现服务和运行级别


默认情况下,基于Ubuntu和Ubuntu的服务器是唯一实现Upstart init系统的服务器。 这些通常用作主init系统,其中为遗留服务配置系统V.

要查看您的服务器是否具有Upstart init系统,请键入:

which initctl

/sbin/initctl

如果您收到我们上面执行的可执行文件的路径,那么您的服务器具有Upstart功能,您应该调查哪些服务由Upstart控制。

您可以通过键入以下内容查看Upstart启动的服务:

initctl list

mountall-net stop/waiting
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 482
tty4 start/running, process 728
udev start/running, process 354
upstart-udev-bridge start/running, process 350
ureadahead-other stop/waiting
. . .

这将告诉您所有Upstart托管服务的当前状态。 您可以知道当前正在运行哪些服务,并且可以查看是否存在提供相同功能的服务,其中已经接管了不再使用的旧服务。

同样,您应该熟悉应该在每个运行级别可用的服务。

你可以用这个做initctl通过键入命令:

initctl show-config

mountall-net
  start on net-device-up
passwd
  start on filesystem
rc
  emits deconfiguring-networking
  emits unmounted-remote-filesystems
  start on runlevel [0123456]
  stop on runlevel [!$RUNLEVEL]
rsyslog
  start on filesystem
  stop on runlevel [06]
  . . .

这会为每个服务分配大量的配置信息。 要查找的部分是运行级规范。

如果要手动收集这些信息,你可以看看位于中的文件/etc/init (注意“.D”中的“初始化”后,这里省略)目录。

在里面,你会发现一些配置文件。 在这些文件中,有如下所示的运行级规范:

start on runlevel [2345]
stop on runlevel [!2345]

你应该有一个很好的不同的方法来发现Upstart服务和运行级别。

在Systemd服务器上发现服务和运行级别


发行版越来越多地采用较新的init风格是systemd init系统。

Systemd与其他类型的init系统相当不同,但是功能非常强大。 您可以通过键入以下内容找到有关运行服务的信息:

systemctl list-units -t service

UNIT                                           LOAD   ACTIVE SUB     DESCRIPTION
atd.service                                    loaded active running ATD daemon
avahi-daemon.service                           loaded active running Avahi mDNS/DNS-SD Stack
colord.service                                 loaded active running Manage, Install and Generate Color Profiles
cups.service                                   loaded active running CUPS Printing Service
dbus.service                                   loaded active running D-Bus System Message Bus
dcron.service                                  loaded active running Periodic Command Scheduler
dkms.service                                   loaded active exited  Dynamic Kernel Modules System
. . .

Systemd不完全复制其他init系统的运行级概念。 相反,它实现了“目标”的概念。 虽然具有传统init系统的系统一次只能处于一个运行级别,但使用systemd的服务器可以同时到达多个目标。

因为这个,找出什么服务是活动的,当有点更困难时。

您可以通过键入以下内容查看当前有效的定位:

systemctl list-units -t target

UNIT                LOAD   ACTIVE SUB    DESCRIPTION
basic.target        loaded active active Basic System
cryptsetup.target   loaded active active Encrypted Volumes
getty.target        loaded active active Login Prompts
graphical.target    loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target     loaded active active Local File Systems
. . .

您可以通过键入以下内容列出所有可用的目标:

systemctl list-unit-files -t target

UNIT FILE                 STATE   
basic.target              static  
bluetooth.target          static  
cryptsetup.target         static  
ctrl-alt-del.target       disabled
default.target            disabled
emergency.target          static  
final.target              static  
getty.target              static  
graphical.target          disabled
halt.target               disabled
. . .

从这里,我们可以找出哪些服务与每个目标相关联。 目标可以具有服务或其他目标作为依赖关系,因此我们可以通过键入以下内容来查看每个目标实现的策略:

systemctl list-dependencies target_name.target

例如,您可以键入如下内容:

systemctl list-dependencies multi-user.target

multi-user.target
├─atd.service
├─avahi-daemon.service
├─cups.path
├─dbus.service
├─dcron.service
├─dkms.service
├─gpm.service
. . .

这将列出该目标的依赖关系树,为您提供达到该目标时启动的服务和其他目标的列表。

通过其他方法双重检查服务


虽然大多数服务将通过init系统进行配置,但是可能存在一些进程或服务将通过裂缝滑动并被独立控制的区域。

我们可以通过查看这些服务的副作用来尝试找到这些其他服务和过程。 在大多数情况下,服务以某种方式与彼此或外部实体进行通信。 只有特定数量的方式,服务可以通信,并检查这些接口是一个很好的方法来发现其他服务。

一个工具,我们可以用它来发现正在使用的进程通信网络端口和Unix套接字是netstat 我们可以发出这样的命令来概述我们的一些服务:

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.0.1:3306          0.0.0.0:*               LISTEN      762/mysqld      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      832/apache2     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      918/sshd        
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      799/php-fpm.conf)
tcp6       0      0 :::22                   :::*                    LISTEN      918/sshd        
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     1526     1/init              @/com/ubuntu/upstart
unix  2      [ ACC ]     SEQPACKET  LISTENING     1598     354/udevd           /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     6982     480/dbus-daemon     /var/run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     8378     762/mysqld          /var/run/mysqld/mysqld.sock
unix  2      [ ACC ]     STREAM     LISTENING     1987     746/acpid           /var/run/acpid.socket

第一部分中的端口号与最右侧的程序相关联。 类似地,底部部分关注正在被程序使用的Unix套接字。

如果你在这里看到的服务,你没有关于通过init系统的信息,你必须找出为什么是这样的信息,你需要收集关于该服务。

您可以获取有关服务是通过使可用的端口类似的信息lsof命令:

lsof -nPi

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld    762    mysql   10u  IPv4   8377      0t0  TCP 127.0.0.1:3306 (LISTEN)
php5-fpm  799     root    6u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  800 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  801 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  802 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  803 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
apache2   832     root    3u  IPv4   8210      0t0  TCP *:80 (LISTEN)
sshd      918     root    3r  IPv4   7738      0t0  TCP *:22 (LISTEN)
. . .

你可以从一些伟大的信息ss哪些进程正在使用哪些端口和插槽的命令:

ss -nlpaxtudw

Netid  State      Recv-Q Send-Q   Local Address:Port     Peer Address:Port 
u_str  LISTEN     0      0      @/com/ubuntu/upstart 1526                * 0     users:(("init",1,7))
u_str  ESTAB      0      0      @/com/ubuntu/upstart 1589                * 0     users:(("init",1,10))
u_str  ESTAB      0      0                    * 1694                * 0     users:(("dbus-daemon",480,6))
u_str  ESTAB      0      0                    * 1695                * 0     users:(("dbus-daemon",480,7))
u_str  ESTAB      0      0                    * 1803                * 0

收集软件包版本


在所有的探索之后,你应该有一个好主意,你的源机器上运行什么服务,你应该在目标服务器上实现。

您应该有一个您知道您需要实施的服务的列表。 为了过渡顺利,重要的是尝试匹配版本,有可能。

你显然不能通过安装在源系统上的每一个软件包,并尝试在新系统上复制它,但你应该检查对你的需要很重要的软件组件,并尝试找到版本号。

你可以尝试从软件本身获取版本号,有时通过传递-v--version标志的命令,但通常这是比较容易通过你的包管理器来完成。 如果您使用基于Ubuntu / Debian的系统,则可以通过键入以下内容来查看从软件包管理器安装的软件包版本:

dpkg -l | grep package_name

如果您是在基于RHEL的系统上,则可以使用此命令来检查已安装的版本。

rpm -qa | grep package_name

这将给你一个好主意,你正在寻找安装的程序版本。

保留要安装的重要组件的版本号列表。 我们将尝试在目标系统上获取这些。

下一步


您现在应该了解源服务器上的哪些进程和服务需要传输到新计算机上。 您还应该完成初步步骤,以允许您的两个服务器实例相互通信。

您迁移的基础现在已完成。 您现在应该能够跳进迁移在接下来的文章与你需要做什么是一个好主意。

作者:Justin Ellingwood