Openrsync - Bản triển khai rsync của nhóm OpenBSD
(github.com/kristapsdz)- openrsync là một hệ thống triển khai rsync theo giấy phép BSD (ISC), hiện đã được hợp nhất vào base của OpenBSD
- Tương thích với rsync mới nhất và rsync 3.1.3 được dùng để kiểm thử, nhưng có thể hoạt động nếu hỗ trợ giao thức 27
- Vì chỉ chấp nhận một phần tham số dòng lệnh của rsync chứ không phải toàn bộ, nên khi dùng openrsync cùng với rsync cần sử dụng các cờ được cả hai bên hỗ trợ
- Hệ điều hành được hỗ trợ chính thức là OpenBSD, và có kèm glue phục vụ tính di động để có thể biên dịch và chạy trên các hệ UNIX khác
- Tài liệu chuẩn là các trang manual; chi tiết giao thức có trong rsync(5) và rsyncd(5), còn tài liệu tiện ích nằm ở openrsync(1)
- Dự án được viết như một phần của rpki-client(1) cho OpenBSD, với kinh phí từ NetNod, IIS.SE, SUNET, 6connect
- Việc cài đặt trên các hệ UNIX thông thường được thực hiện bằng
./configure,make,make install, và không xung đột với bản cài rsync hiện có - Thuật toán rsync được chia thành sender và receiver; sender tạo danh sách tệp nguồn và metadata, sau đó hai bên sắp xếp tên tệp theo thứ tự từ điển để tham chiếu các mục dựa trên vị trí
- Với đồng bộ tệp thông thường, nếu kích thước tệp và thời gian sửa đổi giống nhau thì sẽ bỏ qua; nếu khác, dữ liệu thay đổi sẽ được tái dựng bằng cách dùng hash nhanh kiểu Adler-32 4 byte và hash MD4 chậm 16 byte cho từng khối có kích thước cố định
- Kích thước khối mặc định là giá trị làm tròn của căn bậc hai tổng kích thước tệp; kích thước tối thiểu là 700 B, và kết quả căn bậc hai vì lý do chưa rõ sẽ được làm tròn lên thành bội số của 8
- Phiên làm việc được chia thành client do người dùng chạy và tiến trình server chạy từ xa; server có thể được khởi chạy theo nhu cầu bằng ssh(1) hoặc chạy như một network daemon thường trú
- Khác với generator của rsync chạy như một tiến trình riêng bên cạnh receiver, openrsync gộp generator và receiver vào một tiến trình và phản hồi các yêu cầu đọc/ghi bằng event loop
- Về bảo mật, nó dùng pledge(2) của OpenBSD để giới hạn các thao tác hệ thống theo từng chế độ chạy, và dùng unveil(2) để chỉ cho phép truy cập hệ thống tệp bên dưới thư mục đích
- Ở chế độ server, seed cho hash MD4 được tạo bằng arc4random(3) thay vì time(3)
- Có thể port sang Linux (glibc·musl), FreeBSD, NetBSD, Mac OS X, OmniOS, và GitHub CI thực hiện kiểm thử trên các kiến trúc x86_64, aarch64, s390x; tuy nhiên việc tái tạo các tính năng bảo mật tương ứng với pledge và unveil của OpenBSD là ràng buộc cốt lõi khi port
1 bình luận
Ý kiến trên Hacker News
Phần mô tả rằng nếu máy chủ từ xa là nguồn hoặc đích thì client sẽ tạo tiến trình con bằng
fork(2), khởi chạy serveropenrsynctrên host từ xa quassh(1), rồi client và server giao tiếp bằng pipesocketpair(2)khá mơ hồ về việc thực sự vận hành như thế nàoCó lẽ ý là tiến trình con sau khi fork sẽ chuyển tiếp kết nối cho tiến trình cha qua cặp socket, hoặc nối stdin/stdout vào “pipe” cặp socket rồi
execsshNhưng điều này giống như nói bạn lái xe ra sân bay rồi bảo là đi Úc bằng ô tô
Tôi đã dùng
openrsyncở nhiều nơi kể từ khi nó được công bố, và theo thời gian nó rõ ràng đã tốt hơn. Tôi đang chờ đến lúc có thể dùng hoàn toàn nóTuy vậy, với kiểu sử dụng của tôi có một điểm nó không khớp với Samba
rsync:openrsync --rsync-path=openrsync -av -e ssh /etc/services example.com:/tmp/servicesHành vi tôi mong đợi là tạo file
/tmp/servicesở máy từ xa, nhưng thực tế nó lại tạo/tmp/services/servicesCác trường hợp mirror thư mục thông thường như
-av -e ssh /path/to/src/ example.com:/path/to/dst/thì hoạt động giống Sambarsyncrsync“thông thường”. Nếu chỉ muốn đồng bộ nội dung thì có lẽ cần dấu gạch chéo ở cuối sauservicesSửa: thật ra
rsync“thông thường” của tôi cũng làopenrsynctrên macOS/tmp/serviceshay chưaĐây là một trong những phần dễ gây nhầm nhất của
rsync: cách xử lý thư mục và dấu gạch chéo cuốirsynchành hạ suốt vô số năm, tôi hiểu xung động đó, nhưng việc tạoservicesthứ hai hợp lý hơn nhiều và là mặc định an toàn hơnNếu có cơ hội chỉnh mặc định của
rsynctheo hướng bớt điên hơn, thì nên cứu các thế hệ tương lai khỏi sự rối rắm nàyNhìn vào việc gần đây codebase
rsyncđột nhiên có thêm rất nhiều commit vibe coding, thậm chí còn gây ra regression, thì đây là tin rất tốtrsyncvốn luôn vững chắc nên ban đầu tôi định bỏ ngoài tai, nhưng thực tế sau khi nâng cấp thì script backup của tôi đã hỏngCác issue mới nhất trên GitHub tổng hợp khá nhiều bug lọt vào trong 2 bản vá gần đây, kể cả một commit quái vật khoảng 9 nghìn dòng có lẽ cũng chẳng mang nhiều ý nghĩa
LLM khiến việc viết code nhanh hơn và dễ hơn, nhưng điều quan trọng luôn là suy nghĩ. Tôi không hiểu vì sao lại phá hỏng một phần mềm lâu đời và đáng tin cậy như thế này
Nói cho những ai cần bối cảnh phát triển của gói này: dự án hiện đang được phát triển như một phần của trình xác thực RPKI
https://medium.com/@jobsnijders/a-proposal-for-a-new-rpki-va...
Cũng có bản triển khai bằng Go của Michael Stapelberg / nhóm Gokrazy: https://github.com/gokrazy/rsync
https://github.com/gokrazy/rsync/graphs/contributors
Trọng tâm thật sự của công việc port là tái hiện các tính năng bảo mật mà
pledge(2)vàunveil(2)của OpenBSD cung cấp. Chúng là yếu tố mang tính quyết định của hệ thốngNếu không có những tính năng này thì hệ thống sẽ chấp nhận dữ liệu tùy ý từ mạng công khai
https://justine.lol/pledge/
Trên Alpine Linux edge tôi không thấy
pledge. Có ai đã thửpledgetrên Linux chưa? Có phải tôi đang hiểu sai rủi ro của việc dùngopenrsynckhông cópledge, hay bài viết này chỉ dành cho người dùng OpenBSD?pledge,unveilhay Capsicum. Nó cócgroups, namespace, và đủ thứ lặt vặt phải ghép lại nếu muốn làm điều tương tựLinux được xây theo kiểu nhiều hệ thống được thêm dần lặp đi lặp lại rồi kết hợp với nhau để tạo thành sandboxing hoặc giới hạn tính năng, thay vì một khả năng cô lập cung cấp toàn bộ khái niệm thông qua các system call và đường dẫn kernel cụ thể
Dạo này phía Linux hình như còn có các tính năng mới như Landlock, nhưng có lẽ vẫn là cách xây chồng lên các thành phần nền sẵn có của Linux chứ không phải làm lại hoàn toàn
Từ “lộn xộn” ở đây có lẽ chỉ có nghĩa là mọi thứ nằm rải rác khắp nơi. Có quá nhiều cách để khóa lại, và để chọn cách tốt nhất thì phải đào sâu vào từng subsystem, trái ngược với việc chỉ dùng 1–2 system call đơn giản
Và bên dưới có viết: “Có vẻ có thể làm được với Capsicum của FreeBSD, nhưng các cơ chế bảo mật của Linux thì lộn xộn và cần bàn tay của chuyên gia để gia cố đúng cách”
Tức là portable ở đây chỉ có nghĩa là biên dịch và chạy được, chứ không có nghĩa là có cùng mức tính năng bảo mật
Sẽ tốt nếu
pledge/unveilcó mặt ở upstream Linux, nhưng tôi không kỳ vọng điều đóKhông giống câu “nếu không có các tính năng này thì hệ thống sẽ chấp nhận dữ liệu tùy ý từ mạng công khai”,
pledgehayunveilkhông thay đổi việc có nhận dữ liệu tùy ý hay không. Chúng giới hạn những gì một tiến trình đã bị khai thác lỗ hổng có thể làmPhần
Securitygiải thích đúng hơn, nên tôi không rõ cách diễn đạt kia từ đâu raĐây là phiên bản đã được dùng từ macOS 15.0
Sửa: buồn cười là đúng là họ có đưa vào từ 15.0, nhưng có vẻ giữ lại thay đổi phá vỡ khả năng tương thích ngược đến tận 15.4. https://apple.stackexchange.com/a/479297
Gần đây nó không hỗ trợ giao thức
rsync, nên không có hỗ trợ timestamp 64-bit, vì thế trên các filesystem mới nó không thể thực sự đồng bộ metadataTôi thắc mắc vì sao lại có tên đó.
Openrsyncnghe như một bản thay thế mã nguồn mở cho một chương trình mã nguồn đóngNhưng
Rsyncgốc chẳng phải cũng là GPL sao? Hay chỉ là theo nghĩa “mở hơn” vì giấy phép dễ dùng hơn?open, nhưopenssh,openbgpd,openntpd,opensmtpd