Bài liên quan
Trong năm 2014, nhân Linux đã được phát triển một cách đáng kể khi có đến 6 phiên bản chính được phát hành (từ 3.13 đến 3.18) với nhiều tính năng mới được thêm vào. Bài báo này sẽ điểm qua những tính năng mới đó.
Điểm mới đáng kể nhất trong chức năng mạng của nhân Linux là giải pháp iptables được thay thế bằng nftables. Tường lửa iptables có nhược điểm là quá tuyến tính và do đó kém linh hoạt. Đã có những công cụ để khắc phục nhược điểm này (ví dụ như Shorewall) nhưng chúng thực thi ở chế độ người dùng (user mode) nên khi có hàng chục nghìn kết nối đồng thời thì sẽ dẫn đến tình trạng quá tải.
Nftables khá giống với BPF (Berkeley Packet Filters): công cụ nftables biên dịch các luật thành byte code và truyền vào nhân. Điều này không những làm tăng đáng kể tính linh hoạt mà còn cho phép giảm thiểu kích thước mã của nhân. Cũng nhờ đó mà việc biên dịch lại nhân là không cần thiết khi có những giao thức mới xuất hiện. Tuy nhiên cú pháp của nftables khác với cú pháp của các công cụ trước đây; nó có tính cấu trúc phân cấp nên phù hợp cho việc viết luật hơn so với kiểu tuyến tính của iptables. Bộ phân tích cú pháp cho ngôn ngữ này được tạo ra bằng việc sử dụng BISON.
Bản thân BPF (được tích hợp trong nhân) cũng chứa sẵn trình biên dịch JIT (JIT-compiler) mới, một trình debug gọn nhẹ và được chia thành hai tập lệnh: “classic” và “internal”.
Việc cải tiến cũng được thực hiện cho ipset: giờ đây ipset đã hỗ trợ network namespace, khiến nó có thể được sử dụng trong LXC; bên cạnh đó ipset cũng đã hỗ trợ việc sử dụng dòng chú thích và một số tính năng hữu ích khác.
Bên trong dịch vụ mạng cũng có sự thay đổi: tính năng mới cho phép gửi các gói tin nhỏ theo từng nhóm đồng thời (nếu card mạng hỗ trợ), giúp giảm tải bộ đệm mạng và thậm chí trên một máy tính bình thường cũng có thể đạt được tốc độ truyền tải 40 Gb/s.
Bên cạnh đó, việc bổ sung cơ chế FOU – for over UDP, cho phép triển khai các loại đường hầm trên nền UDP. Điều này sẽ hữu ích trong một số trường hợp đặc biệt, ví dụ, khi một số chuyển mạch hay adapter mạng nào đó chỉ cung cấp khả năng xử lý nhanh gói tin cho UDP.
Ngoài ra, giao thức Geneve được bổ sung, cho phép đóng gói các thứ trừu tượng khi cần ảo hóa mạng, như trong điện toán đám mây khi cần định tuyến giữa các phân vùng mạng. Các giao thức trước đó (VXLAN và NVGRE) được cho là quá bó hẹp cho những nhu cầu cụ thể.
Hệ quản trị tệp tin và tệp thiết bị
Trong hệ quản trị tập tin và tệp thiết bị cũng có khá nhiều sự thay đổi. Trong đó bổ sung cơ chế tăng tốc hoạt động của các đĩa SSD. Việc tăng tốc đạt được là nhờ sử dụng mô hình hàng đợi hai cấp: các hàng đợi cấp 1 được dành cho các vi xử lý (hoặc nhân vi xử lý), còn các hàng đợi cấp 2 thì quản lý các truy xuất tới ổ đĩa. Như thế, số lượng tiến trình có thể truy cập tới hệ thống nhập/xuất giờ đây đã tăng lên đáng kể. Kết quả thử nghiệm cho thấy cơ chế mới cho phép đạt được hàng triệu IOPS (thao tác nhập/xuất trong một giây), trong khi đó công suất cực đại trước đó chỉ đạt khoảng 800.000 IOPS.
Trong hệ thống bcache (sử dụng đĩa SSD như là bộ đệm cho ổ cứng thông thường), bộ gom rác đã được viết lại – giờ đây nó hoạt động ở chế độ tích góp (incremental). Sự thay đổi này giúp giảm thiểu thời gian trễ trong quá trình dọn dẹp bộ đệm. Còn trong môđun dm-cache (hầu như thực hiện cùng chức năng đó) có thêm chế độ passthrough, được kích hoạt khi không thể xác định được dung lượng khả dụng của bộ đệm. ở chế độ này, thao tác đọc dữ liệu được thực hiện trực tiếp từ đĩa cứng, còn thao tác ghi được thực hiện qua bộ đệm.
Hệ thống FUSE được bổ sung tính năng writeback cache, giúp cải thiện hiệu năng làm việc trong những trường hợp có lượng lớn yêu cầu ghi đĩa.
Tốc độ làm việc của hệ quản trị tập tin SquashFS (được sử dụng chủ yếu cho Live CD) cũng được cải thiện. Việc phân trang được thực hiện ngay trong bộ đệm, giúp tránh được sự tắc nghẽn và từ đó cải thiện tốc độ rõ rệt. Một số kết quả kiểm tra cho thấy hệ số tăng tốc đạt đến 6 lần.
Cuối cùng thì trong BTRFS cũng đã xuất hiện khả năng mount các phân vùng riêng biệt ở chế độ RO- và RW. Bên cạnh đó cũng bổ sung tùy chọn commit, cho phép chỉ định khoảng giá trị commit, và một số tùy chọn khác.
XFS được bổ sung tùy chọn O_TMPFILE, là tùy chọn được bổ sung vào lời gọi hệ thống open() vào tháng 9/2013 và được sử dụng để tạo các tệp tạm thời vô danh, giúp hạn chế rủi ro bộc lộ các điểm yếu. Mặt khác, chỉ số B-tree Index cho các inode trống được đưa vào để tăng tốc việc cấp phát inode.
Đến nay, hệ quản trị OverlayFS đã được hỗ trợ đầy đủ. OverlayFS là hệ quản trị tập tin “hai lớp”, trong đó, lớp dưới thường nằm ở một thiết bị lưu trữ chỉ đọc (read-only), đối với lớp trên thì có thể thực hiện ghi thoải mái mà không cần biết rằng thực tế đó đã là một hệ tập tin hoàn toàn khác. Hệ quản trị tập tin kiểu này rất hữu ích trong một số trường hợp, ví dụ như OpenWRT trong các router hiện đại, trong đó lớp dưới là SquashFS, còn lớp trên có thể là một phân vùng của flash memory hoặc là một USB flash. Điểm khác biệt của OverlayFS so với các hệ quản trị tập tin cùng loại là sau khi một tệp đã được mở thì mọi thao tác với tệp này sẽ được thực hiện trực tiếp trên các lớp tương ứng, điều này trước hết giúp đơn giản hóa thiết kế, sau nữa là tăng hiệu năng làm việc.
Trong zRAM (công cụ tạo ổ đĩa RAM nén) đã xuất hiện khả năng chỉ định giới hạn bộ nhớ. Bên cạnh đó, nó được bổ sung để hỗ trợ thuật toán nén LZ4, cho phép trong một số trường hợp đạt tốc độ và hiệu suất nén cao hơn so với thuật toán LZO trước đó.
Còn trong /proc/partitions thì đã cho phép ánh xạ tới các đĩa RAM.
Ảo hóa
Có lẽ đây là lĩnh vực có sự thay đổi đáng kể nhất, đó là việc hỗ trợ chế độ PVH trong XEN-. Chế độ này là một sự dung hòa giữa Hardware Virtualization và Paravirtualization. Lớp trung gian mô phỏng phần cứng đã được bỏ đi, thay vào đó là việc quản lý bộ nhớ và các câu lệnh đặc quyền (privileged instructions) được thực thi trực tiếp trong nhân của hệ điều hành khách (Guest OS). Việc phân chia được thực hiện nhờ công nghệ của vi xử lý. Sự thay đổi về mặt ảo hóa cũng diễn ra đối với phần hệ thống mạng có liên quan đến XEN –, trình điều khiển card mạng ảo cũng đã được hỗ trợ đa hàng đợi.
Bên cạnh đó, chế độ passthrough cho các thiết bị SCSI trong môi trường paravirtualization đã được cung cấp để thực hiện một số tác vụ đặc biệt trên các thiết bị này. Đó là những tác vụ không thể thực hiện được khi sử dụng API mức cao hơn, ví dụ như tác vụ tời băng từ.
Có một thiết bị mới được thêm vào là KVM-VFIO. Nó cho phép KVM hypervisor truy cập tới các driver được viết bằng VFIO Framework và làm việc ở User Mode. KVM cũng đã hỗ trợ Nested Virtualization cho MPX (Memory Protection Extensions) – một công nghệ được sử dụng để chống lại tấn công sử dụng điểm yếu Null Pointer Dereference dựa trên tính năng mới của vi xử lý Intel.
Vấn đề an toàn
Trong năm qua, vấn đề an toàn cho nhân Linux cũng đã được cải thiện một cách đáng kể. Trước hết là khả năng gán ngữ cảnh SELinux cho các file trên đĩa RAM. Kế đó, trong chính sách SELinux giờ đây đã hỗ trợ tùy chọn always_check_network, theo đó mọi gói tin đều được coi là có gắn nhãn SELinux dù cho có thể không đặt bất kì luật nào cho Netfilter và thực tế không bật bất kì cờ nào.
Các hàm liên quan đến bộ sinh số giả ngẫu nhiên (PRNG) cũng được cải tiến. Ví dụ, trong hàm prandom32() thuật toán taus88 được thay thế bằng taus133 với chu kì đạt 2113. Bên cạnh đó, việc trộn (sử dụng phép XOR) đầu ra của bộ sinh số ngẫu nhiên cứng vào buffer tổng cũng được thay thế bằng việc đưa đầu ra đó vào entropy pool ở các pha trước.
Nhân mới cũng được bổ sung công nghệ KASLR – ngẫu nhiên hóa không gian địa chỉ. Công nghệ này được xây dựng nhằm bảo vệ nhân khỏi tấn công tràn bộ đệm trên stack, nhưng một số hacker cho rằng có thể dễ dàng vượt qua cơ chế bảo vệ này.
Nhân mới còn hỗ trợ biên dịch với tùy chọn mới của GCC4.9 là -fstack-protector-strong. ý tưởng chung của những tùy chọn như thế là đưa vào stack một đại lượng ngẫu nhiên ngay khi có một địa chỉ trả về được đưa vào stack. Trước khi trở về từ một hàm nào đó, giá trị ngẫu nhiên sẽ được kiểm tra, nếu nó bị thay đổi thì lập tức chấm dứt hoạt động. Việc sử dụng kiểm tra như vậy sẽ khiến tiêu tốn thêm thời gian. Khi chỉ có vài hàm thì độ trễ đó là không đáng kể, nhưng khi có tới hàng nghìn hay hàng chục nghìn hàm thì hiệu năng của hệ thống có thể bị ảnh hưởng nặng nề. Như vậy, các nhà phát triển sẽ phải đặt câu hỏi: cần phải thực hiện kiểm tra cho những hàm nào? Và có một tập các tùy chọn GCC cho phép xác định những hàm như thế. Tùy chọn –fstack-protector-all sẽ thực hiện kiểm tra cho mọi hàm, bất kể địa chỉ trả về là bao nhiêu.Tùy chọn –fstack-protector chỉ tác động đến những hàm mà đặt vào stack mảng kí tự kích thước lớn hơn 8MB. Tùy chọn này cho phép bảo vệ hầu hết những khu vực nguy hiểm. –fstack-protector-strong cho phép bảo vệ những vùng được bảo vệ bởi tùy chọn –fstack-protector, ngoài ra còn bảo vệ tất cả các mảng cục bộ và một số vùng nguy hiểm khác. Tùy chọn này bao quát khoảng 20% số hàm của nhân, tức là một chỉ số tốt so với 2% được bao quát bởi tùy chọn –fstack-protector. Cần nói thêm rằng việc bảo vệ stack và các môđun này được kích hoạt ngay ở những pha đầu tiên của quá trình khởi động, trước cả việc phân giải tham số.
Cơ chế seccomp-bpf cũng đã hỗ trợ JIT-compilation của các BPF-filter. Có chế này cho phép đặt ra các hạn chế đối với các lời gọi hệ thống. Sự khác biệt so với LSM là hầu hết các phiên bản LSM bảo vệ các ứng dụng bằng cách gắn chúng với các hạn chế từ bên ngoài; trong khi đó seccomp-bpf dù vẫn cho phép bảo vệ theo cách trên, nhưng phù hợp hơn cho những hạn chế được đưa trực tiếp vào trong mã ứng dụng. Nó được mô tả bằng một danh sách các lời gọi hệ thống được phép, các tham số được phép và hành động khi có lời gọi không hợp lệ. Tính năng mới này cho phép đặt ra các quy tắc được mềm dẻo, và nếu sử dụng đúng thì sẽ gây khó khăn lớn cho kẻ tấn công.
Ngoài ra, nhân mới cũng hỗ trợ NFC Secure Elements API cho phép thực hiện các giao dịch tài chính sử dụng giao thức này.
Các vấn đề khác
Trong bộ lập lịch tiến trình (process scheduler) xuất hiện chính sách mới là SCHED_DEADLINE, nó cung cấp thuật toán lập lịch EDF (Earliest Deadline First). Ý tưởng của thuật toán này là lựa chọn từ hàng đợi tiến trình tác vụ gần với deadline nhất. Điều này là rất cần thiết trong các hệ thống thời gian thực, khi mà có những tiến trình cần phải được thực thi đúng thời hạn, dù cho tổng số tiến trình là bao nhiêu đi nữa. Trước khi có chính sách SCHED_DEADLINE, bộ lập lịch không thể đảm bảo việc thực thi một tác vụ nào đó trong một khoảng thời gian nào đó.
Đối với những hệ thống có trang bị UEFI thì có khả năng nạp nhân 64 bit trực tiếp từ EFI 32 bit. Trước đây, việc này là không thể vì vấn đề liên quan đến lời gọi hàm EFI.
Power Capping Framework được thêm vào nhân mới để cung cấp khả năng truy cập tới giao diện thống nhất về quản lý điện năng. Framework này hỗ trợ một khái niệm gọi là vùng năng lượng (Power Zone). Một vùng năng lượng được tạo thành bởi một số thành phần khác nhau của hệ thống, có thể được điều khiển và giám sát bằng các phương thức quản lý năng lượng. Mỗi một vùng năng lượng chứa một tập các thuộc tính và cơ chế quản lý năng lượng. Các vùng có thể được tổ chức theo cấu trúc phân cấp tùy theo vị trí thực tế của chúng trong hệ thống (ví dụ: đĩa – hệ thống đĩa – bo mạch chủ) và nhờ đó cho phép thiết lập các tham số quản lý năng lượng tới một tập hợp các phần tử hoặc tới từng phần tử cụ thể.
Việc đánh thức hệ thống từ trạng thái ngủ cũng được tăng tốc nhờ sử dụng thuật toán khác để làm việc với đĩa cứng. Trước đây, khi đĩa cứng chưa được “đánh thức” hoàn toàn, ATA driver sẽ không thực thi bất kỳ hành động nào và do đó ngăn chặn hoàn toàn hoạt động của nhân. Còn bây giờ, tất cả câu lệnh được gửi tới driver sẽ được đưa vào hàng đợi và sau đó lần lượt được thực hiện.
Năm qua, các nhà phát triển đã bắt đầu tính đến việc biên dịch nhân bằng clang. Vấn đề nằm ở chỗ, nhân Linux chứa hàng loạt yếu tố đặc thù của GCC, ví dụ như mảng có kích thước thay đổi. Và vấn đề hỗ trợ GCC 5 cũng đã được đưa vào.
Ngoài ra, một loạt lời gọi hệ thống mới được bổ sung và các nhà phát triển đã quyết định giải quyết vấn đề năm 2038, thời điểm mà kiểu dữ liệu nguyên 32 bit time_t (bộ đếm giây bắt đầu từ kỉ nguyên UNIX) sẽ bị tràn.
Kết luận
Ngày càng có nhiều tính năng mới được đưa vào nhân Linux. Một mặt điều đó có nghĩa là việc phát triển nhân được thực sự quan tâm; mặt khác, kích thước mã của nhân đã lớn đến đáng sợ. Đành rằng, một phần lớn các tính năng có thể được loại bỏ trong quá trình biên dịch nhân, nhưng câu hỏi đặt ra là sao lại đưa trình thông dịch byte-code hay bộ gom rác cho block device vào nhân? Trong trường hợp lý tưởng, mã ở chế độ đặc quyền (được phép truy cập đến mọi thiết bị phần cứng và bộ nhớ) chỉ nên thực hiện nhiệm vụ lập lịch thời gian CPU và phân chia bộ nhớ mà thôi.
Nguyễn Tuấn Anh (dịch từ Tạp chí Hacker số 03(194)2015)
Post a Comment