Category: Linux

Hướng dẫn cài đặt OpenLiteSpeed trên CentOS 7

OpenLiteSpeed là gì?

Gọi tắt OpenLiteSpeed là OLS nhé.

Cũng giống như Apache hay Nginx, OpenLiteSpeed là một webserver mã nguồn mở, được phát triển nhờ cộng đồng dựa trên phiên bản LiteSpeed (Thương mại) của công ty LiteSpeed Tech, OLS được đi kèm với giấy phép GPL v3.

Continue reading

Advertisements

Monitoring Kubernetes Cluster với Prometheus-Grafana Stack

Nội dung

  • Giới thiệu
  • Prometheus
  • Prometheus Operator
  • Grafana
  • Installation
  • Kết luận
  • Tài liệu tham khảo

Giới thiệu

Để bắt đầu với nội dung bài viết này, chắc hẳn bạn đã có kiến thức cơ bản về Kubernetes rồi, và nếu bạn chưa từng nghe về Kubernetes thì xin mời bạn tìm hiểu về K8s ở bài viết trước Tại đây. Continue reading

Rclone – Backup toàn bộ VPS lên Google Drive

Trước đây mình vẫn dùng VPS để chứa các bản backup sử dụng công cụ Duplicity hoặc Rsync. Tuy nhiên, hiện giờ đã có một phương pháp mới hiệu quả hơn, tiết kiệm hơn (Free), đó là sao lưu lên Cloud với Rclone.

backup-server-google-drive

Rclone là một công cụ đồng bộ hóa dữ liệu tương tự Rsync nhưng lại được tập trung phát triển chức năng kết nối với các dịch vụ lưu trữ đám mây.

Ưu điểm của việc sử dụng dịch vụ lưu trữ đám mây đó là tốc độ cao (do có server được đặt trên khắp thế giới), an toàn dữ liệu (không lo ngại các vấn đề phần cứng, network) và nhất là hầu hết đều Free. Mình đặc biệt thích những thứ Free!

Rclone hỗ trợ rất nhiều dịch vụ Cloud thông dụng như:

  • Google Drive
  • Amazon S3
  • Openstack Swift / Rackspace cloud files / Memset Memstore
  • Dropbox
  • Google Cloud Storage
  • Amazon Drive
  • Microsoft OneDrive
  • Hubic
  • Backblaze B2
  • Yandex Disk
  • SFTP
  • The local filesystem

Xem thêm test tốc độ upload Rclone.

Giờ thay vì backup đưa lên VPS khác để lưu trữ, mình chuyển sang sử dụng Google Drive, dung lượng miễn phí 15GB, mua thêm cũng khá rẻ, chỉ 45k/tháng là được 100GB rồi. Bạn nào có tài khoản Google Apps miễn phí nữa thì càng tuyệt vời.

Trong bài viết này sẽ có 2 phần chính, 1 là cài đặt Rclone trên VPS, 2 là sử dụng Rclone để upload backup lên Google Drive. Với những cloud service khác các bạn làm tương tự.

Việc tạo file backup toàn bộ dữ liệu VPS mình đã hướng dẫn chi tiết trong bài viết Hướng dẫn tự động sao lưu toàn bộ VPS, bài viết này sẽ chỉ tập trung vào việc cài đặt tự động upload file nén lên Google Drive. Xem thêm hướng dẫn sử dụng Rclone với Google Drive và các dịch vụ cloud khác tại Rclone Docs.

Kịch bản tự động backup như sau:

  • Sao lưu toàn bộ database MySQL, mỗi database một file .gz
  • Sao lưu toàn bộ code trong thư mục /home/domain.com/public_html/
  • Sao lưu toàn bộ cấu hình Nginx trong thư mục /etc/nginx/conf.d/
  • Tổng hợp tất cả dữ liệu vào 1 folder
  • Upload file backup lên Google Drive vào lúc 2h00 sáng
  • Tự động xóa file backup trên VPS sau khi upload xong, xóa file backup trên Cloud nếu quá 2 tuần

Giờ bắt đầu vào việc nhé.

I. Hướng dẫn cài đặt Rclone

1. Cài đặt Rclone

Rclone là một chương trình dòng lệnh nên mình sẽ down xuống rồi di chuyển file chạy đến thư mục /usr/sbin/ của VPS để sử dụng sau này.

Chú ý : Nếu bạn đã cài đặt phiên bản cũ, cũng chỉ cần chạy chuỗi lệnh dưới để update. Tham khảo Changelog các phiên bản.

– Cài đặt với phiên bản v1.42 hệ điều hành Linux 64bit

cd /root/
wget https://downloads.rclone.org/v1.42/rclone-v1.42-linux-amd64.zip
unzip rclone-v*.zip
\cp rclone-v*-linux-amd64/rclone /usr/sbin/
rm -rf rclone-*

– Cài đặt với phiên bản v1.42 hệ điều hành Linux 32bit

cd /root/
wget https://downloads.rclone.org/v1.42/rclone-v1.42-linux-386.zip
unzip rclone-v*.zip
\cp rclone-v*-linux-386/rclone /usr/sbin/
rm -rf rclone-*

Link download trực tiếp các phiên bản Rclone.

Giờ bạn có thể sử dụng lệnh rclone để xem thêm thông tin sử dụng.

2. Một số câu lệnh thông dụng

Các câu lệnh sử dụng Rclone thường có dạng như sau:

rclone command <parameters> <parameters...>

Trong đó command là câu lệnh, parameters là các tham số.

Một số lệnh thông dụng khi dùng Rclone:

  • rclone config – Cấu hình kết nối đến dịch vụ cloud.
  • rclone copy – Copy files từ server đến cloud, skip nếu đã tồn tại dữ liệu.
  • rclone sync – Synchronize giữa server và cloud, chỉ update dữ liệu trên cloud mà thôi.
  • rclone move – Move files từ server lên cloud.
  • rclone delete – Xóa dữ liệu của folder.
  • rclone purge – Xóa dữ liệu của folder và toàn bộ nội dung bên trong.
  • rclone mkdir – Tạo folder.
  • rclone rmdir – Xóa folder trống tại đường dẫn.
  • rclone rmdirs – Xóa toàn bộ folder trống tại đường dẫn.
  • rclone check – Kiểm tra dữ liệu server và cloud có đồng bộ hay không.
  • rclone ls – Liệt kê toàn bộ dữ liệu gồm size và path.
  • rclone lsd – Liệt kê toàn bộ thư mục.
  • rclone lsl – Liệt kê toàn bộ dữ liệu gồm modification time, size và path.
  • rclone size – Trả về kích thước thư mục.

Thông tin chi tiết từng lệnh bạn xem thêm ở đây.

II. Backup VPS lên Cloud với Rclone

1. Tạo kết nối với Google Drive

Đầu tiên chúng ta sẽ cấu hình kết nối Rclone với Google Drive, việc này chỉ phải làm 1 lần duy nhất. Kết nối được tạo tên remote

Kết nối SSH với VPS rồi chạy lệnh:

# rclone config

Bạn sẽ nhận được thông báo: No remotes found - make a new one, nhập n rồi nhấn Enter để tạo kết nối mới.

Ở dòng name bạn nhập remote để đặt tên cho kết nối, bạn có thể chọn tên nào cũng được.

Một danh sách các dịch vụ cloud xuất hiện, hãy chọn số 11, Google Drive rồi nhấn Enter.

Ở 2 dòng tiếp theo Client ID và Client Secret bạn hãy để trống nhấn Enter.

Mục Scope that rclone should use when requesting access from drive chọn 1 – drive

Tiếp theo, để trống với ID of the root folder và Service Account Credentials JSON file path

Khi được hỏi Use auto config? hãy nhập n rồi nhấn Enter. Ngay lập tức, Rclone sẽ đưa ra một đường link, bạn có thể click thẳng vào đó hoặc copy rồi paste vào trình duyệt.

tao-ket-noi-google-drive-2

Giao diện sẽ xuất hiện như sau:

cap-quyen-cho-rclone-truy-cap-google-drive

Nhấn nút Allow để đồng ý, sau đó bạn sẽ nhận được đoạn mã verification code như hình dưới:

ma-verification-code

Quay trở lại cửa sổ SSH, copy rồi paste code này vào dòng Enter verification code> rồi nhấn Enter.

Chọn n tức no đối với Configure this as a team drive?

Rclone cần xác nhận thông tin một lần nữa, bạn nhấn y để đồng ý rồi nhấn q để thoát khỏi giao diện cấu hình kết nối.

Toàn bộ quá trình cài đặt sẽ tương tự như sau (bôi đỏ là cần nhập input):

# rclone config
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> remote
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Alias for a existing remote
   \ "alias"
 2 / Amazon Drive
   \ "amazon cloud drive"
 3 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
   \ "s3"
 4 / Backblaze B2
   \ "b2"
 5 / Box
   \ "box"
 6 / Cache a remote
   \ "cache"
 7 / Dropbox
   \ "dropbox"
 8 / Encrypt/Decrypt a remote
   \ "crypt"
 9 / FTP Connection
   \ "ftp"
10 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
11 / Google Drive
   \ "drive"
12 / Hubic
   \ "hubic"
13 / Local Disk
   \ "local"
14 / Mega
   \ "mega"
15 / Microsoft Azure Blob Storage
   \ "azureblob"
16 / Microsoft OneDrive
   \ "onedrive"
17 / OpenDrive
   \ "opendrive"
18 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
19 / Pcloud
   \ "pcloud"
20 / QingCloud Object Storage
   \ "qingstor"
21 / SSH/SFTP Connection
   \ "sftp"
22 / Webdav
   \ "webdav"
23 / Yandex Disk
   \ "yandex"
24 / http Connection
   \ "http"
Storage> 11
Google Application Client Id - leave blank normally.
client_id>
Google Application Client Secret - leave blank normally.
client_secret>
Scope that rclone should use when requesting access from drive.
Choose a number from below, or type in your own value
 1 / Full access all files, excluding Application Data Folder.
   \ "drive"
 2 / Read-only access to file metadata and file contents.
   \ "drive.readonly"
   / Access to files created by rclone only.
 3 | These are visible in the drive website.
   | File authorization is revoked when the user deauthorizes the app.
   \ "drive.file"
   / Allows read and write access to the Application Data folder.
 4 | This is not visible in the drive website.
   \ "drive.appfolder"
   / Allows read-only access to file metadata but
 5 | does not allow any access to read or download file content.
   \ "drive.metadata.readonly"
scope> 1
ID of the root folder - leave blank normally.  Fill in to access "Computers" folders. (see docs).
root_folder_id>
Service Account Credentials JSON file path  - leave blank normally.
Needed only if you want use SA instead of interactive login.
service_account_file>
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine or Y didn't work
y) Yes
n) No
y/n> n
If your browser doesn't open automatically go to the following link: https://accounts.google.com/o/oauth2/auth?access_type=offlinexxxx
Log in and authorize rclone for access
Enter verification code> 4/AABw8gMKPxxxxxxxxxx
Configure this as a team drive?
y) Yes
n) No
y/n> n
--------------------
[remote]
type = drive
client_id =
client_secret =
scope = drive
root_folder_id =
service_account_file =
token = {"access_token":"xxx","token_type":"Bearer","refresh_token":"1/xxx","expiry":"2018-05-16T10:55:03.488381196+07:00"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
remote               drive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Vậy là xong, giờ bạn có thể test với lệnh liệt kê thư mục trong kết nối remote:

# rclone lsd remote:

2. Tạo kết nối với Amazon Drive/One Drive/Yandex

Hiện nay, bên cạnh GG Drive, các Cloud khác cũng dần trở nên phổ biến và có nhiều ưu đãi cho người dùng. Việc tạo kết nối tới Amazon Drive/OneDrive/Yandex tương tự GG Drive, chỉ khác biệt bước lấy access_token.
Lưu ý: Đối với OneDrive cần chọn đúng loại tài khoản cá nhân Personal/doanh nghiệp Bussiness.

Việc xác thực được thực hiện qua remote machine có trình duyệt (ví dụ máy tính của bạn) với lệnh rclone authorize "tên_cloud".

Ví dụ cụ thể OneDrive, đến bước xác thực:

Microsoft App Client Id - leave blank normally.
client_id>
Microsoft App Client Secret - leave blank normally.
client_secret>
Remote config
Choose OneDrive account type?
 * Say b for a OneDrive business account
 * Say p for a personal OneDrive account
b) Business
p) Personal
b/p> p
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
        rclone authorize "onedrive"

Chạy lệnh rclone authorize "onedrive" tại máy đang sử dụng để lấy access_token.

  1. Tải Rclone về máy cá nhân (bản cho Windows/OSX) tại Rclone Downloads. Cụ thể, WindowsAMD64 – 64 Bit được rclone-v1.42-windows-amd64. Bên trong có file rclone.exeđể chạy trên cửa sổ lệnh. Ví dụ đường dẫn file D:\Rclone/rclone.exe
  2.  Mở ứng dụng CMD của Windows (Run – CMD) rồi chạy lệnh trên với đường dẫn file. Ví dụ, D:\Rclone\rclone.exe authorize "onedrive"
  3. Browser bật ra yêu cầu bạn đăng nhập để xác thực. Thành công sẽ hiện thông báo Success. Go back to rclone to continue trên trình duyệt. Quay lại ứng dụng CMD bạn copy access_token để xác thực bên VPS.
C:\Users\HocVPS>D:\Rclone\rclone.exe authorize "onedrive"

Choose OneDrive account type?
* Say b for a OneDrive business account
* Say p for a personal OneDrive account
b) Business
p) Personal
b/p> p
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
{"access_token":"EwD4Aq1DBAAUcSSzoTJJxxx","expiry":"2018-05-16T11:43:25.3184173+07:00""}
<---End paste

Chú ý,  access_token là một chuỗi kí tự liền mạch nên khi copy từ CMD bạn paste qua trình chỉnh sửa như EmEditor hay Notepad++ để loại bỏ hoàn toàn các kí tự thừa gây cách dòng.

3. Script backup toàn bộ VPS và upload lên Cloud

Trong bài Hướng dẫn tự động sao lưu toàn bộ VPS mình đã chia sẻ script tự động backup VPS, tuy nhiên trong bài này mình sẽ chỉnh sửa lại một chút, để script tự động upload lên Cloud sau khi tạo xong file nén.

– Script hoạt động với Rclone phiên bản 1.35 trở lên.
– Kết nối Rclone với Cloud tên remote, nếu bạn sử dụng kết nối khác thì thay đổi tên trong script
– Nếu bạn sử dụng hệ quản trị khác HocVPS thì sử dụng script 2 và sửa thông tin đăng nhập MySQL, đường dẫn thư mục source code và thư mục Nginx Conf

Script này mình viết theo cấu trúc folder trên server do HocVPS Script quản lý.

– Tạo file backup.sh ở thư mục /root/

nano /root/backup.sh

– Copy toàn bộ nội dung script bên dưới rồi paste vào (áp dụng với HocVPS Script 2.0 trở lên)

# HocVPS Script Plugin - Backup Server and Upload to Cloud

#!/bin/bash

SERVER_NAME=HOCVPS_BACKUP

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
	$MYSQLDUMP --force --opt $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
# Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

size=$(du -sh $BACKUP_DIR | awk '{ print $1}')

echo "Starting Uploading Backup";
/usr/sbin/rclone move $BACKUP_DIR "remote:$SERVER_NAME/$TIMESTAMP" >> /var/log/rclone.log 2>&1
# Clean up
rm -rf $BACKUP_DIR
/usr/sbin/rclone -q --min-age 2w delete "remote:$SERVER_NAME" #Remove all backups older than 2 week
/usr/sbin/rclone -q --min-age 2w rmdirs "remote:$SERVER_NAME" #Remove all empty folders older than 2 week
/usr/sbin/rclone cleanup "remote:" #Cleanup Trash
echo "Finished";
echo '';

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
# HocVPS Script Plugin - Backup Server and Upload to Cloud
# Version: 1.1
#!/bin/bash

. /etc/hocvps/scripts.conf

SERVER_NAME=HOCVPS_BACKUP

TIMESTAMP=$(date +"%F")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL_USER="root"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD=$mariadbpass
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
	$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
# Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

size=$(du -sh $BACKUP_DIR | awk '{ print $1}')

echo "Starting Uploading Backup";
/usr/sbin/rclone move $BACKUP_DIR "remote:$SERVER_NAME/$TIMESTAMP" >> /var/log/rclone.log 2>&1
# Clean up
rm -rf $BACKUP_DIR
/usr/sbin/rclone -q --min-age 2w delete "remote:$SERVER_NAME" #Remove all backups older than 2 week
/usr/sbin/rclone -q --min-age 2w rmdirs "remote:$SERVER_NAME" #Remove all empty folders older than 2 week
/usr/sbin/rclone cleanup "remote:" #Cleanup Trash
echo "Finished";
echo '';

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."

Lưu ý:

  • Script trên sẽ back up toàn bộ database, mỗi database nén thành một file .gz, lưu trong thư mục mysql
  • Mỗi thư mục chứa website được nén lại thành 1 file .zip
  • Toàn bộ cấu hình Nginx của các website được lưu trong thư mục nginx
  • SERVER_NAME mặc định là HOCVPS_BACKUP, nếu muốn thay đổi folder trên Cloud bạn hãy thay đổi tham số này.
  • Muốn điều chỉnh thời gian xóa file backup, bạn sửa thông số ở dòng delete và rmdirs. Hiện tại, tự động xóa file/folder cũ hơn 2 tuần.

– Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát.

– Phân quyền cho script

chmod +x /root/backup.sh

– Vậy là xong rồi đó, giờ bạn có thể test lại bằng cách chạy lệnh:

/root/backup.sh

Thử kiểm tra trên Cloud xem có thư mục mới với dữ liệu backup chưa nhé, hoặc test với lệnh:

rclone lsl remote:HOCVPS_BACKUP

Nếu không có vấn đề gì sẽ thấy kết quả trả về có một thư mục là ngày hiện tại, bên trong có chứa file nén website (.zip), cấu hình Nginx (.conf) và database (.gz).

4. Tạo cronjob tự động backup hàng ngày

Giờ mình sẽ cho script tự động chạy lúc 2h00 sáng.

EDITOR=nano crontab -e

Dán nội dung sau vào cửa sổ Terminal

0 2 * * * /root/backup.sh > /dev/null 2>&1

Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát

Vậy là xong, cứ 2h sáng hàng ngày script sẽ tự động chạy, backup toàn bộ dữ liệu của VPS rồi upload lên Cloud. Đồng thời, dữ liệu backup trên VPS sẽ được xóa luôn sau khi upload xong.

Xem thêm hướng dẫn sử dụng cronjob.

III. Tải file backup từ Cloud xuống VPS

Cách đơn giản nhất để bạn khôi phục lại dữ liệu đó là tải file backup từ Cloud xuống máy tính, rồi tùy theo nhu cầu mà up trở lại lên VPS. Tuy nhiên, nếu muốn tải trực tiếp file backup về VPS, bạn có thể sử dụng luôn Rclone với câu lệnh copy.

Ví dụ tham khảo:

rclone copy "remote:/HOCVPS_BACKUP/2017-11-01" /root/

Lệnh trên sẽ copy folder 2017-11-01 trong thư mục HOCVPS_BACKUP trên Cloud về thư mục /root/của VPS. Tốc độ upload và download từ Cloud đều rất nhanh.
Sau khi copy dữ liệu backup về VPS, bạn tiến hành giải nén file zip, copy thư mục web và nginx về đúng vị trí đồng thời tiến hành import database.

 

p/s: https://hocvps.com/

Deleting tons of files in Linux (Argument list too long)

Quick Linux Tip:

If you’re trying to delete a very large number of files at one time (I deleted a directory with 485,000+ today), you will probably run into this error:

/bin/rm: Argument list too long.

The problem is that when you type something like “rm -rf *”, the “*” is replaced with a list of every matching file, like “rm -rf file1 file2 file3 file4″ and so on. There is a reletively small buffer of memory allocated to storing this list of arguments and if it is filled up, the shell will not execute the program.

To get around this problem, a lot of people will use the find command to find every file and pass them one-by-one to the “rm” command like this:

find . -type f -exec rm -v {} \;

My problem is that I needed to delete 500,000 files and it was taking way too long.

I stumbled upon a much faster way of deleting files – the “find” command has a “-delete” flag built right in! Here’s what I ended up using:

find . -type f -delete

Using this method, I was deleting files at a rate of about 2000 files/second – much faster!

You can also show the filenames as you’re deleting them:

find . -type f -print -delete

…or even show how many files will be deleted, then time how long it takes to delete them:

root@devel# ls -1 | wc -l && time find . -type f -delete
100000
real    0m3.660s
user    0m0.036s
sys     0m0.552s

MySQL 5.7 Multi-Source Replication – Automatically Combining Data From Multiple Databases Into One

MySQL’s multi-source replication allows you to replicate data from multiple databases into one database in parallel (at the same time). This post will explain and show you how to set up multi-source replication. (WARNING: This is a very long and detailed post. You might want to grab a sandwich and a drink. Continue reading

ZFS Pool Related Commands

# zpool create datapool c0t0d0 Create a basic pool named datapool
# zpool create -f datapool c0t0d0 Force the creation of a pool
# zpool create -m /data datapool c0t0d0 Create a pool with a different mount point than the default.
# zpool create datapool raidz c3t0d0 c3t1d0 c3t2d0 Create RAID-Z vdev pool
# zpool add datapool raidz c4t0d0 c4t1d0 c4t2d0 Add RAID-Z vdev to pool datapool
# zpool create datapool raidz1 c0t0d0 c0t1d0 c0t2d0 c0t3d0 c0t4d0 c0t5d0 Create RAID-Z1 pool
# zpool create datapool raidz2 c0t0d0 c0t1d0 c0t2d0 c0t3d0 c0t4d0 c0t5d0 Create RAID-Z2 pool
# zpool create datapool mirror c0t0d0 c0t5d0 Mirror c0t0d0 to c0t5d0
# zpool create datapool mirror c0t0d0 c0t5d0 mirror c0t2d0 c0t4d0 disk c0t0d0 is mirrored with c0t5d0 and disk c0t2d0 is mirrored withc0t4d0
# zpool add datapool mirror c3t0d0 c3t1d0 Add new mirrored vdev to datapool
# zpool add datapool spare c1t3d0 Add spare device c1t3d0 to the datapool
## zpool create -n geekpool c1t3d0 Do a dry run on pool creation

Show Pool Information

# zpool status -x Show pool status
# zpool status -v datapool Show individual pool status in verbose mode
# zpool list Show all the pools
# zpool list -o name,size Show particular properties of all the pools (here, name and size)
# zpool list -Ho name Show all pools without headers and columns

File-system/Volume related commands

# zfs create datapool/fs1 Create file-system fs1 under datapool
# zfs create -V 1gb datapool/vol01 Create 1 GB volume (Block device) in datapool
# zfs destroy -r datapool destroy datapool and all datasets under it.
# zfs destroy -fr datapool/data destroy file-system or volume (data) and all related snapshots

Set ZFS file system properties

# zfs set quota=1G datapool/fs1 Set quota of 1 GB on filesystem fs1
# zfs set reservation=1G datapool/fs1 Set Reservation of 1 GB on filesystem fs1
# zfs set mountpoint=legacy datapool/fs1 Disable ZFS auto mounting and enable mounting through /etc/vfstab.
# zfs set sharenfs=on datapool/fs1 Share fs1 as NFS
# zfs set compression=on datapool/fs1 Enable compression on fs1

File-system/Volume related commands

# zfs create datapool/fs1 Create file-system fs1 under datapool
# zfs create -V 1gb datapool/vol01 Create 1 GB volume (Block device) in datapool
# zfs destroy -r datapool destroy datapool and all datasets under it.
# zfs destroy -fr datapool/data destroy file-system or volume (data) and all related snapshots

Show file system info

# zfs list List all ZFS file system
# zfs get all datapool” List all properties of a ZFS file system

Mount/Umount Related Commands

# zfs set mountpoint=/data datapool/fs1 Set the mount-point of file system fs1 to /data
# zfs mount datapool/fs1 Mount fs1 file system
# zfs umount datapool/fs1 Umount ZFS file system fs1
# zfs mount -a Mount all ZFS file systems
# zfs umount -a Umount all ZFS file systems

ZFS I/O performance

# zpool iostat 2 Display ZFS I/O Statistics every 2 seconds
# zpool iostat -v 2 Display detailed ZFS I/O statistics every 2 seconds

ZFS maintenance commands

# zpool scrub datapool Run scrub on all file systems under data pool
# zpool offline -t datapool c0t0d0 Temporarily offline a disk (until next reboot)
# zpool online Online a disk to clear error count
# zpool clear Clear error count without a need to the disk

Import/Export Commands

# zpool import List pools available for import
# zpool import -a Imports all pools found in the search directories
# zpool import -d To search for pools with block devices not located in /dev/dsk
# zpool import -d /zfs datapool Search for a pool with block devices created in /zfs
# zpool import oldpool newpool Import a pool originally named oldpool under new name newpool
# zpool import 3987837483 Import pool using pool ID
# zpool export datapool Deport a ZFS pool named mypool
# zpool export -f datapool Force the unmount and deport of a ZFS pool

Snapshot Commands

# zfs snapshot datapool/fs1@12jan2014 Create a snapshot named 12jan2014 of the fs1 filesystem
# zfs list -t snapshot List snapshots
# zfs rollback -r datapool/fs1@10jan2014 Roll back to 10jan2014 (recursively destroy intermediate snapshots)
# zfs rollback -rf datapool/fs1@10jan2014 Roll back must and force unmount and remount
# zfs destroy datapool/fs1@10jan2014 Destroy snapshot created earlier
# zfs send datapool/fs1@oct2013 &gt /geekpool/fs1/oct2013.bak Take a backup of ZFS snapshot locally
# zfs receive anotherpool/fs1 &lt /geekpool/fs1/oct2013.bak Restore from the snapshot backup backup taken
# zfs send datapool/fs1@oct2013 | zfs receive anotherpool/fs1 Combine the send and receive operation
# zfs send datapool/fs1@oct2013 | ssh node02 “zfs receive testpool/testfs” Send the snapshot to a remote system node02

Clone Commands

# zfs clone datapool/fs1@10jan2014 /clones/fs1 Clone an existing snapshot
# zfs destroy datapool/fs1@10jan2014 Destroy clone

So sánh và kiểm tra trong Bash shell

Luồng điều khiển trong chương trình được xử lý bởi các mệnh đề so sánh và kiểm tra. Bash cung cấp cho chúng ta vài tùy chọn để thực hiện việc so sánh và kiểm tra này. Chúng ta có thể ifif else, và các phép toán luận lý để thực hiện các phép kiểm tra và các phép toán so sánh nhất định để so sánh các đối tượng dữ liệu. Trong bài viết này, chúng ta sẽ tìm hiểu cách so sánh và kiểm tra trong Bash shell.

1. Kiểm tra trong Bash shell

Việc kiểm tra trong Bash shell được thực hiện bằng cấu trúc

[ condition ]

Cấu trúc trên sẽ trả về 1 trong 2 kết quả:

  • True => nếu condition đúng
  • False => nếu condition sai

2. if, if-else

if và if-else là các cấu trúc điều khiển luồng làm việc của chương trình, chúng thường được gọi là các cấu trúc điều kiện, tức là ứng với từng điều kiện thì chúng ta sẽ thực thi khối chương trình tương ứng cho điều kiện đó, trong trường hợp này chúng ta có 2 điều kiện là đúng (TRUE) và sai (FALSE). Cấu trúc if và if – else

if condition;
then
    commands;
fi

Nếu condition đúng thì thực hiện commands.

if condition;
then
    commands_01;
else
    commands_02;
fi

Nếu condition đúng thì thực hiện commands_01, ngược lại, nếu condition sai thì thực hiện commands_02. Chúng ta có thể sử dụng 2 cấu trúc if và if else lồng vào nhau như sau:

if condition;
then
    commands;
else if condition;
then
    commands;
else
    commands;
fi

Trong thực tế chúng ta thường kết hợp 2 cấu trúc kiểm tra và điều kiện vào nhau để thực hiện việc kiểm tra và thực thi luồng xử lý như sau:

if [ condition ];
then
    commands;
fi

if [ condition ];
then
    commands;
else
    commands;
fi

Hoặc chúng ta có thể viết ở dạng ngắn gọn như sau:

  • [ condition ] && action => thực hiện nếu điều kiện condition là đúng (TRUE).
  • [ condition ] || action => thực hiện nếu điều kiện condition là sai (FALSE).

Với && là phép toán luận lý AND và || là phép toán luận lý OR.

3. So sánh số học

Sử dụng các phép toán so sánh số học dưới đây bên trong cấu trúc kiểm tra [] ở phần 1.

  • -eq => Bằng nhau (Equal)
  • -ne => Không bằng nhau (Not equal)
  • -lt => Nhỏ hơn (Less than)
  • -gt => Lớn hơn (Greater than)
  • -le => Nhỏ hơn hoặc bằng (Less or equal)
  • -ge => Lớn hơn hoặc bằng (Greater or equal)

vd:

var=10
[ $var -eq 0 ] => FALSE

4. So sánh chuỗi

Sử dụng các cấu trúc sau để thực hiện việc so sánh chuỗi trong Bash shell

  • [[ $str1 = $str2 ]] hoặc [[ $str1 == $str2 ]]

Trả về TRUE nếu 2 biến str1 và str2 có nội dung giống nhau. FALSE nếu ngược lại.

  • [[ $str1 != $str2 ]]

Trả về TRUE nếu 2 biến str1 và str2 có nội dung giống nhau. FALSE nếu ngược lại.

  • [[ $str1 > $str2 ]]

Trả về TRUE nếu srt1 lớn hơn str2 tính theo bảng chữ cái. FALSE nếu ngược lại.

vd:

str1="HELLO"
str2="Hello"
[[ $str1 > $str2 ]] =>TRUE
  • [[ $str1 < $str2 ]]

Trả về TRUE nếu srt1 nhỏ hơn str2 tính theo bảng chữ cái. FALSE nếu ngược lại.

  • [[ -z $str1 ]]

Trả về TRUE nếu $str1 là 1 chuỗi rỗng. FALSE nếu ngược lại

  • [[ -n $str1 ]]

Trả về TRUE nếu $str1 là 1 chuỗi khác rỗng. FALSE nếu ngược lại.

Lưu ý:

  • Khi sử dụng dấu =, nếu trước và sau nó không có khoảng trắng thì khai báo đó sẽ được hiểu là phép gán.

vd:

var=”value”

  • Ngược lại, nếu trước và sau dấu = có khoảng trắng, thì khai báo đó được hiểu là phép so sánh

vd:

$var = “value”

5. Kiểm tra hệ thống tập tin

Sử dụng các phép toán kiểm tra hệ thống tập tin dưới đây bên trong cấu trúc kiểm tra [] ở phần 1.

  • [ -f $file_var]

Trả về TRUE nếu file_var là 1 tập tin.

  • [ -x $var ]

Trả về TRUE nếu var là tập tin và có quyền thực thi (executable)

  • [ -d $var ]

Trả về TRUE nếu var là 1 thư mục.

  • [ -e $var ]

Trả về TRUE nếu var tồn tại

  • [ -w $var ]

Trả về TRUE nếu var là 1 tập tin và có quyền ghi (writable)

  • [ -r $var ]

Trả về TRUE nếu var là 1 tập tin và có quyền đọc (readable)

  • [ -L $var ]

Trả về TRUE nếu var là 1 liên kết mềm (symlink)

vd:

fpath="/etc/passwd"
if [ -e $fpath ]; then
    echo File exists;
else
    echo Does not exist;
fi

6. Kết hợp nhiều phép kiểm tra với nhau

Chúng ta có thể kết hợp nhiều điều kiện kiểm tra với nhau bằng việc sử dụng các toán tử luận lý gồm:

  • AND hoặc &&  => Trả về TRUE  khi tất cả các điều kiện đều thỏa

vd:

str1="Not empty "
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
    echo TRUE
fi

 

  • OR hoặc || => Trả về TRUE khi 1 trong các điều kiện thỏa

vd:

str1="Not empty "
if [[ -n $str1 ]] || [[ -z $str1 ]];
then
    echo TRUE
fi

Chúng ta hoàn thành bài tìm hiểu về các so sánh và kiểm tra trong Bash shell tại đây. Chúc các bạn thành công!