Giải thích lệnh dd của Linux cho người mới bắt đầu (8 ví dụ)

theanh

Administrator
Nhân viên
Lệnh dd là một tiện ích mạnh mẽ được sử dụng để sao chép và chuyển đổi dữ liệu cấp thấp trên các hệ thống Linux. Nó là viết tắt của "data duplicator" và thường được sử dụng để tạo các bản sao chính xác của các tệp, phân vùng hoặc toàn bộ đĩa, giúp ích cho các tác vụ như tạo bản sao lưu, sao chép ổ đĩa hoặc ghi hình ảnh đĩa vào phương tiện vật lý. Lệnh này có thể sao chép và chuyển đổi dữ liệu giữa các tệp hoặc thiết bị, với các tùy chọn để kiểm soát kích thước khối, bỏ qua hoặc tìm kiếm dữ liệu và thậm chí áp dụng các bộ lọc như nén hoặc hoán đổi byte. Do khả năng hoạt động ở cấp độ cơ bản như vậy, dd phải được sử dụng một cách thận trọng, vì sử dụng không đúng cách có thể dẫn đến mất hoặc hỏng dữ liệu.

Trong hướng dẫn này, chúng ta sẽ thảo luận về cách công cụ này hoạt động bằng một số ví dụ dễ hiểu. Nhưng trước khi làm điều đó, cần đề cập rằng tất cả các ví dụ được đề cập ở đây đều đã được thử nghiệm trên Ubuntu 24.04.

Lệnh dd của Linux​

Nói tóm lại, lệnh dd cho phép bạn sao chép và chuyển đổi tệp. Công cụ này cung cấp một số toán hạng mà bạn có thể sử dụng để chỉ định loại định dạng bạn muốn. Sau đây là cú pháp chung của lệnh như được mô tả trên trang hướng dẫn của lệnh:
Mã:
dd [OPERAND]...
dd OPTION

Tạo ổ USB có thể khởi động từ tệp ISO bằng lệnh dd​

Một cách sử dụng phổ biến của lệnh dd trong Linux là tạo ổ USB có thể khởi động từ tệp ISO. Điều này thường được thực hiện khi chuẩn bị ổ USB để cài đặt hệ điều hành. Lệnh sẽ trông giống như thế này:
Mã:
sudo dd if=/path/to/your.iso of=/dev/sdX bs=4M status=progress && sync
Trong ví dụ này:
  • if=/path/to/your.iso chỉ định tệp đầu vào là ảnh ISO.
  • of=/dev/sdX chỉ định tệp đầu ra là ổ USB (thay thế X bằng chữ cái phù hợp với thiết bị USB của bạn).
  • bs=4M đặt kích thước khối thành 4 megabyte, tối ưu hóa quy trình sao chép.
  • status=progress cung cấp các bản cập nhật theo thời gian thực về tiến trình sao chép.
  • sync đảm bảo rằng tất cả dữ liệu được ghi vào USB trước khi quá trình hoàn tất.
Lệnh này sẽ tạo ổ USB có thể khởi động được, có thể được sử dụng để cài đặt hệ điều hành có trong tệp ISO.

Câu hỏi thường gặp​

Các ví dụ dạng Hỏi & Đáp sau đây sẽ giúp bạn hiểu rõ hơn về cách lệnh dd hoạt động.

Câu hỏi 1. Làm thế nào để thay đổi chữ hoa chữ thường của văn bản đầu vào bằng lệnh dd?​

Giả sử bạn có một số dòng văn bản được viết bằng chữ thường và yêu cầu là chuyển đổi chúng sang chữ hoa một cách nhanh chóng. Bạn có thể sử dụng tùy chọn dòng lệnh conv (với ucase làm giá trị của nó).

Sau đây là một ví dụ:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22325%22%20height=%2254%22%3E%3C/svg%3E


Ảnh chụp màn hình ở trên hiển thị lệnh cũng như văn bản đầu vào. Tổ hợp phím Ctrl+d được sử dụng để báo cho dd biết rằng chúng ta đã nhập xong dữ liệu đầu vào và ngay sau khi nhập xong, lệnh sẽ tạo ra kết quả đầu ra sau:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22329%22%20height=%22108%22%3E%3C/svg%3E


Vì vậy, bạn có thể thấy rằng văn bản đầu vào đã được chuyển đổi từ chữ thường sang chữ hoa. Ba dòng cuối chỉ là một số số liệu thống kê liên quan đến hoạt động.

Lưu ý: Tương tự, bạn có thể sử dụng giá trị lcase để chuyển đổi văn bản viết hoa thành chữ thường.

Câu hỏi 2. Làm thế nào để đọc và ghi vào tệp thay thế?​

Chúng tôi đã nhập văn bản thông qua stdin (đầu vào chuẩn) trong ví dụ đầu tiên ở trên. Tuy nhiên, bạn luôn có thể sử dụng tệp đầu vào và đầu ra. Để chỉ định tên của tệp đầu vào và đầu ra, hãy sử dụng các tùy chọn dòng lệnh ifof.

Ví dụ, nếu bạn muốn chuyển đổi chữ hoa và chữ thường của văn bản trong tệp1 rồi viết trong tệp2, thì bạn có thể thực hiện theo cách sau:
Mã:
dd if=file1 of=file2 conv=ucase

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22147%22%3E%3C/svg%3E

Câu hỏi 3. Làm thế nào để bỏ qua văn bản khi đọc đầu vào?​

Nếu muốn, bạn có thể yêu cầu dd bỏ qua một số byte đầu tiên trong khi đọc văn bản đầu vào. Bạn có thể thực hiện việc này bằng tùy chọn skip, tùy chọn này yêu cầu một giá trị số. Nếu giá trị này là 'N', thì dd sẽ bỏ qua N khối có kích thước ibs khi bắt đầu nhập. Điều này đưa chúng ta đến 'ibs', một tùy chọn dd dòng lệnh khác có giá trị chỉ định số byte mà công cụ đọc tại một thời điểm (mặc định là 512).

Vì vậy,, giả sử bạn muốn bỏ qua 4 byte đầu tiên của tệp đầu vào. Trước tiên, bạn nên đặt thành 4 rồi sử dụng 1 làm giá trị bỏ qua. Điều này sẽ đảm bảo rằng công cụ bỏ qua1 khối gồm 4 byte khi đọc tệp đầu vào.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%2282%22%3E%3C/svg%3E


Vì vậy, bạn có thể thấy rằng văn bản này, đã bị bỏ qua khi đọc tệp 1 - đó là lý do tại sao nó không xuất hiện trong tệp 2.

Câu hỏi 4. Làm thế nào để hoán đổi từng cặp byte đầu vào trong đầu ra?​

Bạn cũng có thể sử dụng dd để hoán đổi mọi cặp byte đầu vào nếu có yêu cầu như vậy. Có thể thực hiện điều này bằng cách sử dụng swab làm giá trị cho tùy chọn dòng lệnh conv. Ảnh chụp màn hình sau đây sẽ làm rõ hơn:




data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22101%22%3E%3C/svg%3E



Câu hỏi 5. Làm thế nào để lệnh dd chỉ hoạt động khi tệp đầu ra chưa tồn tại?​

Nếu yêu cầu là lệnh ddkhông được thực hiện bất kỳ thao tác nào khi tệp đầu ra đã tồn tại, thì giá trị excl cho tùy chọn convcó thểthực thi điều kiện này.

Ảnh chụp màn hình sau đây cho thấy trường hợp sử dụng đang diễn ra:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%2236%22%3E%3C/svg%3E

Câu hỏi 6. Làm thế nào để đảm bảo tệp đầu ra được cập nhật ở chế độ thêm vào?​

Theo mặc định, dd chỉ ghi đè lên tệp đầu ra (nếu có). Nhưng nếu bạn muốn nó thêm văn bản thay thế, hãy sử dụng giá trị append cho oflag FLAG và notrunc cho tùy chọn conv.

Ví dụ:
Mã:
dd if=file1 of=file3 oflag=append conv=notrunc
Đây là lệnh trên đang hoạt động:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%22218%22%3E%3C/svg%3E

Câu hỏi 7. Làm thế nào để lệnh dd không tạo tệp đầu ra?​

Nếu muốn, bạn cũng có thể buộc lệnh dd không tạo tệp đầu ra nếu tệp được cung cấp trong lệnh chưa tồn tại. Bạn có thể thực hiện việc này bằng cách sử dụng giá trị nocreat của tùy chọn dòng lệnh conv.

Ví dụ:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22500%22%20height=%2232%22%3E%3C/svg%3E



Câu hỏi 8. Làm thế nào để kiểm soát mức độ thông tin được in trên stderr?​

Nếu muốn, bạn cũng có thể giới hạn lượng thông tin mà lệnh in trên stderr. Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh status. Ví dụ, nếu bạn muốn ẩn mọi thứ trừ thông báo lỗi, bạn có thể truyền giá trị none cho tùy chọn dòng lệnh này:
Mã:
dd if=file1 of=file3 status=none
Các giá trị khả dụng khác là noxferprogress. Đây là những gì trang hướng dẫn nói về tùy chọn status:
Mã:
status=LEVEL
 The LEVEL of information to print to stderr; 'none' suppresses
 everything but error messages, 'noxfer' suppresses the final
 transfer statistics, 'progress' shows periodic transfer statis?
 tics

Kết luận​

Các ví dụ được thảo luận trong hướng dẫn này chỉ là những nét cơ bản khi khám phá tất cả những gì lệnh dd có thể làm. Chỉ để bạn có ý tưởng, bạn có thể sử dụng công cụ này để tạo hệ thống tệp ảo và bản sao lưu ổ cứng hoặc phân vùng hệ thống. Để biết thêm thông tin về dd, hãy truy cập trang hướng dẫn của lệnh này.
 
Back
Bên trên