Vietnamese (machine translation)

Lưu ý

Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.

Bản gốc:

initramfs buffer format

Người dịch:

Google Translate (machine translation)

Phiên bản gốc:

8541d8f725c6

Cảnh báo

Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.

định dạng bộ đệm initramfs

Al Viro, H. Peter Anvin

Với kernel 2.5.x, giao thức “ramdisk ban đầu” cũ đã được bổ sung với giao thức “ramfs ban đầu”. Nội dung initramfs được thông qua sử dụng cùng một giao thức bộ nhớ đệm được sử dụng bởi initrd, nhưng nội dung là khác nhau. Bộ đệm initramfs chứa một kho lưu trữ mở rộng thành hệ thống tập tin ramfs; tài liệu này trình bày chi tiết về initramfs định dạng bộ đệm.

Định dạng bộ đệm initramfs dựa trên “newc” hoặc “crc” CPIO và có thể được tạo bằng tiện ích cpio(1). CPIO kho lưu trữ có thể được nén bằng gzip(1) hoặc bất kỳ thuật toán nào khác được cung cấp thông qua CONFIG_DECOMPRESS_*. Một phiên bản hợp lệ của bộ đệm initramfs là do đó chỉ có một tệp .cpio.gz.

Định dạng đầy đủ của bộ đệm initramfs được xác định như sau ngữ pháp, trong đó:

* được sử dụng để biểu thị "0 hoặc nhiều lần xuất hiện của"

(|) chỉ ra các lựa chọn thay thế + biểu thị sự nối GZIP() biểu thị nén gzip của toán hạng BZIP2() biểu thị nén bzip2 của toán hạng LZMA() biểu thị nén lzma của toán hạng XX() biểu thị nén xz của toán hạng LZO() biểu thị nén lzo của toán hạng LZ4() biểu thị nén lz4 của toán hạng ZSTD() biểu thị nén zstd của toán hạng ALGN(n) có nghĩa là đệm các byte rỗng vào ranh giới n-byte

initramfs := (”0” ZZ0000ZZ cpio_compression_archive)*

cpio_compression_archive := (GZIP(cpio_archive) | BZIP2(cpio_archive)

ZZ0000ZZ Xperia(cpio_archive) | LZO(cpio_archive) ZZ0001ZZ ZSTD(cpio_archive))

cpio_archive := cpio_file* + (<không có gì> | cpio_trailer)

cpio_file := ALGN(4) + cpio_header + tên tệp + “0” + ALGN(4) + dữ liệu

cpio_trailer := ALGN(4) + cpio_header + “TRAILER!!!0” + ALGN(4)

Theo thuật ngữ của con người, bộ đệm initramfs chứa một tập hợp các kho lưu trữ cpio được nén và/hoặc không nén (trong “newc” hoặc “crc” định dạng); số lượng tùy ý bằng 0 byte (để đệm) có thể được thêm vào giữa các thành viên.

CPio “TRAILER!!!” mục (cpio cuối kho lưu trữ) là tùy chọn, nhưng là không bị bỏ qua; xem phần “xử lý các liên kết cứng” bên dưới.

Cấu trúc của cpio_header như sau (tất cả các trường đều chứa các số ASCII thập lục phân được đệm đầy đủ bằng ‘0’ ở bên trái đến toàn bộ chiều rộng của trường, ví dụ: số nguyên 4780 được biểu thị bởi chuỗi ASCII “000012ac”):

Trường c_mode khớp với nội dung của st_mode được trả về bởi stat(2) trên Linux và mã hóa loại tệp cũng như quyền truy cập tệp.

c_mtime bị bỏ qua trừ khi CONFIG_INITRAMFS_PRESERVE_MTIME=y được đặt.

c_filesize phải bằng 0 đối với bất kỳ tệp nào không phải là tệp thông thường hoặc liên kết tượng trưng.

c_namesize có thể chiếm nhiều hơn một dấu ‘0’, miễn là giá trị không vượt quá PATH_MAX. Điều này có thể hữu ích để đảm bảo rằng một đoạn dữ liệu tệp tiếp theo được căn chỉnh, ví dụ: đến một khối hệ thống tập tin ranh giới.

Trường c_chksum chứa tổng không dấu 32 bit đơn giản của tất cả byte trong trường dữ liệu. cpio(1) gọi đây là “crc”, nghĩa là rõ ràng là không chính xác (kiểm tra dự phòng theo chu kỳ là một cách khác và kiểm tra tính toàn vẹn mạnh mẽ hơn đáng kể), tuy nhiên, đây là thuật toán được sử dụng.

Nếu tên tệp là “TRAILER!!!” đây thực sự là một bản lưu trữ cuối cùng điểm đánh dấu; c_filesize cho điểm đánh dấu cuối kho lưu trữ phải bằng 0.

Xử lý liên kết cứng

Khi nhìn thấy một thư mục không có c_nlink > 1, (c_maj,c_min,c_ino) tuple được tra cứu trong bộ đệm tuple. Nếu không tìm thấy thì nhập vào bộ đệm tuple và mục nhập được tạo như bình thường; nếu tìm thấy, một khó khăn liên kết chứ không phải là bản sao thứ hai của tệp được tạo. Nó không phải cần thiết (nhưng được phép) bao gồm bản sao thứ hai của tệp nội dung; nếu nội dung tệp không được bao gồm, trường c_filesize nên được đặt thành 0 để cho biết không có phần dữ liệu nào theo sau. Nếu dữ liệu là hiện tại, phiên bản trước của tệp bị ghi đè; điều này cho phép phiên bản mang dữ liệu của tệp xuất hiện ở bất kỳ đâu trong chuỗi (GNU cpio được báo cáo là đính kèm dữ liệu vào phiên bản cuối cùng của chỉ tập tin.)

c_filesize không được bằng 0 đối với liên kết tượng trưng.

Khi có thông báo “TRAILER!!!” điểm đánh dấu cuối kho lưu trữ được nhìn thấy, bộ đệm tuple được đặt lại. Điều này cho phép các tài liệu lưu trữ được tạo ra một cách độc lập được nối.

Để kết hợp dữ liệu tệp từ các nguồn khác nhau (mà không cần phải tạo lại các trường (c_maj,c_min,c_ino)), do đó, một trong hai có thể sử dụng các kỹ thuật sau:

  1. Phân tách các nguồn dữ liệu tệp khác nhau bằng “TRAILER!!!” điểm đánh dấu cuối kho lưu trữ, hoặc

  2. Đảm bảo c_nlink == 1 cho tất cả các mục không thuộc thư mục.