Chào mừng bạn đến với thế giới quản trị hệ thống Linux, nơi có những công cụ mạnh mẽ nhưng cũng đầy tiềm ẩn rủi ro. Một trong những công cụ như vậy là lệnh dd. Đối với nhiều quản trị viên hệ thống, dd là một “con dao hai lưỡi”: cực kỳ hữu ích khi dùng đúng cách, nhưng cũng có thể gây ra thảm họa mất dữ liệu chỉ với một sai sót nhỏ. Chắc hẳn bạn đã từng gặp khó khăn khi cần sao chép toàn bộ một ổ cứng, tạo một bản sao lưu hoàn hảo, hoặc khôi phục một phân vùng hệ thống? Các phương pháp sao chép thông thường đôi khi không hiệu quả, chậm chạp hoặc không thể sao chép được các dữ liệu ở cấp độ thấp.
Lệnh dd (disk duplicator) chính là giải pháp cho những vấn đề này. Nó là một tiện ích dòng lệnh mạnh mẽ, cho phép sao chép và chuyển đổi dữ liệu ở mức độ bit-by-bit. Điều này làm cho nó trở thành công cụ không thể thiếu để sao lưu, phục hồi và nhân bản ổ đĩa. Trong bài viết này, chúng ta sẽ cùng nhau khám phá lệnh dd một cách chi tiết, từ cú pháp cơ bản đến các ví dụ thực tế, giúp bạn tự tin làm chủ công cụ này một cách an toàn và hiệu quả.

Công dụng cơ bản của lệnh dd
Lệnh dd là một trong những công cụ dòng lệnh nguyên thủy và linh hoạt nhất trong các hệ thống Unix-like, bao gồm cả Linux là gì. Sức mạnh của nó nằm ở khả năng xử lý dữ liệu ở cấp độ rất thấp, không quan tâm đến hệ thống tập tin hay cấu trúc dữ liệu.
Lệnh dd dùng để làm gì?
Về cơ bản, dd đọc dữ liệu từ một nguồn đầu vào (input) và ghi nó vào một nguồn đầu ra (output). Nhờ triết lý đơn giản này, nó có thể thực hiện nhiều tác vụ quan trọng:
- Sao chép và nhân bản ổ đĩa: Bạn có thể sao chép toàn bộ một ổ cứng sang một ổ cứng khác, tạo ra một bản sao hoàn hảo. Đây là công việc cực kỳ hữu ích khi bạn cần nâng cấp ổ cứng mà không muốn cài đặt lại hệ điều hành.
- Tạo và phục hồi ảnh đĩa (Disk Image): Lệnh dd cho phép bạn tạo một tệp tin duy nhất chứa toàn bộ nội dung của một ổ đĩa hoặc phân vùng. Tệp ảnh này sau đó có thể được lưu trữ để sao lưu hoặc dùng để phục hồi lại trạng thái hệ thống khi cần.
- Sao lưu MBR (Master Boot Record): Bạn có thể sao lưu và phục hồi 512 byte đầu tiên của ổ cứng, nơi chứa thông tin khởi động quan trọng.
- Tạo tệp tin với kích thước cố định:
ddcó thể được dùng để tạo nhanh các tệp tin lớn dùng cho việc kiểm thử hoặc làm swap file. - Xóa an toàn dữ liệu: Bằng cách ghi dữ liệu ngẫu nhiên hoặc toàn số không lên ổ đĩa,
ddcó thể giúp xóa sạch dữ liệu một cách an toàn, khiến chúng không thể phục hồi.

Các thao tác cơ bản với lệnh dd
Để bắt đầu, bạn cần làm quen với cú pháp chung của lệnh dd. Nó có thể trông hơi khác biệt so với các lệnh Linux khác, nhưng lại rất logic. Cú pháp cơ bản nhất là:dd if=<nguồn_đầu_vào> of=<đích_đầu_ra> [tùy_chọn]
Trong đó:
if(input file): Chỉ định tệp tin hoặc thiết bị nguồn mà bạn muốn đọc dữ liệu từ đó.of(output file): Chỉ định tệp tin hoặc thiết bị đích mà bạn muốn ghi dữ liệu vào.
Hãy xem một ví dụ cực kỳ đơn giản. Giả sử chúng ta muốn tạo một bản sao của tệp document.txt thành document_backup.txt. Lệnh sẽ là:dd if=document.txt of=document_backup.txt
Lệnh này đọc nội dung từ document.txt và ghi nó vào document_backup.txt. Nếu tệp đích chưa tồn tại, nó sẽ được tạo. Nếu đã tồn tại, nó sẽ bị ghi đè mà không có bất kỳ cảnh báo nào. Đây chính là điểm bạn cần hết sức lưu ý khi sử dụng dd.
Hướng dẫn sử dụng lệnh dd để sao chép dữ liệu
Sau khi nắm được cú pháp cơ bản, chúng ta sẽ đi vào các ứng dụng thực tế và mạnh mẽ hơn của lệnh dd, bắt đầu với việc sao chép dữ liệu và tạo bản sao lưu. Đây là những tác vụ phổ biến nhất mà các quản trị viên hệ thống thường xuyên thực hiện.
Sao chép tập tin hoặc phân vùng đơn giản
Như đã thấy ở ví dụ trên, việc sao chép một tập tin rất đơn giản. Bây giờ, hãy nâng cấp lên một chút bằng cách sao chép toàn bộ một phân vùng. Trước tiên, bạn cần xác định tên các phân vùng bằng lệnh lsblk hoặc fdisk -l.
Giả sử bạn có một phân vùng /dev/sda1 và muốn sao chép toàn bộ nội dung của nó sang phân vùng /dev/sdb1 (giả sử /dev/sdb1 có dung lượng bằng hoặc lớn hơn). Lệnh sẽ là:sudo dd if=/dev/sda1 of=/dev/sdb1
if=/dev/sda1: Đây là nguồn đầu vào. Lệnhddsẽ đọc toàn bộ dữ liệu từ phân vùng đầu tiên của ổ đĩasda.of=/dev/sdb1: Đây là đích đầu ra. Toàn bộ dữ liệu đọc được sẽ được ghi trực tiếp lên phân vùng đầu tiên của ổ đĩasdb.
Cảnh báo: Lệnh này sẽ xóa toàn bộ dữ liệu hiện có trên /dev/sdb1. Hãy chắc chắn rằng bạn đã chọn đúng thiết bị đích và không còn dữ liệu quan trọng trên đó.

Tạo ảnh đĩa và sao lưu bằng lệnh dd
Một trong những tính năng mạnh mẽ nhất của dd là khả năng tạo ra một tệp ảnh (image) của một phân vùng hoặc toàn bộ ổ đĩa. Tệp ảnh này là một bản sao chính xác, bit-by-bit, và có thể được lưu trữ ở bất cứ đâu để sao lưu.
Để tạo một tệp ảnh của ổ đĩa /dev/sda và lưu vào thư mục /backup với tên sda_backup.img, bạn sử dụng lệnh sau:sudo dd if=/dev/sda of=/backup/sda_backup.img
Trong quá trình này, bạn có thể tối ưu tốc độ sao chép bằng cách sử dụng tham số bs (block size). Tham số này xác định dung lượng dữ liệu được đọc và ghi trong mỗi lần. Một block size lớn hơn thường giúp tăng tốc độ sao chép. Ví dụ, để sử dụng block size là 4MB:sudo dd if=/dev/sda of=/backup/sda_backup.img bs=4M
Lưu ý quan trọng:
- Thiết bị đầu vào (if): Phải là thiết bị bạn muốn sao lưu (ví dụ:
/dev/sda,/dev/sdb1). Hãy chắc chắn rằng thiết bị này không đang được hệ điều hành sử dụng tích cực để tránh 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 hệ điều hành live (Live USB/CD) như WSL là gì. - Thiết bị đầu ra (of): Phải là một tệp tin nằm trên một hệ thống lưu trữ có đủ dung lượng trống. Dung lượng yêu cầu sẽ bằng với dung lượng của toàn bộ ổ đĩa hoặc phân vùng nguồn.

Phục hồi dữ liệu từ bản sao lưu với dd
Sau khi đã tạo thành công một bản sao lưu dưới dạng tệp ảnh, bước tiếp theo và cũng không kém phần quan trọng là biết cách phục hồi nó. Lệnh dd cho phép bạn ghi tệp ảnh trở lại một thiết bị vật lý, khôi phục hệ thống về đúng trạng thái tại thời điểm sao lưu.
Cách phục hồi ảnh đĩa về thiết bị gốc
Quá trình phục hồi thực chất là đảo ngược quá trình sao lưu. Bạn sẽ chỉ định tệp ảnh làm nguồn đầu vào (if) và thiết bị vật lý (ổ đĩa hoặc phân vùng) làm đích đầu ra (of).
Giả sử bạn muốn phục hồi tệp sda_backup.img vào ổ đĩa /dev/sda. Lệnh sẽ như sau:sudo dd if=/backup/sda_backup.img of=/dev/sda
Cảnh báo cực kỳ quan trọng: Lệnh này sẽ xóa sạch toàn bộ dữ liệu trên /dev/sda và thay thế bằng nội dung của tệp ảnh. Không có cách nào để hoàn tác hành động này. Trước khi nhấn Enter, hãy kiểm tra lại ít nhất ba lần để chắc chắn rằng of=/dev/sda là chính xác thiết bị bạn muốn phục hồi. Ghi nhầm vào một ổ đĩa chứa dữ liệu quan trọng sẽ dẫn đến mất mát vĩnh viễn.
Để tăng tốc độ phục hồi, bạn cũng có thể sử dụng tham số bs tương tự như khi sao lưu:sudo dd if=/backup/sda_backup.img of=/dev/sda bs=4M
Hãy luôn đảm bảo rằng thiết bị đích có dung lượng bằng hoặc lớn hơn dung lượng của ổ đĩa gốc khi bạn tạo bản sao lưu.
Xử lý lỗi phổ biến khi phục hồi
Quá trình phục hồi có thể gặp một số lỗi. Một trong những vấn đề thường gặp là các khối (block) bị lỗi trên tệp ảnh hoặc trên thiết bị đích. Mặc định, dd sẽ dừng lại khi gặp lỗi đọc. Để dd tiếp tục dù có lỗi, bạn có thể dùng tham số conv=noerror,sync.sudo dd if=/backup/sda_backup.img of=/dev/sda bs=4M conv=noerror,sync
noerror: Lệnh dd sẽ không dừng lại khi gặp lỗi đọc ở nguồn.sync: Lấp đầy các khối đầu ra bằng byte rỗng (null bytes) nếu có lỗi đọc, giữ cho dữ liệu được đồng bộ.
Một lỗi phổ biến khác là ghi sai thiết bị. Cách tốt nhất để khắc phục là phòng ngừa: luôn dùng lệnh lsblk để xác nhận tên và kích thước của tất cả các thiết bị lưu trữ trước khi chạy lệnh dd. Sự cẩn thận ở bước này sẽ cứu bạn khỏi những giờ phút đau đầu sau này.

Các tùy chọn và tham số phổ biến của lệnh dd
Để thực sự làm chủ dd, bạn cần hiểu rõ các tùy chọn và tham số của nó. Chúng cho phép bạn kiểm soát quá trình sao chép một cách linh hoạt và hiệu quả hơn. Dưới đây là những tham số quan trọng nhất bạn nên biết.
Tùy chọn if, of, bs, count, skip, seek
Chúng ta đã làm quen với if và of. Hãy tìm hiểu sâu hơn về các tham số còn lại:
bs=<bytes>(Block Size): Đây là tham số quan trọng ảnh hưởng lớn đến hiệu suất. Nó quy định kích thước của mỗi khối dữ liệu được đọc và ghi. Giá trịbs=4M(4 Megabytes) hoặcbs=1Mthường cho tốc độ tốt khi làm việc với ổ đĩa. Nếu không chỉ định,ddsẽ dùng giá trị mặc định rất nhỏ (512 bytes), khiến quá trình sao chép rất chậm.count=<số_khối>: Tham số này yêu cầuddchỉ sao chép một số lượng khối nhất định. Ví dụ, nếu bạn muốn sao chép 100MB đầu tiên của ổ đĩa/dev/sdavới block size là 1M, bạn sẽ dùng:dd if=/dev/sda of=first_100mb.img bs=1M count=100.skip=<số_khối>: Bỏ qua một số lượng khối nhất định ở đầu vào trước khi bắt đầu đọc. Ví dụ, để bỏ qua 512MB đầu tiên và bắt đầu đọc từ đó:dd if=/dev/sda of=data.img bs=1M skip=512.seek=<số_khối>: Bỏ qua một số lượng khối nhất định ở đầu ra trước khi bắt đầu ghi. Điều này hữu ích khi bạn muốn ghi dữ liệu vào một vị trí cụ thể trong tệp hoặc thiết bị đích mà không ghi đè phần đầu.
Tham số kiểm soát an toàn và báo cáo tiến trình
Một trong những nhược điểm của dd phiên bản cũ là nó chạy một cách “im lặng”, không hiển thị bất kỳ thông tin tiến trình nào cho đến khi hoàn thành. Điều này có thể gây lo lắng khi sao chép các ổ đĩa lớn. May mắn thay, các phiên bản gần đây đã bổ sung tham số status=progress.
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress
Khi sử dụng status=progress, dd sẽ liên tục cập nhật số lượng dữ liệu đã sao chép, thời gian đã trôi qua và tốc độ truyền tải hiện tại. Đây là một tính năng cực kỳ hữu ích mà bạn nên sử dụng mỗi khi chạy dd.
Tham số conv (convert) cũng rất quan trọng để kiểm soát quá trình chuyển đổi và xử lý lỗi.
conv=noerror,sync: Như đã đề cập, nó giúpddtiếp tục chạy khi gặp lỗi đọc và giữ cấu trúc dữ liệu đồng bộ.conv=fsync: Buộc ghi dữ liệu vào đĩa vật lý thay vì chỉ lưu vào bộ đệm (cache), đảm bảo dữ liệu được ghi an toàn ngay lập tức.
Việc kết hợp các tham số này một cách thông minh sẽ giúp bạn thực hiện các tác vụ phức tạp một cách chính xác và an toàn hơn.

Ví dụ minh họa thực tế sử dụng lệnh dd
Lý thuyết là quan trọng, nhưng thực hành mới giúp bạn thực sự hiểu rõ sức mạnh của dd. Dưới đây là một số kịch bản thực tế mà bạn có thể áp dụng.
- Sao chép toàn bộ ổ cứng sang ổ khác (nhân bản đĩa):
Đây là trường hợp bạn muốn nâng cấp từ ổ HDD cũ (/dev/sda) sang ổ SSD mới (/dev/sdb). Lệnh này sẽ tạo một bản sao 1:1.sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress
Sau khi hoàn tất, ổ/dev/sdbsẽ là một bản sao y hệt của/dev/sda, bao gồm cả hệ điều hành, phân vùng và dữ liệu. - Tạo ảnh ISO từ đĩa CD/DVD:
Nếu bạn có một đĩa CD hoặc DVD và muốn tạo một tệp tin ISO để lưu trữ trên máy tính,ddcó thể làm điều đó một cách dễ dàng.sudo dd if=/dev/cdrom of=~/my_disk_image.iso
Ở đây,/dev/cdromlà đường dẫn đến ổ đĩa quang của bạn. - Khôi phục USB boot bằng file ảnh:
Giả sử bạn đã tải về một tệp ảnh.imghoặc.isocủa một hệ điều hành (ví dụ: Ubuntu) và muốn tạo một USB có khả năng khởi động.sudo dd if=~/Downloads/ubuntu-22.04.img of=/dev/sdc bs=4M status=progress
Lưu ý: Hãy chắc chắn/dev/sdclà USB của bạn. Lệnh này sẽ xóa toàn bộ dữ liệu trên USB. - Xóa sạch dữ liệu trên một ổ đĩa:
Để xóa dữ liệu một cách an toàn, bạn có thể ghi đè toàn bộ ổ đĩa bằng các số không.sudo dd if=/dev/zero of=/dev/sdx bs=4M status=progress
Hoặc để an toàn hơn, ghi đè bằng dữ liệu ngẫu nhiên:sudo dd if=/dev/urandom of=/dev/sdx bs=4M status=progress
Quá trình này sẽ mất rất nhiều thời gian nhưng đảm bảo dữ liệu cũ không thể phục hồi.

Lưu ý và cảnh báo khi sử dụng lệnh dd
Sức mạnh của dd đi kèm với trách nhiệm lớn. Một sai lầm nhỏ có thể dẫn đến hậu quả nghiêm trọng. Vì vậy, việc nắm rõ những rủi ro và cách phòng tránh là vô cùng quan trọng.
Nguy cơ mất dữ liệu nếu chọn sai thiết bị đích
Đây là cảnh báo quan trọng nhất khi sử dụng dd. Lệnh dd không có cơ chế “undo” hay “thùng rác”. Nó không hỏi bạn “Bạn có chắc không?”. Khi bạn thực thi lệnh, nó sẽ ghi đè lên thiết bị đích (of) ngay lập tức. Nếu bạn vô tình chỉ định sai ổ đĩa đích, ví dụ như ổ chứa dữ liệu quan trọng thay vì ổ trống, toàn bộ dữ liệu trên đó sẽ bị ghi đè và mất vĩnh viễn.
Cách phòng tránh:
- Kiểm tra kỹ: Trước khi chạy bất kỳ lệnh
ddnào để ghi dữ liệu, hãy sử dụng lệnhlsblkhoặcsudo fdisk -lđể xem danh sách tất cả các ổ đĩa và phân vùng. - Xác nhận tên thiết bị: Hãy chắc chắn bạn biết chính xác tên của thiết bị nguồn và đích (ví dụ:
/dev/sda,/dev/sdb). - Rút các thiết bị không cần thiết: Nếu có thể, hãy rút các ổ cứng ngoài hoặc USB không liên quan ra khỏi máy tính để giảm thiểu nguy cơ chọn nhầm.
- Đọc lại lệnh: Đọc lại toàn bộ lệnh của bạn một lần cuối trước khi nhấn Enter. Kiểm tra kỹ
if=vàof=.

Thời gian thực thi lâu và cách theo dõi tiến trình
Việc sao chép hàng trăm Gigabyte hoặc thậm chí Terabyte dữ liệu sẽ mất rất nhiều thời gian, có thể là vài giờ đồng hồ. Trong suốt thời gian này, dd mặc định không hiển thị bất kỳ thông tin gì, khiến bạn có cảm giác như máy tính bị treo.
Cách giải quyết:
- Luôn dùng
status=progress: Như đã đề cập, tham số này là “cứu cánh” của bạn. Nó cung cấp thông tin cập nhật liên tục về quá trình sao chép, giúp bạn biết được lệnh vẫn đang chạy và ước tính được thời gian hoàn thành. - Tối ưu
bs(block size): Chọn một giá trịbshợp lý (ví dụ:4Mhoặc8M) có thể cải thiện đáng kể tốc độ truyền dữ liệu và giảm thời gian chờ đợi. - Kiên nhẫn: Hãy chuẩn bị tinh thần rằng quá trình này sẽ mất thời gian. Đừng vội vàng hủy bỏ lệnh giữa chừng trừ khi bạn chắc chắn có vấn đề, vì điều này có thể làm hỏng dữ liệu trên thiết bị đích.
Cuối cùng, một lời khuyên vàng: hãy luôn sao lưu các dữ liệu cực kỳ quan trọng bằng một phương pháp khác trước khi thực hiện các thao tác cấp thấp với dd trên các ổ đĩa chứa chúng.
Lời khuyên và cách sử dụng hiệu quả lệnh dd
Để trở thành một người dùng dd thông thái, hãy tuân thủ những nguyên tắc và lời khuyên sau đây. Chúng sẽ giúp bạn tận dụng tối đa sức mạnh của công cụ này đồng thời giảm thiểu rủi ro.
- Luôn sao lưu dữ liệu quan trọng trước khi dùng dd: Đây là quy tắc số một. Mặc dù bạn dùng
ddđể sao lưu, nhưng nếu bạn đang thao tác trên các ổ đĩa chứa dữ liệu, một bản sao lưu bổ sung của các tệp tin quan trọng nhất sẽ là tấm lưới an toàn của bạn. - Sử dụng tham số block size (
bs) phù hợp: Đối với các tác vụ sao chép ổ đĩa lớn,bs=4Mhoặcbs=8Mthường mang lại hiệu suất tốt. Việc chọnbsquá nhỏ sẽ làm chậm quá trình, trong khibsquá lớn có thể không mang lại lợi ích thêm và tốn nhiều bộ nhớ hơn. - Tránh chạy lệnh bằng quyền root không chắc chắn: Hãy kiểm tra lại lệnh của bạn hai, ba lần trước khi nhấn Enter. Một lỗi đánh máy trong tên thiết bị có thể phá hủy hoàn toàn hệ thống của bạn.
- Kết hợp dd với các công cụ khác để nâng cao hiệu quả: Bạn có thể nén ảnh đĩa ngay trong lúc tạo để tiết kiệm dung lượng. Ví dụ, sử dụng
gzip:sudo dd if=/dev/sda bs=4M | gzip > /backup/sda_backup.img.gz
Để phục hồi từ ảnh nén này:gunzip -c /backup/sda_backup.img.gz | sudo dd of=/dev/sda - Thường xuyên kiểm tra tình trạng thiết bị và bản sao lưu: Sau khi tạo ảnh đĩa, hãy kiểm tra checksum (ví dụ: md5sum, sha256sum) của nó. Thỉnh thoảng, hãy thử phục hồi bản sao lưu vào một ổ đĩa trống hoặc máy ảo như VirtualBox là gì để đảm bảo nó hoạt động tốt khi bạn thực sự cần đến.

Kết luận
Lệnh dd trong Linux là một công cụ cực kỳ mạnh mẽ và linh hoạt. Từ việc nhân bản toàn bộ ổ cứng, tạo các bản sao lưu hoàn hảo, đến việc xóa dữ liệu an toàn, dd đều có thể xử lý một cách hiệu quả ở cấp độ thấp nhất. Tuy nhiên, sức mạnh lớn luôn đi kèm với trách nhiệm cao. Sự thiếu cẩn trọng khi sử dụng dd có thể dẫn đến mất dữ liệu không thể phục hồi.
Qua bài viết này, AZWEB hy vọng bạn đã có một cái nhìn toàn diện về dd, từ công dụng, cú pháp, các tham số quan trọng cho đến những cảnh báo cần thiết. Chìa khóa để làm chủ dd không nằm ở việc ghi nhớ mọi tùy chọn, mà là ở việc xây dựng thói quen cẩn thận: luôn kiểm tra kỹ lưỡng thiết bị nguồn và đích, sử dụng status=progress để theo dõi, và hiểu rõ hậu quả của mỗi lệnh bạn gõ.
Chúng tôi khuyến khích bạn hãy bắt đầu thực hành với các thiết bị không quan trọng như USB cũ hoặc máy ảo để làm quen. Khi bạn đã tự tin, dd sẽ trở thành một trợ thủ đắc lực trong bộ công cụ quản trị hệ thống của bạn. Nếu bạn có bất kỳ thắc mắc nào hoặc muốn chia sẻ kinh nghiệm của mình với lệnh dd, đừng ngần ngại để lại bình luận bên dưới nhé.