Bạn có thường xuyên gặp phải tình huống tìm thấy một ứng dụng thú vị nhưng lại không có sẵn cho bản phân phối Linux mà bạn đang sử dụng? Phản ứng tiếp theo của bạn có lẽ là tìm cách cài đặt nó qua Brew, Flatpak hoặc Snap, nhưng thường thì không phải lúc nào cũng thành công.
Sự phân mảnh trong hệ sinh thái quản lý gói phần mềm trên Linux là một vấn đề lớn. Một số bản phân phối có chung định dạng gói – dù thường không tương thích; trong khi những bản khác lại sử dụng hệ thống đóng gói hoàn toàn khác biệt. Flatpak và Snap đã cố gắng giải quyết vấn đề này, nhưng điều chúng làm là tạo ra thêm các tiêu chuẩn mới thay vì kết nối những tiêu chuẩn hiện có. Thay vì tạo ra nhiều tiêu chuẩn hơn, chúng ta nên kết hợp các tiêu chuẩn đã có sẵn – và đó chính là lúc Distrobox xuất hiện.
Các Phần Mềm Nền Tảng Của Distrobox
Trước khi giải thích sâu về Distrobox, bạn cần hiểu rõ một số phần mềm mà nó dựa vào: Docker và Podman. Docker là một chương trình phần mềm giúp cô lập các tiến trình vào các container riêng biệt. Thông thường, các tiến trình này không thể tương tác với hệ thống bên ngoài container. Container được xây dựng dựa trên các nguyên thủy của Linux như namespaces và control groups. Tuy nhiên, bạn không cần quá lo lắng về các chi tiết kỹ thuật; chỉ cần nhớ rằng một container có nhiệm vụ cô lập các tiến trình.
Chúng ta gọi Docker là một container runtime. Podman là một container runtime khác có giao diện và hoạt động giống hệt Docker, nhưng có một điểm khác biệt quan trọng: Podman không chạy các container với quyền root (theo mặc định); điều này rất quan trọng, như bạn sẽ sớm tìm hiểu. Docker và Podman gần như giống hệt nhau, vì vậy bạn có thể theo dõi một hướng dẫn cơ bản về Docker và áp dụng gần như mọi thứ cho Podman.
Distrobox Hoạt Động Như Thế Nào?
Danh sách các container Distrobox được tạo trên terminal Linux
Distrobox làm mờ ranh giới giữa các bản phân phối và tận dụng các công cụ hiện có để cài đặt các gói phần mềm đa phân phối. Distrobox gói gọn trình quản lý container mà bạn chọn (tức là Podman, Docker hoặc Lilypod) để chạy các tiến trình bên trong một container. Khi bạn thực thi một lệnh Distrobox, nó sẽ ủy quyền cho trình quản lý container nền tảng.
Nhưng tại sao lại như vậy? Khác với Docker, Podman, v.v., Distrobox tích hợp chặt chẽ các tiến trình được container hóa với hệ thống của bạn; chúng có thể đọc thư mục home của bạn, nhìn thấy các tiến trình khác và thậm chí giao tiếp với chúng. Distrobox tự động cấu hình container phức tạp cho bạn, giúp nó chạy các ứng dụng – trong một container Docker hoặc Podman – một cách liền mạch với hệ thống host.
Mục tiêu của một container runtime là cô lập tiến trình; mục tiêu của Distrobox là tích hợp chặt chẽ với ít cấu hình.
Tài liệu chính thức của Distrobox làm rõ “tích hợp chặt chẽ” với các chi tiết kỹ thuật:
…tích hợp liền mạch với phần còn lại của hệ điều hành bằng cách cung cấp quyền truy cập vào thư mục home của người dùng, các socket Wayland và X11, mạng, thiết bị di động (như USB), nhật ký hệ thốngd, SSH agent, D-Bus, ulimits, /dev và cơ sở dữ liệu udev, v.v…
Tại Sao Nên Dùng Podman Thay Vì Docker?
Bạn nên sử dụng Podman làm trình quản lý container vì theo mặc định, nó chạy các container dưới dạng người dùng không có đặc quyền, trong khi Docker chạy chúng dưới quyền root. Tại sao đó lại là một vấn đề? Các tiến trình được container hóa thừa hưởng đặc quyền của container của chúng – điều này phức tạp hơn một chút, nhưng đó là ý tưởng chung. Distrobox tích hợp chặt chẽ các container với hệ thống host; bất kỳ tiến trình nào chạy bên trong một container có quyền root có thể có toàn quyền truy cập vào hệ thống của bạn.
Distrobox sẽ nhắc bạn đặt mật khẩu cho container nếu bạn chạy nó với quyền root, điều này cung cấp một mức độ bảo vệ, nhưng nó chưa phải là một giải pháp hoàn hảo.
Hướng Dẫn Cài Đặt Podman
Podman có sẵn trên ít nhất hàng chục bản phân phối. Các lệnh sau đây áp dụng cho những bản phổ biến nhất.
Đối với Debian và các bản phân phối phái sinh của nó (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get install podman
Đối với các bản phân phối phái sinh của Red Hat (ví dụ: Fedora, v.v.):
sudo dnf install podman
Đối với Arch Linux và các bản phân phối phái sinh của nó:
sudo pacman -S podman
Bạn có thể sẽ thấy Podman có sẵn trong các kho lưu trữ mặc định của bản phân phối. Điều quan trọng nhất là bạn phải cấu hình nó cho chế độ không có quyền root (rootless mode). Thật không may, đối với một số bản phân phối, điều này có thể yêu cầu cấu hình thủ công. Hãy tham khảo tài liệu hướng dẫn của bản phân phối của bạn vì quy trình khác nhau cho từng bản.
Hướng Dẫn Cài Đặt Distrobox
Distrobox có sẵn cho hơn 30 bản phân phối, vì vậy sau khi bạn đã cài đặt Podman (hoặc Docker), hãy tiến hành cài đặt Distrobox bằng trình quản lý gói của bản phân phối của bạn. Dưới đây là các lệnh cài đặt cho các bản phân phối phổ biến nhất.
Đối với Debian và các bản phân phối phái sinh của nó (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get install distrobox
Đối với các bản phân phối phái sinh của Red Hat (ví dụ: Fedora, v.v.):
sudo dnf install distrobox
Đối với Arch Linux và các bản phân phối phái sinh của nó:
sudo pacman -S distrobox
Nếu Distrobox không có trong kho lưu trữ của bản phân phối của bạn, bạn có thể sử dụng lệnh curl sau:
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh
Các hành động như curl … | sh có thể chứa và chèn các lệnh độc hại; luôn xác nhận nhà cung cấp và xem xét kỹ tập lệnh trước khi chạy.
Bây giờ bạn phải đặt Podman làm trình quản lý container trong tệp cấu hình Distrobox. Chạy lệnh sau, nhưng hãy cẩn thận vì nó sẽ ghi đè lên bất kỳ tệp cấu hình hiện có nào:
echo 'container_manager="podman"' > ~/.distroboxrc
Bây giờ bạn đã sẵn sàng.
Tạo Container Distrobox Đầu Tiên Của Bạn
Các container lưu trữ các thay đổi của bạn, và chúng là một lớp mỏng nằm trên các image bất biến. Các image cung cấp hệ thống cơ sở của bản phân phối. Khi kết hợp, chúng cung cấp một hệ thống hoàn chỉnh. Các gói đã cài đặt của bạn sẽ nằm bên trong một container. Distrobox tích hợp thư mục home của container vào thư mục home của bạn trên host, để các tệp cấu hình gói của bạn sẽ nằm ở đó.
Khi bạn chạy lệnh sau, nó sẽ tạo một container từ image mặc định:
distrobox create -n my-container
Tuy nhiên, trong suốt quá trình hướng dẫn này, chúng ta sẽ sử dụng Arch Linux:
distrobox create --name my-arch --image archlinux:latest
Lệnh tạo container Arch Linux bằng Distrobox trên terminal
Bạn có thể tạo một container bằng bất kỳ image nào bạn muốn – ví dụ, Debian:
distrobox create --name my-debian --image debian:latest
Hoặc bạn có thể tạo một container Fedora:
distrobox create --name my-fedora --image fedora:latest
Đừng làm gián đoạn quá trình tạo container; nếu không, nó có thể bị hỏng và bạn sẽ cần tạo lại.
Distrobox hỗ trợ hơn 30 bản phân phối cho các container, mỗi bản hỗ trợ nhiều bản phát hành và phiên bản. Ngoài ra, nếu bạn đã quen thuộc với Toolbox, bạn cũng có thể sử dụng các image của chúng. Distrobox duy trì một danh sách lớn các tên image để tiện lợi cho bạn.
Cách Cài Đặt Ứng Dụng Trong Container Distrobox
Các container là một môi trường mà bạn cần kích hoạt. Tất cả các lệnh tiếp theo sẽ được thực thi bên trong container.
distrobox enter my-arch
Bạn có thể thử nghiệm với hệ thống này để làm quen. Khi hoàn tất, gõ exit.
Terminal hiển thị lệnh truy cập vào container Distrobox
Tuy nhiên, thay vì vào container để cài đặt gói, thường tốt hơn là chạy một lệnh một lần (one-shot command). Ở đây chúng ta sẽ cài đặt Firefox, mà chúng ta sẽ thực thi sau một chút:
distrobox enter my-arch -- sudo pacman -S firefox
Cài đặt trình duyệt Firefox vào container Arch Linux qua Distrobox
Nếu bạn đã tạo một container cho bản phân phối khác, bạn có thể sử dụng một trong các lệnh sau.
Đối với Debian và các bản phân phối phái sinh của nó (ví dụ: Ubuntu, Mint, v.v.):
distrobox enter my-container-name -- sudo apt-get install firefox
Đối với các bản phân phối phái sinh của Red Hat (ví dụ: Fedora, v.v.):
distrobox enter my-container-name -- sudo dnf install firefox
Nếu bạn gặp khó khăn với các lệnh cài đặt, bạn nên tìm hiểu cách cài đặt và gỡ bỏ phần mềm qua terminal trước.
Khi sử dụng Podman, lệnh sudo
hoạt động bình thường. Podman chạy các container dưới dạng người dùng không có đặc quyền (rootless) theo mặc định. Tất cả các tiến trình bên trong container (bao gồm cả sudo) không thể có đặc quyền cao hơn chính container đó. Điều này giúp bảo vệ hệ thống host của bạn.
Cách Chạy Ứng Dụng Trong Container Distrobox
Để chạy Firefox mới cài đặt của bạn, hãy chạy:
distrobox enter my-arch -- firefox
Chạy trình duyệt Firefox bên trong container Distrobox Arch Linux
Lệnh trước đó không trả quyền kiểm soát lại cho terminal cho đến khi Firefox thoát; nó cũng khá dài. Thay vào đó, bạn nên sử dụng một alias. Trong tệp cấu hình shell của bạn, hãy gõ:
alias firefox="distrobox enter my-arch -- nohup firefox >/dev/null"
Bạn có thể đặt tên alias này tùy ý.
Một trong những tính năng hữu ích nhất của Distrobox là các gói đồ họa hoạt động mà không cần cấu hình bổ sung. Nó hoạt động với cả X11 hoặc Wayland. Distrobox cũng hỗ trợ tăng tốc GPU; nếu bạn quan tâm đến điều đó, bạn nên tham khảo tài liệu hướng dẫn của Distrobox.
Cách Hiểu Về Các Container Distrobox
Như đã đề cập trước đó, các container là một lớp nằm trên một image. Distrobox chia sẻ các image giữa nhiều container. Ví dụ, khi bạn tạo một container dựa trên Debian:
distrobox create --name deb-1 --image debian:latest
Nó sẽ kéo một image Debian xuống, sử dụng nó làm hệ thống cơ sở, sau đó tạo một container trên đó. Khi bạn tạo thêm hai container:
distrobox create --name deb-2 --image debian:latest
distrobox create --name deb-3 --image debian:latest
Cả hai container này sẽ sử dụng cùng một image Debian bất biến, nhưng mỗi container là riêng biệt. Việc cài đặt một gói vào deb-1 có nghĩa là nó sẽ không tồn tại trong deb-2 hoặc deb-3. Tuy nhiên, chúng sẽ chia sẻ cùng một tệp cấu hình, nằm trong thư mục home của host của bạn.
Bạn có thể tự hỏi liệu mình nên tạo một container hay nhiều container. Nhìn chung, hãy tạo một container cho mỗi bản phân phối bạn sử dụng. Ví dụ, có một gói trong AUR (một kho phần mềm do cộng đồng duy trì cho Arch Linux) mà bạn muốn, vì vậy bạn tạo một container Arch; có ba gói trong kho Debian, vì vậy bạn tạo một container Debian duy nhất và đặt cả ba gói vào đó. Tuy nhiên, có thể có những trường hợp xảy ra xung đột phần mềm – ví dụ, các phiên bản khác nhau của cùng một gói; đây là một kịch bản lý tưởng để tạo các container riêng biệt.
Các Lệnh Distrobox Hữu Ích Khác Cần Biết
Tài nguyên hữu ích nhất cho các lệnh luôn là menu --help
:
distrobox --help
Bạn có thể nhận trợ giúp về các lệnh cụ thể bằng cách thêm cờ --help
vào sau lệnh đó. Ví dụ, để nhận trợ giúp cho lệnh create
:
distrobox create --help
Tạo Container Tạm Thời
Để kiểm tra nhanh một điều gì đó, bạn có thể sử dụng các container tạm thời. Distrobox sẽ tự động xóa chúng sau khi hoàn thành:
distrobox ephemeral
Hãy lưu ý rằng chúng khởi động chậm hơn vì chúng phải được khởi tạo – điều này tương tự như việc tạo một container mới.
Xem distrobox ephemeral –help để biết thêm các tùy chọn.
Quản Lý Container
Bạn nên coi các container Distrobox như một hệ thống con; điều này bao gồm việc tạo, khởi động, dừng, xóa, cập nhật và nói chung là bảo trì các container. Dưới đây là danh sách các lệnh phổ biến giúp bạn thực hiện điều này.
Tại một thời điểm nào đó, bạn sẽ muốn biết những container nào tồn tại trên hệ thống của bạn:
distrobox ls
Có lẽ bạn muốn xóa một container. Trước khi làm điều đó, bạn có thể muốn dừng nó trước, sau đó xóa nó:
distrobox stop my-container
distrobox rm my-container
Các lệnh dừng và xóa container Distrobox trên terminal
Không nhất thiết phải dừng container trước khi xóa nó, bởi vì Distrobox sẽ nhắc bạn buộc xóa nếu nó đang chạy.
Bạn gần như chắc chắn muốn giữ các container của mình được cập nhật. Để cập nhật tất cả chúng, hãy sử dụng:
distrobox upgrade --all
Hoặc để cập nhật một container cụ thể:
distrobox upgrade my-container
Nâng cấp tất cả các container Distrobox qua lệnh terminal
Lệnh nâng cấp sẽ sử dụng trình quản lý gói của container để cập nhật tất cả các gói của nó. Ngoài ra, mỗi container yêu cầu cập nhật thường xuyên. Khi bạn xóa một container, nó cũng xóa các bản cập nhật của nó.
Để gỡ cài đặt các gói, chỉ cần sử dụng trình quản lý gói cụ thể của bản phân phối cho container đó. Ví dụ, nếu bạn muốn gỡ cài đặt Firefox khỏi container Arch Linux mà chúng ta đã tạo trước đó, hãy sử dụng lệnh sau:
distrobox enter my-arch -- sudo pacman -R firefox
Lệnh gỡ cài đặt Firefox khỏi container Distrobox Arch Linux
Đối với các bản phân phối phái sinh của Red Hat (ví dụ: Fedora), hãy sử dụng:
distrobox enter my-conainer-name -- sudo dnf rm firefox
Đối với Debian và các bản phân phối phái sinh của nó, hãy sử dụng:
distrobox enter my-container-name -- sudo apt-get remove firefox
Cách Gỡ Cài Đặt Distrobox
Nếu bạn không thích Distrobox và muốn gỡ bỏ nó, dưới đây là các lệnh để thực hiện.
Nếu bạn đã sử dụng curl để cài đặt nó, thì bạn phải sử dụng lệnh curl này để gỡ bỏ nó:
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/uninstall | sudo sh
Nếu không, đối với Debian và các bản phân phối phái sinh của nó (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get remove distrobox
Đối với các bản phân phối phái sinh của Red Hat (ví dụ: Fedora, v.v.):
sudo dnf rm distrobox
Đối với Arch Linux và các bản phân phối phái sinh của nó:
sudo pacman -R distrobox
Một trong những điểm mạnh của Distrobox là khả năng tích hợp chặt chẽ với hệ thống host. Trong thế giới Docker, điều này ở một mức độ nào đó lại là một điểm yếu, bởi vì Docker muốn cô lập các tiến trình; Distrobox lại muốn tích hợp chúng – đây là sự khác biệt chính giữa chúng. Điều quan trọng nữa là phải hiểu sự khác biệt giữa việc chạy một container với quyền root và chạy một tiến trình được container hóa với quyền root. Chúng tôi đặc biệt khuyên dùng Podman vì nó hoạt động tốt hơn Docker với tư cách là một container runtime không có quyền root. Các nhà phát triển Distrobox cũng đồng ý với quan điểm này.
Hãy chú ý đến hai điểm chính này, bởi vì chúng rất quan trọng để bảo vệ hệ thống của bạn. Về cơ bản, hãy cẩn thận khi chạy một container với quyền root; đừng sau đó chạy các ứng dụng bên trong container đó với một tài khoản hạn chế – điều này mang lại cảm giác an toàn sai lầm và có thể dẫn đến leo thang đặc quyền.