Trong nhiều tình huống, bạn sẽ cần chuyển dữ liệu và yêu cầu vận hành từ một máy chủ này sang máy chủ khác. Có thể bạn đang triển khai giải pháp tại một trung tâm dữ liệu mới, nâng cấp lên một máy chủ mạnh hơn, hoặc thay đổi phần cứng hoặc nhà cung cấp VPS.
Chú ý: Ý tưởng chung ở đây là chuyển giao tất cả các phần thông tin liên quan trong khi giữ cho hệ thống đích càng sạch càng tốt. Một số chiến lược di chuyển có thể sao chép nguyên bộ phân vùng gốc, hoặc bắt đầu quá trình sao chép từ gốc của máy nguồn trong khi chỉ loại trừ thủ công một vài tập tin mà bạn biết sẽ gây ra xung đột. Tuy nhiên, việc di chuyển các phần lớn dữ liệu hệ thống lên một hệ điều hành đang hoạt động có thể gây ra những kết quả không lường trước, hoặc làm bừa bộn hệ thống mới với các tập tin không còn phù hợp với yêu cầu vận hành. Hướng dẫn này sẽ di chuyển một cách chọn lọc — bằng cách bao gồm các phần cần thiết, thay vì loại trừ — để tạo ra kết quả tốt hơn.
Bước 1 – Tạo script di chuyển
Hướng dẫn này và bài tiếp theo sẽ tập trung vào việc tạo và bổ sung nội dung cho một script bash di chuyển dữ liệu theo từng bước. Bạn sẽ sử dụng một số công cụ Linux cấp thấp và thay vì chạy chúng một cách tương tác, mục tiêu của bạn là có được một bộ các bước có thể tái hiện được, nhằm ghi lại các phần cấu hình quan trọng của máy chủ.
Khi viết script này, bạn nên chạy nó lặp đi lặp lại theo từng bước. Hầu hết các công cụ được sử dụng trong hướng dẫn này, chẳng hạn như rsync, sẽ chỉ chuyển dữ liệu nếu có sự thay đổi kể từ lần chạy trước, cho phép bạn thực hiện lại các lệnh mà không phải lo lắng về việc lặp lại không cần thiết. Vì bạn đã cấu hình SSH cho phép kết nối từ máy đích tới máy nguồn ban đầu, bạn nên làm việc từ máy đích trong suốt quá trình hướng dẫn này.
Bạn có thể tạo script này trong thư mục home của bạn, sử dụng nano hoặc trình soạn thảo văn bản ưa thích:
nano ~/sync.sh
Trên dòng đầu tiên của file, thêm phần đầu script (shebang). Điều này cho biết trình thông dịch nào sẽ được sử dụng mặc định khi chạy script. Cụ thể, #!/bin/bash
nghĩa là script sẽ chạy với bash shell, là shell mạnh mẽ và được hỗ trợ rộng rãi trên hầu hết các hệ thống.
~/sync.sh #!/bin/bash
Lưu và đóng file. Nếu bạn sử dụng nano
, nhấn Ctrl+X
, sau đó khi được hỏi, nhấn Y
rồi Enter
.
Trên dòng lệnh, hãy làm cho script có thể thực thi bằng lệnh chmod:
chmod 700 ~/sync.sh
Để có cái nhìn sâu hơn về cách thức hoạt động của chmod và quyền hạn của Linux.
Sau khi làm cho script có thể thực thi và thêm phần đầu script, bạn có thể chạy nó bằng cách gọi trực tiếp:
~/sync.sh
Script sẽ không tạo ra bất kỳ đầu ra nào vì hiện tại nó còn trống. Bạn nên kiểm tra script thường xuyên trong suốt hướng dẫn này. Giống như bài hướng dẫn trước trong chuỗi này, có thể bạn cần chạy nó với quyền sudo, tùy thuộc vào các bước bạn thêm vào script.
Bước 2 – Cài đặt các chương trình và dịch vụ cần thiết
Bước đầu tiên bạn sẽ thêm vào script di chuyển của mình là khôi phục các gói phần mềm mà bạn đã đánh dấu để di chuyển ở bài hướng dẫn trước.
Thêm các kho phần mềm bổ sung
Trước khi thực hiện điều đó, bạn cần kết nối lại với máy chủ nguồn ban đầu trong một terminal riêng biệt, để kiểm tra xem bạn đã cài đặt phần mềm từ bất kỳ kho phần mềm bên thứ ba nào chưa. Nếu có, bạn sẽ không thể cài đặt lại những gói đó trên môi trường mới nếu chưa cấu hình các nguồn gói bổ sung.
Trong môi trường Ubuntu và Debian, bạn có thể kiểm tra xem có kho thay thế nào được liệt kê trên hệ thống nguồn của bạn bằng cách kiểm tra một vài vị trí:
cat /etc/apt/sources.list
Output … ## Uncomment the following two lines to add software from Canonical's ## 'partner' repository. ## This software is not part of Ubuntu, but is offered by Canonical and the ## respective vendors as a service to Ubuntu users. # deb http://archive.canonical.com/ubuntu impish partner # deb-src http://archive.canonical.com/ubuntu impish partner deb http://security.ubuntu.com/ubuntu impish-security main restricted # deb-src http://security.ubuntu.com/ubuntu impish-security main restricted deb http://security.ubuntu.com/ubuntu impish-security universe # deb-src http://security.ubuntu.com/ubuntu impish-security universe deb http://security.ubuntu.com/ubuntu impish-security multiverse # deb-src http://security.ubuntu.com/ubuntu impish-security multiverse
Đây là danh sách nguồn gói chính — vì nó là một file đơn lẻ, bạn có thể dùng cat để xuất nội dung của nó. Nếu dòng cuối cùng của file chứa địa chỉ ubuntu.com, thì có khả năng bạn chưa thêm bất kỳ kho phần mềm bên thứ ba nào vào file này. Các kho bổ sung cũng có thể được liệt kê trong thư mục sources.list.d
:
ls /etc/apt/sources.list.d
Output droplet-agent.list elastic-7.x.list nodesource.list
Nếu thư mục này không rỗng, bạn có thể dùng cat
để xem nội dung của từng file và kiểm tra các kho phần mềm:
cat /etc/apt/sources.list.d/elastic-7.x.list
Output deb https://artifacts.elastic.co/packages/7.x/apt stable main
Điều này sẽ cho bạn biết URL của kho mà bạn sẽ cần thêm vào máy đích. Trong hầu hết các trường hợp, bạn có thể làm điều đó với lệnh add-apt-repository
:
sudo add-apt-repository repo_url
Trên các hệ thống RHEL, Rocky hoặc Fedora, bạn có thể sử dụng lệnh dnf
để liệt kê các kho phần mềm đang được cấu hình trên máy chủ:
dnf repolist enabled
Sau đó, bạn có thể thêm kho phần mềm bổ sung vào hệ thống đích bằng lệnh dnf config-manager
:
sudo dnf config-manager --add-repo repo_url
Nếu bạn thực hiện bất kỳ thay đổi nào với danh sách nguồn, hãy ghi lại chúng dưới dạng chú thích ở đầu script di chuyển trên máy đích. Bằng cách này, nếu bạn phải bắt đầu lại từ một cài đặt sạch, bạn sẽ biết các thủ tục cần thực hiện trước khi tiến hành di chuyển mới.
Mở file script:
nano ~/sync.sh
~/sync.sh #!/bin/bash ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free
Lưu và đóng file.
Xác định phiên bản và cài đặt phần mềm
Bây giờ, bạn đã cập nhật các nguồn phần mềm trên máy đích để khớp với máy nguồn.
Trên các máy Ubuntu hoặc Debian, bạn có thể cài đặt các phiên bản của phần mềm cần thiết trên máy đích bằng cách nhập:
sudo apt update sudo apt install package_name=version_number
Nếu phiên bản của gói mà bạn muốn khớp đã cũ hơn vài tháng, có thể nó đã bị loại bỏ khỏi kho chính thức. Trong trường hợp đó, bạn có thể cố gắng tìm kiếm phiên bản cũ của các gói .deb (ví dụ, duyệt qua các kho upstream cũ hoặc các PPA bên thứ ba) và cài đặt chúng thủ công với:
sudo dpkg -i package.deb
Tuy nhiên, hãy làm điều này một cách hạn chế để tránh tạo ra tình huống có quá nhiều gói với phiên bản không tương thích. Nếu các phiên bản cũ của phần mềm không còn sẵn, hãy thử nghiệm các bản phát hành mới nhất để xem chúng có đáp ứng được nhu cầu của bạn hay không, tránh áp đặt các yêu cầu lỗi thời.
Trên các hệ thống RHEL, Rocky hoặc Fedora, bạn có thể cài đặt các phiên bản cụ thể của phần mềm bằng cách nhập:
Sudo dnf install package_name-version_number
Nếu bạn cần tìm kiếm các file rpm
đã bị loại bỏ khỏi kho để nhường chỗ cho phiên bản mới hơn, bạn có thể cài đặt chúng với:
dnf install package_name.rpm
Nhắc nhở, hãy theo dõi các thao tác bạn đang thực hiện. Bạn có thể thêm chúng vào script của mình dưới dạng chú thích:
nano ~/sync.sh
Và nội dung file có thể trông như sau:
~/sync.sh #!/bin/bash ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mo
Lưu và đóng file.
Bước 3 – Bắt đầu chuyển dữ liệu
Quá trình chuyển dữ liệu thực tế thường không tốn nhiều công sức thao tác nhưng có thể tiêu tốn nhiều thời gian. Nếu bạn đang di chuyển một máy chủ có lượng dữ liệu lớn, có lẽ bạn nên bắt đầu chuyển dữ liệu càng sớm càng tốt.
rsync
là một công cụ mạnh mẽ cung cấp rất nhiều tùy chọn để sao chép các tập tin và thư mục giữa các môi trường khác nhau, với các tính năng kiểm tra checksum và nhiều tính năng khác.
Xác định các thư mục có dữ liệu bạn muốn chuyển và thêm các lệnh rsync
vào script di chuyển của bạn.
Một lệnh rsync
mẫu có dạng như sau:
rsync -azvP --progress source_server:/path/to/directory/to/transfer /path/to/local/directory
Giải thích các tham số:
-
-a: Kích hoạt “Archive Mode” cho quá trình sao chép, giúp bảo toàn thời gian chỉnh sửa, chủ sở hữu và các thuộc tính khác của file. Nó tương đương với việc cung cấp các tùy chọn -rlptgoD riêng lẻ (thực sự vậy). Đáng chú ý, tùy chọn -r cho phép
rsync
đi sâu vào các thư mục con để sao chép các tập tin và thư mục lồng nhau. -
-z: Nén dữ liệu trong quá trình chuyển, hữu ích cho các kết nối chậm, đặc biệt khi chuyển các dữ liệu có thể nén hiệu quả như log và các tập tin văn bản.
-
-v: Bật chế độ verbose, giúp bạn theo dõi chi tiết quá trình chuyển.
-
-P: Giữ lại các bản sao không hoàn chỉnh của các tập tin chưa được chuyển xong, cho phép tiếp tục chuyển sau đó.
Giả sử bạn cần tạo các thư mục cha dẫn tới đích trước khi chạy lệnh rsync.
Với việc thêm các lệnh rsync
, script sync.sh
của bạn có thể trông như sau:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories
Hãy nhớ rằng các lệnh này có thể được chạy lại và sẽ chỉ chuyển dữ liệu mới nếu các tập tin trên nguồn đã thay đổi, vì vậy bạn có thể bổ sung vào script một cách từ từ khi kiểm tra. Hãy cẩn thận và thực hiện từng bước đối với các thư mục bạn muốn bao gồm.
Di chuyển cơ sở dữ liệu và các dữ liệu không phải tệp tin
Lưu ý rằng bạn không thể sao chép toàn bộ dữ liệu chỉ bằng rsync
mà không có sự chuẩn bị thêm. Nhiều ứng dụng, chẳng hạn như cơ sở dữ liệu, lưu trữ dữ liệu của mình qua nhiều “tập tin” trong hệ thống để tối ưu hóa truy cập bằng các kỹ thuật như Database Sharding. Các tập tin này thường không được thiết kế để truy cập hoặc sao chép trực tiếp; thay vào đó, cơ sở dữ liệu cung cấp dữ liệu thông qua giao diện truy vấn.
May mắn thay, hầu hết các ứng dụng có cơ chế lưu trữ riêng đều cung cấp cơ chế xuất và nhập dữ liệu dưới dạng tập tin thông thường, cho phép chúng được sao chép bình thường trong các quá trình di chuyển. Ví dụ, nếu bạn đang sử dụng MySQL, hãy tham khảo bài viết “Cách Nhập và Xuất Cơ Sở Dữ Liệu trong MySQL hoặc MariaDB.” Sau đó, bạn có thể chuyển các file xuất dữ liệu này qua các máy chủ khác bằng rsync
hoặc scp
.
Bước 4 – Chỉnh sửa các tệp cấu hình
Mặc dù một số phần mềm có thể tự động hoạt động trở lại một cách trơn tru sau khi chuyển giao các chi tiết cấu hình và dữ liệu từ máy chủ gốc, nhiều cấu hình sẽ cần được chỉnh sửa.
Điều này đặt ra một vấn đề nhỏ đối với script đồng bộ. Nếu bạn chạy script để đồng bộ dữ liệu và sau đó chỉnh sửa các giá trị để phản ánh thông tin chính xác cho đích đến mới, những thay đổi đó sẽ bị ghi đè khi script được chạy lại. Để giải quyết vấn đề này, bạn có thể thêm các bước bổ sung vào script để chỉnh sửa dữ liệu ngay tại chỗ sau khi chuyển giao.
Linux bao gồm một số tiện ích cốt lõi rất hữu ích cho việc xử lý script văn bản loại này. Hai tiện ích tiêu biểu là sed
và awk
. Nói chung, sed
dễ sử dụng hơn khi bạn cần chỉnh sửa văn bản không có cấu trúc bằng các biểu thức chính quy, còn awk
hữu ích hơn cho việc phân tích các văn bản được định dạng hoặc dữ liệu dạng bảng. Ngoài ra, bạn có thể tìm hiểu thêm về cách sử dụng sed
hoặc awk
.
Theo cách này, script đồng bộ của bạn có thể thực hiện các lệnh sed
hoặc awk
ngay sau khi chạy rsync
, để các tập tin được chỉnh sửa tự động theo yêu cầu.
Ví dụ về cú pháp sed
:
sed -i 's/string_to_match/string_to_replace_it_with/g' file_to_edit
Ở đây, cờ -i
có nghĩa là file sẽ được chỉnh sửa ngay tại chỗ thay vì tạo ra một file đầu ra riêng biệt. Các ký tự s
và g
là quy ước trong sed. Bạn cũng có thể sử dụng biểu thức chính quy trong string_to_match
. Hãy thử thêm một lệnh sed
vào file sync.sh
:
~/sync.sh rsync -avz --progress source_server:/etc/mysql/* /etc/mysql/ # Change socket to '/mysqld/mysqld.sock' sed -i 's/\/var\/run\/mysqld\/mysqld.sock/\/mysqld\/mysqld.sock/g' /etc/mysql/my.cnf
Lệnh trên sẽ thay thế mọi trường hợp của /var/run/mysqld/mysqld.sock
trong file /etc/mysql/my.cnf
thành /mysqld/mysqld.sock
. Ký tự \
được sử dụng để thoát ký tự /
nhằm tránh bị hiểu nhầm là dấu kết thúc của biểu thức sed. Đây là cách xử lý ký tự đặc biệt. Hãy đảm bảo rằng các lệnh sed
được đặt sau các lệnh rsync
.
Bạn cũng có thể sử dụng awk
cho văn bản được định dạng tương tự như cách bạn sử dụng sed
cho văn bản không có cấu trúc. Ví dụ, file /etc/shadow
được phân chia bằng dấu hai chấm (:), trông như sau:
/etc/shadow vault:!:18941:::::: stunnel4:!:18968:0:99999:7::: sammy:$6$bscTWIVxvy.KhkO8$NJNhpABhJoybG/vDiRzQ2y9OFEd6XtqgCUG4qkuWfld97VEXH8/jUtc7oMtOC34V47VE7Hjd
Bạn có thể sử dụng awk
để loại bỏ dữ liệu từ “cột” thứ hai (tức là giữa dấu :
đầu tiên và thứ hai), như sau:
awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow
Lệnh này yêu cầu awk
đặt cùng dấu phân cách đầu vào và đầu ra là dấu :
, sau đó chỉ định rằng nếu cột thứ nhất bằng “root”, thì cột thứ hai sẽ được gán giá trị rỗng. Khác với sed
, awk
không hỗ trợ chỉnh sửa file trực tiếp nên script sẽ ghi vào file tạm và sau đó thay thế file gốc bằng file tạm.
Chú ý: Mặc dù
sed
vẫn được ưa chuộng do tính linh hoạt khi làm việc với các biểu thức chính quy, nhưngawk
lại được coi là hơi cổ xưa và cú pháp của nó có thể khó học. Nếu bạn làm việc với các file được phân cách bằng dấu phẩy, hãy cân nhắc sử dụng các công cụ hiện đại hơn như csvkit.
Bạn luôn có thể thêm các chú thích vào script di chuyển (dòng bắt đầu bằng ký tự #
) để ghi lại các thay đổi hoặc sửa lỗi đang tiến hành.
Kết luận
Trong bài hướng dẫn cuối cùng của chuỗi này, bạn sẽ xem lại cách chuyển và kiểm tra các dịch vụ hệ thống còn sót lại trên máy chủ mới.