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=Bytes | Quá trình đọc (ghi) bao nhiêu byte một lần đọc (ghi) |
cbs=Bytes | Chuyển đổi bao nhiêu byte một lần |
count=Blocks | thực hiện bao nhiêu Block trong quá trình thực thi câu lệnh |
if | Chỉ đường dẫn đọc đầu vào |
of | Chỉ đường dẫn ghi đầu ra |
ibs=bytes | Chỉ ra số byte một lần đọc |
obs=bytes | Chỉ ra số byte một lần ghi |
skip=blocks | Bỏ qua bao nhiêu block đầu vào |
conv=Convs | Chỉ 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ọn | Tác dụng |
---|---|
ascii | Chuyển đôi từ mã EBCDIC sáng ASCII |
ebcdic | Chuyển đổi từ mã ASCII sang EBCDIC |
lcase | Chuyển đổi từ chữ thường lên hết thành chữ in hoa |
ucase | Chuyển đổi từ chữ in hoa sang chữ thường |
nocreat | Không tạo ra file đầu ra |
noerror | Tiế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ợpdd
và ssh
.
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 (thayuser@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 (thaysdX
bằng tên thiết bị đích).
Sử dụng kết hợp dd
và netcat
.
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
dd
vàssh
cần quyềnsudo
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êmgzip
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 dd
và gzip
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 dd
và xz
(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ữ.