Bạn 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 khả dụng cho bản phân phối Linux của mình? Trong những trường hợp như vậy, bạn có thể nghĩ đến việc cài đặt thông qua Brew, Flatpak, hoặc Snap, nhưng không phải lúc nào cũng thành công. Sự phân mảnh trong hệ thống quản lý gói phần mềm trên Linux là một vấn đề nan giải. Một số bản phân phối có chung định dạng gói nhưng 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 đã nỗ lực giải quyết vấn đề này, nhưng thực tế chúng chỉ tạo thêm nhiều tiêu chuẩn mới, khiến vấn đề trở nên phức tạp hơn. Thay vì liên tục tạo ra các tiêu chuẩn mới, chúng ta nên tìm cách kết hợp những tiêu chuẩn đã có sẵn – và đó chính là lúc Distrobox xuất hiện.
Các Nền Tảng Phần Mềm Mà Distrobox Sử Dụng
Trước khi đi sâu vào 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 dùng để cách ly các tiến trình vào các container riêng biệt; các tiến trình này thường 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. Bạn không cần phải quá lo lắng về các chi tiết kỹ thuật này, chỉ cần nhớ rằng một container sẽ cách ly các tiến trình.
Chúng ta gọi Docker là một container runtime (môi trường chạy container). Podman là một container runtime khác có giao diện và cách hoạt động gần như giống hệt Docker, nhưng có một điểm khác biệt quan trọng: Podman không chạy container với quyền root theo mặc định. Điều này rất quan trọng và bạn sẽ sớm nhận ra lý do. Docker và Podman gần như tương đồng, nên bạn hoàn toàn có thể áp dụng gần hết mọi kiến thức từ hướng dẫn cơ bản về Docker sang Podman.
Distrobox Hoạt Động Như Thế Nào?
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 bản phân phối. Distrobox bao bọc container runtime mà bạn đã chọn (ví dụ: 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 container runtime bên dưới.
Danh sách các Distrobox container đang hoạt động hiển thị trong cửa sổ terminal Linux.
Nhưng tại sao lại làm vậy? Khác với Docker, Podman, v.v., Distrobox tích hợp chặt chẽ các tiến trình trong container với hệ thống host 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 Docker hoặc Podman container – 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 các 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õ khái niệm “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ị rời (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 container runtime của mình 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 điều đó lại là vấn đề? Các tiến trình trong container sẽ kế thừa các đặc quyền của container đó – mặc dù 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 đều có thể có toàn quyền truy cập vào hệ thống của bạn.
Distrobox sẽ yêu cầu 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ó vẫn chưa phải là giải pháp hoàn hảo.
Cách Cài Đặt Podman
Podman có sẵn cho í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ân phối phổ biến nhất.
Đối với Debian và các bản phái sinh (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get install podman
Đối với các bản 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á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 của mình. Điều quan trọng nhất là bạn phải cấu hình nó cho chế độ rootless. Đáng tiếc, đối với một số bản phân phối, việc 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 tùy thuộc vào từng bản.
Cách 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. 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ái sinh (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get install distrobox
Đối với các bản 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á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
Lưu ý rằng 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 tập lệnh trước khi chạy.
Bây giờ bạn phải đặt Podman làm container runtime 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
Vậy là bạn đã sẵn sàng.
Tạo Distrobox Container Đầ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 trên các image bất biến. Các image cung cấp hệ thống cơ bản của bản phân phối. Khi kết hợp, chúng tạo thành 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 bài viết này, chúng ta sẽ sử dụng Arch Linux:
distrobox create --name my-arch --image archlinux:latest
Cửa sổ terminal Linux hiển thị lệnh tạo Arch Linux container bằng Distrobox và kết quả.
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 Fedora container:
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 nó.
Distrobox hỗ trợ hơn 30 bản phân phối cho 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 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 Distrobox Container
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ẽ 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, hãy nhập exit.
Lệnh để truy cập vào Distrobox container được hiển thị và đánh dấu trong terminal Linux.
Tuy nhiên, thay vì vào container để cài đặt mộ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 này:
distrobox enter my-arch -- sudo pacman -S firefox
Terminal Linux hiển thị lệnh cài đặt trình duyệt Firefox vào Arch Linux container của 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ái sinh (ví dụ: Ubuntu, Mint, v.v.):
distrobox enter my-container-name -- sudo apt-get install firefox
Đối với các bản 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. Rootless Podman chạy các container dưới dạng người dùng không có đặc quyền 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 đặc quyền cao hơn 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 Distrobox Container
Để chạy Firefox vừa cài đặt của bạn, hãy chạy:
distrobox enter my-arch -- firefox
Trình duyệt Firefox đang chạy bên cạnh cửa sổ terminal Linux với lệnh khởi chạy Firefox trong Distrobox container.
Lệnh trước đó không trả lại quyền kiểm soát 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 nhập:
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 của Distrobox.
Cách Tư Duy Về Distrobox Container
Như đã đề cập trướ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ở, và sau đó tạo một container trên đó. Khi bạn tạo thêm hai container nữa:
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 nên tạo một container hay nhiều container. Nói chung, hãy tạo một container cho mỗi bản phân phối mà bạn sử dụng. Ví dụ, có một gói trong AUR (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ó các 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
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
Để thử nghiệm nhanh một cái 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
Lưu ý rằng các container này khởi động chậm hơn vì chúng phải khởi tạo – 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 Distrobox container 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à duy trì các container. Dưới đây là danh sách các lệnh phổ biến giúp bạn làm điều này.
Tại một thời điểm nào đó, bạn sẽ muốn biết có những container nào tồn tại trên hệ thống của mình:
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 và kết quả hiển thị trong terminal Linux để dừng và xóa một Distrobox container.
Không nhất thiết phải dừng container trước khi xóa, 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ữ cho 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
Lệnh nâng cấp tất cả các Distrobox container được hiển thị trong terminal Linux.
Lệnh upgrade 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, bạn 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 Arch Linux container mà chúng ta đã tạo trước đó, hãy sử dụng lệnh sau:
distrobox enter my-arch -- sudo pacman -R firefox
Terminal Linux hiển thị lệnh cần thiết để gỡ cài đặt trình duyệt Firefox khỏi Arch Linux container của Distrobox.
Đối với các bản 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á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 để làm điều đó.
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ỡ cài đặt 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ái sinh (ví dụ: Ubuntu, Mint, v.v.):
sudo apt-get remove distrobox
Đối với các bản 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ái sinh của nó:
sudo pacman -R distrobox
Một trong những thế 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à một điểm yếu, vì Docker muốn cô lập các tiến trình; Distrobox muốn tích hợp chúng – đây là điểm 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 trong container 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 như một container runtime không cần quyền root. Những người duy trì Distrobox cũng đồng ý với quan điểm này.
Hãy chú ý đến hai điểm chính này, 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 bị 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.