Thursday, November 21, 2024

Backup Linux sử dụng lệnh dd

-

1. Mở đầu.

Hôm nay tôi sẽ giới thiệu một command dd trong hệ thống Linux. Để có thể hiểu hết được ý nghĩa của câu lệnh này và các tùy chọn của câu lệnh trước tiên bạn cần phải có kiến thức và cách tổ chức lưu trư dữ liệu trong ô cứng, hiều về các sector,tracks, Cylinders,.. các thuật ngũ liên quan đến ổ cứng, và kiến thức về MBR…

2. Khái niệm và ứng dụng của câu lệnh.

Câu lệnh dd trong linux là một trong những câu lệnh thường xuyên được sử dụng. Câu lệnh dd dùng để sử dụng trong các trường hợp sau:

  • Sao lưu và phục hồi toàn bộ dữ liệu ổ cứng hoặc một partition
  • Chuyển đổi định dạng dữ liệu từ ASCII sang EBCDIC hoặc ngược lại
  • Sao lưu lại MBR trong máy (MBR là một file dữ liệu rất quan trong nó chứa các lệnh để LILO hoặc GRUB nạp hệ điều hành).
  • Tạo một file với kích cơ cố định
  • Tạo một file ISO

3. Cú pháp và các trường tùy chọn.

#dd if=<địa chỉ đầu vào> of=<địa chỉ đầu ra> option

Trong đó:

  • if= địa chỉ nguồn của dữ liệu nó sẽ bắt đầu đọc
  • of= viết đầu ra của file
  • option : các tùy chọn cho câu lệnh
b. Các tùy chọn

Tùy chọnÝ nghĩa
bs=BytesQuá trình đọc (ghi) bao nhiêu byte một lần đọc (ghi)
cbs=BytesChuyển đổi bao nhiêu byte một lần
count=Blocksthực hiện bao nhiêu Block trong quá trình thực thi câu lệnh
ifChỉ đường dẫn đọc đầu vào
ofChỉ đường dẫn ghi đầu ra
ibs=bytesChỉ ra số byte một lần đọc
obs=bytesChỉ ra số byte một lần ghi
skip=blocksBỏ qua bao nhiêu block đầu vào
conv=ConvsChỉ ra tác vụ cụ thể của câu lệnh, các tùy chọn được ghi dưới bảng sau đây

Các tùy chọn của conv

Tùy chọnTác dụng
asciiChuyển đôi từ mã EBCDIC sáng ASCII
ebcdicChuyển đổi từ mã ASCII sang EBCDIC
lcaseChuyển đổi từ chữ thường lên hết thành chữ in hoa
ucaseChuyển đổi từ chữ in hoa sang chữ thường
nocreatKhông tạo ra file đầu ra
noerrorTiếp tục sao chép dữ liệu khi đầu vào bị lỗi
syncĐồng bộ dữ liệu với ổ đang sao chép sang

Lưu ý: Khi bạn định dạng số lượng byte mỗi lần đọc. Mặc định nó được tính theo đơn vị là kb. Bạn có thể thêm một số trường sau để báo định dạng khác:

  • c = 1 byte
  • w = 2 byte
  • b = 512 byte
  • kB = 1000 byte
  • K = 1024 byte
  • MB = 1000000 byte
  • M = (1024 * 1024) byte
  • GB = (1000 * 1000 * 1000) byte
  • G = (1024 * 1024 * 1024) byte

4. Các ví dụ trong hay được sử dụng trong thực tế.

4.1. Sao lưu, phục hồi toàn bộ ổ cứng hoặc phân vùng trong ổ cứng.
  • Sao lưu toàn bộ dữ liệu ổ cứng sao ổ cứng khác:
#dd if=/dev/sda of=/dev/sdb conv=noerror,sync

Câu lệnh này dùng dể sao lưu toàn bộ dữ liệu của ổ sda sang ổ sdb với tùy chọn trong trường conv=noerrom.sync với ý ngĩa vẫn tiếp tục sao lưu nếu dữ liệu đầu vào bị lỗi và tự động đồng bộ với dữ liệu sdb

  • Tạo một file image cho ổ sda1. Các này sẽ nhanh hơn là viêc chuyển dữ liệu sao ổ khác
dd if=/dev/sda1 of=/root/sda1.img 
  • Nếu muốn nén ảnh file anh vào bạn có thể sử dụng command sau
dd if=/dev/sda1 | grip > /root/sda1.img.gz

-Sao lưu dữ liệu từ một phân vùng này đến một phân vùng khác

dd if=/dev/sda2 of=/dev/sdb2 bs=512 conv=noerror,sync

Đối với câu lệnh này bs=512 có ý nghĩa mỗi lần đọc ghi nó đọc và ghi 512 byte

  • Phục hồi dữ liệu

dd if=/root/sda1.img of=/dev/sda1
  • Sao lưu từ đĩa CDroom
dd if=/dev/cdrom of=/root/cdrom.img conv=noerror
4.2. Sao lưu phục hồi MBR.

Việc sao lưu lại mbr là việc làm cần thiết đối với hệ thống linux. nó đề phòng cho việc khi virut có thể nhảy được hẳn vào vùng MBR. Lúc bày bất kì một phần mềm diệt virut nào cũng không diệt được con virut này. Cách hay nhất là cài đặt lại mbr và lúc đó việc sao chép MBR lúc trước khi nhiễm sẽ phát huy tác dụng:

  • Sao chép MBR
dd if=/dev/sda1 of=/root/mbr.txt bs=512 count=1
  • Phục hồi lại MBR
dd if=/root/mbr.txt of=/dev/sda1
4.3. Chuyển đổi chữ thường thành chữ in hoa.
  • Chuyển chữ thường thành chữ in hoa
dd if=/root/test.doc of=/root/test1.doc conv=ucase
  • Chuyển chứ hoa thành chứ thường
dd if=/root/test1.doc of=/test2.doc conv=scase,sycn
4.4. Tạo một file có dung lượng cố định.

Tạo ra một file có kích thước 100M

dd if=/dev/zero of=/root/file1 bs=100M count=1

5. Ví dụ về tình huống áp dụng trong thực tế.

Lệnh dd if=/dev/sda of=/dev/sdX bs=64K conv=noerror,sync có thể sao chép toàn bộ nội dung của ổ đĩa /dev/sda sang ổ đĩa /dev/sdX, bao gồm cả hệ điều hành, dữ liệu, và phân vùng. Điều này có nghĩa là nó sao chép từng byte từ ổ nguồn sang ổ đích, tạo ra một bản sao y hệt của ổ đĩa gốc.

  • if=/dev/sda: Thiết lập ổ đĩa nguồn là /dev/sda.
  • of=/dev/sdX: Thiết lập ổ đĩa đích là /dev/sdX.
  • bs=64K: Thiết lập kích thước khối đọc/ghi là 64KB.
  • conv=noerror,sync:
    • noerror: Tiếp tục quá trình sao chép ngay cả khi gặp lỗi đọc.
    • sync: Điền bằng các byte null khi gặp lỗi để đảm bảo kích thước của bản sao đích.

Một số lưu ý:

  • Sao chép toàn bộ ổ đĩa: Lệnh này sao chép toàn bộ ổ đĩa, bao gồm cả bootloader, bảng phân vùng, và dữ liệu. Vì vậy, ổ đích (/dev/sdX) cần có dung lượng bằng hoặc lớn hơn ổ nguồn (/dev/sda).
  • Phải cẩn thận với ổ đích: Đảm bảo rằng /dev/sdX là đúng ổ đĩa mà bạn muốn sao chép dữ liệu vào, vì lệnh này sẽ ghi đè toàn bộ nội dung của ổ đĩa đích.
  • Không sử dụng trực tiếp trên hệ điều hành đang chạy: Nếu bạn sao chép một ổ đĩa đang được sử dụng bởi hệ điều hành đang chạy, điều này có thể dẫn đến dữ liệu không nhất quán. Tốt nhất là thực hiện việc này từ một môi trường bên ngoài (như một hệ điều hành live hoặc từ một máy tính khác).

Bạn có thể sao chép ổ đĩa qua network từ một máy tính này sang máy khác bằng cách sử dụng dd kết hợp với ssh hoặc netcat.

Sử dụng kết hợpddssh.

Bạn có thể sử dụng dd cùng với ssh để sao chép dữ liệu qua network như sau:

Trên máy nguồn:

dd if=/dev/sda | ssh user@remote_server "dd of=/dev/sdX"
  • if=/dev/sda: Thiết lập ổ đĩa nguồn là /dev/sda.
  • ssh user@remote_server: Kết nối SSH tới máy đích (thay user@remote_server bằng tên đăng nhập và địa chỉ IP hoặc hostname của máy đích).
  • dd of=/dev/sdX: Ghi dữ liệu lên ổ đĩa đích trên máy đích (thay sdX bằng tên thiết bị đích).

Sử dụng kết hợp ddnetcat.

Bạn cũng có thể sử dụng netcat (hoặc nc) để truyền dữ liệu qua network:

Trên máy đích (server nhận):

nc -l -p 12345 | dd of=/dev/sdX
  • nc -l -p 12345: Lắng nghe kết nối từ netcat trên cổng 12345.
  • dd of=/dev/sdX: Ghi dữ liệu vào ổ đĩa đích.

Trên máy nguồn (server gửi):

dd if=/dev/sda | nc remote_server 12345
  • nc remote_server 12345: Kết nối tới máy đích trên cổng 12345.

Lưu ý:

  • Kết nối mạng: Đảm bảo rằng kết nối mạng giữa hai máy tính ổn định để tránh mất dữ liệu.
  • Tốc độ: Tốc độ sao chép sẽ phụ thuộc vào tốc độ mạng giữa hai máy.
  • Đảm bảo quyền: Cả hai lệnh ddssh cần quyền sudo nếu thao tác trên phân vùng hệ thống.
  • Sử dụng gzip để nén: Bạn có thể thêm gzip vào lệnh để nén dữ liệu trước khi truyền qua network, giúp giảm bớt dung lượng và tăng tốc độ truyền.

Ví dụ với ssh và nén:

dd if=/dev/sda | gzip -c | ssh user@remote_server "gzip -d | dd of=/dev/sdX"

Sử dụng gzip cũng có thể áp dụng tương tự với netcat.

Trên máy đích (server nhận), bạn không cần định dạng ổ đĩa trước khi thực hiện sao chép toàn bộ ổ đĩa bằng lệnh dd. Lệnh dd sao chép dữ liệu raw từ ổ đĩa nguồn sang ổ đĩa đích, bao gồm cả bảng phân vùng, hệ điều hành và dữ liệu. Do đó, nếu bạn định dạng ổ đĩa đích trước, việc này sẽ bị ghi đè bởi dữ liệu từ lệnh dd.

Nén và tạo image.

Bạn có thể sử dụng dd để tạo một image của toàn bộ ổ đĩa hoặc phân vùng và nén nó lại thành một file .img hoặc .img.gz. Sau đó, bạn có thể bung image này ra trên một hệ thống khác hoặc ổ đĩa khác. Quá trình này thường được sử dụng để sao lưu hoặc nhân bản hệ thống.

Tạo Image Nén với ddgzip

Dưới đây là các bước để tạo một image nén của ổ đĩa:

Tạo Image và Nén Bằng gzip:

sudo dd if=/dev/sdX bs=64K | gzip > /path/to/backup.img.gz
  • if=/dev/sdX: Thay /dev/sdX bằng thiết bị ổ đĩa hoặc phân vùng bạn muốn sao lưu.
  • bs=64K: Kích thước block; bạn có thể thay đổi giá trị này để tối ưu hiệu suất.
  • gzip > /path/to/backup.img.gz: Nén image và lưu vào đường dẫn chỉ định.

Bung Image Nén Sang Ổ Đĩa Khác:

gzip -dc /path/to/backup.img.gz | sudo dd of=/dev/sdY bs=64K
  • gzip -dc: Giải nén image.
  • of=/dev/sdY: Thay /dev/sdY bằng thiết bị ổ đĩa hoặc phân vùng đích.

Tạo Image Nén với ddxz (Tùy chọn).

xz là một công cụ nén khác, cung cấp mức độ nén cao hơn:

Tạo Image và Nén Bằng xz:

sudo dd if=/dev/sdX bs=64K | xz -z > /path/to/backup.img.xz

Bung Image Nén Sang Ổ Đĩa Khác:

xz -dc /path/to/backup.img.xz | sudo dd of=/dev/sdY bs=64K

Lưu ý

  • Đảm bảo rằng ổ đĩa đích (/dev/sdY) có dung lượng đủ lớn để chứa dữ liệu được bung ra.
  • Quá trình tạo và bung image có thể mất nhiều thời gian, tùy thuộc vào kích thước của ổ đĩa và tốc độ nén/giải nén.

Sử dụng phương pháp này cho phép bạn sao lưu và khôi phục hệ thống một cách hiệu quả, đặc biệt là khi bạn muốn giảm kích thước của image lưu trữ.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories