- Một người dùng thường xuyên dùng desktop BSD cùng
chroot và jail đã thử Alpine Linux, và nhận thấy thiết kế tập trung vào bảo mật, sự đơn giản và hiệu quả tài nguyên của nó tạo cảm giác quen thuộc với người dùng BSD
- Nhờ kích thước nhỏ và phụ thuộc hạn chế, Alpine được dùng rộng rãi không chỉ làm base image cho container mà còn trên hệ thống nhúng, router, thiết bị di động, máy chủ và desktop
- Việc cài đặt diễn ra bằng cách chạy
setup-alpine trong môi trường live, lần lượt cấu hình các thiết lập cơ bản như keymap, mạng, múi giờ, SSH và NTP
- Sau lần khởi động đầu tiên, tổ hợp OpenRC,
musl và busybox hiện rõ; các thành phần như /etc/rc.conf và crond(8) có nét tương đồng với trải nghiệm rc kiểu BSD
- Sau khi kiểm tra trình quản lý gói
apk, cấu hình kho lưu trữ và khả năng cài ZFS, Alpine để lại ấn tượng tốt đến mức được cân nhắc nghiêm túc như ứng viên bản phân phối Linux chính cho thử nghiệm và máy chủ
Tính chất Alpine quen thuộc với người dùng BSD
- Alpine Linux là một bản phân phối Linux độc lập, phi thương mại, đa dụng dành cho power user, chú trọng bảo mật, sự đơn giản và hiệu quả tài nguyên
- Các binary ở userland được biên dịch với PIE (Position Independent Executables) và stack smashing protection, tập trung vào việc giảm thiểu một số zero-day và khai thác lỗ hổng cụ thể
- Alpine là một dự án lâu đời hơn nhiều so với tưởng tượng, khi Natanael Copa đã thảo luận về nguồn gốc dự án từ năm 2005
- Giống các hệ BSD, Alpine được dùng trên hệ thống nhúng, router, thiết bị di động, cũng như máy chủ và desktop thông thường
- Do kích thước nhỏ và phụ thuộc hạn chế, Alpine được dùng rộng rãi làm base image cho container Linux; cũng có các công cụ như alpine-chroot-install để chạy dễ dàng trong
chroot(8)
- Đây là điểm đặc biệt thú vị với những người dùng thường dùng NetBSD
chroot(8) và FreeBSD jail cho thử nghiệm và triển khai
Trải nghiệm cài đặt
- Alpine cung cấp nhiều bản build cho ARM, PPC64, x86, x86_64, v.v.
- Tác giả đã boot image ISO Xen trong VM, nhưng đó là lựa chọn do đọc nhầm Dom0 thành DomU
- Dom0 chỉ Xen hypervisor, không phải guest
- Dù vậy, quá trình boot và cài đặt vẫn diễn ra như ISO tiêu chuẩn
- Cài đặt được thực hiện bằng cách đăng nhập vào môi trường live bằng
root với mật khẩu trống, rồi chạy setup-alpine
- Trong quá trình cài đặt, các mục cơ bản như keymap, mạng, múi giờ và xác thực root được cấu hình lần lượt
- Có thể chèn SSH key ở giai đoạn đầu
- Điều này hữu ích khi về sau triển khai một nhóm VM hoặc máy chủ bằng công cụ orchestration
- Cũng hữu ích trong môi trường hosting không cung cấp console OOB
- Có thể chọn SSH server và NTP client, nên tác giả đã chọn OpenSSH và openntpd
- Quá trình cài đặt nhận diện chính xác rằng hệ thống đang chạy trên Xen
- Cũng có thể cấu hình LVM, nhưng lần này tác giả chọn cấu hình tiêu chuẩn mà Alpine gọi là phân vùng
sys
Cấu hình hệ thống sau lần khởi động đầu tiên
- Sau lần boot đầu tiên, có thể thấy trong
dmesg(1) rằng hệ thống đang dùng OpenRC
- OpenRC là một hệ thống init có tính di động, kích thước nhỏ, nhanh, hiệu quả, minh bạch và bảo mật
- Với người dùng quen viết script rc kiểu BSD, OpenRC tạo cảm giác rất quen thuộc
- Các thành phần như
/etc/rc.conf và crond(8) tương đồng với trải nghiệm của người dùng BSD
- Việc có các bản phân phối Linux dùng OpenRC như Devuan, Gentoo và Alpine khiến Linux trở nên thú vị trở lại
- Cùng với OpenRC, Alpine bao gồm musl và sử dụng busybox
- musl và busybox hạn chế hơn GCC và GNU coreutils, nhưng góp phần làm kích thước nhỏ cho hệ thống nền tảng và giảm bề mặt tấn công
- Cũng có thể dùng llvm
- MirBSD Korn shell cũng được cung cấp dưới dạng package, và là một trong những shell tương tác ưa thích của tác giả
Quản lý gói và kho lưu trữ
- Trình quản lý gói mặc định của Alpine là apk
- Theo cách thường thấy trên Linux,
apk không phân biệt hệ thống nền tảng và package mà cập nhật cả hai cùng nhau
- Tác giả chưa kiểm tra liệu có thể chạy bằng một bản sao không đặc quyền như trên BSD hay không
- Cũng có thể dùng pkgsrc, nên vẫn còn lựa chọn thay thế
- Cấu hình kho lưu trữ nằm ở
/etc/apk/repositories
- Bỏ comment URL thứ hai do trình cài đặt cung cấp sẽ kích hoạt kho community
- Alpine cũng có kho
testing, và có thể thêm kho riêng
- Cách dùng khá đơn giản, nhưng do thói quen cũ nên đôi khi tác giả gõ nhầm
apt install thay vì apk add
- Giao diện web package chính thức nằm tại pkgs.alpinelinux.org
- Có thể tra cứu kho Alpine trên pkgs.org nữa
ZFS và đánh giá như ứng viên cho máy chủ
- Sau khi cài một vài package, tác giả đã có thể dựng cấu hình “công cụ thiết yếu” từng dùng trên laptop chỉ có console
- Một trong những package gây bất ngờ nhất là ZFS
- Việc cài đặt và nạp kernel module có thể thực hiện bằng hai lệnh
# apk add zfs zfs-lts
# modprobe zfs
- Việc cấu hình root filesystem bằng ZFS có thể phức tạp hơn
- Tác giả chưa kiểm tra sau khi nâng cấp thì cấu hình ZFS sẽ hoạt động ra sao
- Chỉ với trải nghiệm đến hiện tại, Alpine đã để lại ấn tượng đủ tốt để tác giả cân nhắc nghiêm túc việc chuyển sang dùng làm bản phân phối Linux chính cho thử nghiệm và máy chủ
- Các ưu điểm được nêu gồm việc chỉ thấy một số ít process nhận ra được trong
htop(1) và lsof(1), sử dụng OpenRC, quản lý gói có vẻ đơn giản và cấu hình dễ dàng
- Tác giả đánh giá rằng nếu có một “Occam’s Linux” hiện đại và có đầy đủ chức năng, Alpine có lẽ là hình ảnh gần nhất
- Nếu cần nhiều chức năng hơn busybox, có thể thử chạy uutils, nhưng trên máy chủ thì nhu cầu này có vẻ thấp
1 bình luận
Ý kiến trên Hacker News
Nhìn từ góc độ bảo mật, phần lớn binary Linux hiện nay được biên dịch dưới dạng PIE
Nếu chạy
checksectrên một binary bất kỳ của Ubuntu thì sẽ thấy thuộc tính đó, và có thể càichecksecbằngpip install pwntoolsNgược lại, theo tôi biết thì GLIBC có triển khai heap được gia cố mạnh nhất, đồng thời cũng có nhiều biện pháp giảm thiểu hơn đối với double free và các kiểu tấn công heap khác
Vì vậy xét ở khía cạnh đó, có thể xem Alpine kém an toàn hơn do dùng musl, nhưng việc là một hệ thống nhỏ và dễ hiểu lại là lợi thế thật sự về bảo mật
checkseccho mọi thứ, và các process đều hiện ra như thế này. Toàn bộ output dài nên bỏ qua, nhưng tôi chưa từng thấy thứ gì do Alpine build mà thiếu các flag nàyCOMMAND PID RELRO STACK CANARY NX/PaX PIEinit 1 Full RELRO Canary found NX enabled PIE enabled[snip...]crond 422838 Full RELRO Canary found NX enabled PIE enabledThành thật mà nói, tôi thấy cả Windows và macOS hiện đại đều có kiến trúc bảo mật tốt hơn
Tôi cũng là người dùng BSD, và tình cờ tuần này lần đầu chạy Alpine trong VM trên bhyve
Điểm cốt lõi là BusyBox. Nếu các tiện ích trong
/binvà/sbinkhông cần phải là từng binary độc lập, user space sẽ rất nhỏ và boot cũng nhanh. Cài thêm Tmux, zsh là đã đủ cho phần lớn nhu cầu UnixĐể tới môi trường cuối cùng thì tôi phải cài khá nhiều thứ bằng
apk, nhưng nhìn chung đây là trải nghiệm Linux tốt nhất tôi có sau một thời gian dài. Sẽ tốt hơn nếu ZFS được tích hợp sẵn theo mặc định, và kết nối virtio được làm rõ ràng hơn cho cách chạy dựa trên ZFS của bhyveDù vậy, nghe nói có thể có một bản phân phối Linux tỉnh táo thì cũng mừng, và nếu cần một máy Linux tôi sẽ thử. Chỉ là chuyện đó khá hiếm
apklà cài đượcWiki Alpine cũng có tài liệu khá ổn về việc cài root filesystem trên ZFS: https://wiki.alpinelinux.org/wiki/Root_on_ZFS_with_native_en...
Nếu là người dùng BSD, có thể bạn cũng sẽ thích Void Linux. Đây là distro do xtraeme, một developer NetBSD, tạo ra; có phiên bản glibc và musl, và dùng runit làm hệ thống init
Cũng có thể build package từ source bằng
xbps-srchttps://voidlinux.org/
Tuy nhiên cần lưu ý là tôi chỉ dùng cài đặt xfce với chỉnh sửa tối thiểu. Các cấu hình đa người dùng phức tạp có thể rắc rối hơn một chút vì runit có ít tính năng tích hợp sẵn hơn systemd
Tôi đã nghĩ thế nào cũng sẽ có người nói rằng các trang man mà BSD tự hào lại không được Alpine cài sẵn mặc định. Đó là một trong những lý do tôi không dùng Alpine trên laptop mang đi xa, và hiện tôi đang dùng OpenBSD
Có phải tôi đã bỏ lỡ một tùy chọn cấu hình nào đó để tài liệu luôn được cài khi nhận package trên Alpine không? Hay chỉ còn cách lần nào cũng cài thủ công các package
-doc?docs. Sau đó nó sẽ kéo về các package*-docphù hợp với những thứ bạn càiThành thật mà nói, tôi hoàn toàn không hiểu vì sao người ta lại thấy những thứ như OpenRC hấp dẫn. Tôi nghĩ bất kỳ cách nào dựa trên giám sát cũng tốt hơn kiểu làm rò PID, lưu vào file PID, rồi hy vọng rằng 3 tuần sau giá trị đó vẫn trỏ đến daemon đã chạy
Hơn nữa, trong một số trường hợp người ta còn xử lý tác vụ quản lý service bằng cách
pgrepmột tên tiến trình cụ thể. Tôi phần nào đồng ý với ý tưởng rằng không nên mặc định tự động khởi động lại mọi thứ, nhưng đó gần như là ưu điểm duy nhất mà loại này có thể đưa raRốt cuộc những thứ này cũng phụ thuộc rất nhiều vào syslog, mà đây đúng là công nghệ của thập niên 80. Các công cụ như
multiloghaysvlogdcó thể được cải thiện để dễ cung cấp hơn một góc nhìn tập trung giúp xem thứ tự sự kiện của nhiều công cụ cùng lúc, nhưng việc gom log theo các hạng mục mơ hồ và cho phép bất kỳ ai ghi log ở bất kỳ đâu dưới bất kỳ tên nào thì nghe khá kỳ lạhttps://mastodon.social/@ariadne@treehouse.systems/112044942...
https://mastodon.social/@ariadne@treehouse.systems/112214386...
Có quá nhiều thứ nằm trong PID1, và nó được viết bằng một ngôn ngữ không an toàn bộ nhớ. Tôi không thấy lý do kỹ thuật nào khiến nó không thể được tách thành một PID1 tối thiểu và vài chương trình setuid
Ngoài việc có thể chạy systemd trong container Docker, tôi không nghĩ ra lý do nào khác; mà Red Hat/IBM có lẽ cũng không quá muốn điều đó, vì họ thích mọi người dùng công cụ container hóa của họ như systemd-nspawn hơn. Với cấu trúc hiện tại, tôi nghĩ nó không thể nào hợp lý từ góc độ bảo mật
Alpine có một ưu điểm thú vị. Khi người dùng Nix khoe quản lý gói theo kiểu khai báo, bạn có thể chỉnh trực tiếp
/etc/apk/worldrồi chạyapk fixđể cho thấy cách làm tương tự mà không cần Nix/var/lib/portage/world, các tập hợp đã chọn ở/var/lib/portage/world_sets, và định nghĩa tập hợp ở/etc/portage/sets/Như vậy có thể chia gói theo từng nhóm, chỉ cài một phần trên các hệ thống cần thiết, và thêm chú thích vào file tùy ý. Thứ tương đương với
apk fixlàemerge -uDU @world && emerge -c, dù hơi rườm rà hơnAlpine cũng có thể tạo thứ gần giống tập hợp bằng
apk add -t setname pkg1 pkg2 pkg3; khi đó một gói giả phụ thuộc vào các gói đã chọn sẽ được tạo ra. Tôi thường tạo script shell trong/etc/apk/sets/để bắt chước cảm giác của Gentoo, nhưng không phải lúc nào cũng giống nhauTôi nhớ trước đây từng có các bài viết về hiệu năng khi chạy Alpine trong Docker, và họ khuyên dùng Debian/Ubuntu
Bài viết về Alpine chậm:
https://pythonspeed.com/articles/alpine-docker-python/
https://superuser.com/questions/1219609/why-is-the-alpine-do...
Bài viết thân thiện hơn với Alpine:
https://nickjanetakis.com/blog/benchmarking-debian-vs-alpine...
Tôi tự hỏi câu chuyện này hiện còn đúng không
Dù vậy, về mặt hiệu năng, việc chạy benchmark để xem con số thực tế vẫn sẽ khá thú vị
Chẳng phải musl đến giờ vẫn chưa hỗ trợ
pthread_attr_setaffinity_npsao? Nếu vậy một số phần mềm sẽ không chạy được, ví dụ lớn nhất là PyTorchTrong nhiều tình huống, sự đơn giản hoặc bảo mật là mối quan tâm quan trọng hơn hiệu năng
Điểm cân bằng hợp lý mà tôi tìm được giữa BSD và Linux là Slackware. Nó rất Unix một cách tự tin, không phức tạp, và còn có cây ports riêng phong phú thông qua Slackbuilds
Trước đây tôi thích nó vì đó là một distro tối thiểu không gây cản trở, và tôi xem nó hướng tới những người có kỹ thuật hơn một chút
Nhưng khi đào sâu vào vấn đề, cộng đồng đôi khi tỏ ra thù địch chỉ vì tôi không cài đặt đầy đủ. Lý do là cài đầy đủ là cách được khuyến nghị, và nếu không làm vậy thì sẽ gặp những vấn đề phụ thuộc ngớ ngẩn kiểu mplayer không chạy vì thiếu samba
Tôi thấy Alpine là một cải tiến so với Slackware ở mọi mặt
Hóa ra Alpine Linux thực ra không phải GNU/Linux. Tôi không biết điều đó
Vậy thì là BusyBox/Linux à?