1. Suckless
Suckless community là một cộng đồng những người đam mê công nghệ và từ chối xu hướng trở nên "béo phì" (bloat) của các phần mềm hiện tại (một phần mềm làm đủ thứ chức năng, phức tạp và khó bảo trì, nhiều khả năng chứa lỗ hổng).
Suckless philosophy có thể được xem như chủ nghĩa tối giản trong thế giới phần mềm. Sản phẩm của họ luôn có giới hạn về dòng code (điều này khiến tất cả chức năng họ muốn thêm vào phần mềm của mình đều phải được cân nhắc kỹ lưỡng) và tuân theo Unix Philosophy, triết lý này có thể được tóm gọn như sau:
Write programs that do one thing and do it well. Write programs to work together.
Phần mềm chỉ làm đúng duy nhất việc của mình, và làm việc đó thật tốt. Các phần mềm chuyên dụng phối hợp với nhau để làm việc.
Đây chỉ là bản tóm tắt cực kỳ đơn giản của tôi về Unix Philosophy, để hiểu rõ hơn về triết lý này hãy tìm hiểu thêm trên mạng nhé. Tóm lại các phần mềm của Suckless là vậy, không cầu kỳ, không cố trở nên phức tạp, xác định đúng trách nhiệm của mình và làm nó một cách tốt nhất có thể!
2. Bài viết này có gì?
Tôi sẽ dành riêng bài viết này để nói về cách cài đặt các phần mềm của Suckless. Vì không đơn giản như các phần mềm khác trên Linux chỉ cần dùng một hoặc vài câu lệnh để cài đặt, phần mềm Suckless đòi hỏi bạn phải biên dịch (compile) từ mã nguồn. Trên website này, tôi đã có một vài bài viết về các phần mềm của Suckless:
Việc cài đặt các gói cần thiết (dependencies), tải mã nguồn sẽ tùy thuộc vào mỗi phần mềm nên tôi sẽ không nhắc đến ở đây. Bài viết này tôi sẽ nói về các bước chung của phần mềm Suckless.
3. Patch - Bản vá
3.1. Khái niệm
Bản chất những phần mềm của cộng đồng Suckless lúc ra lò cực kỳ đơn giản vì thế khó lòng đáp ứng nhu cầu của người dùng. Điều này là chủ ý của họ, họ cung cấp một phần mềm mang tính nền móng, tối giản, cực kỳ ổn định (stable) và làm tốt nhiệm vụ của mình. Phần còn lại như thêm bớt các tính năng, tinh chỉnh, tùy biến giao diện… là do toàn quyền người dùng quyết định. Những sửa đổi tùy biến màu sắc, phím tắt đơn giản đối với tôi nên được gọi là tinh chỉnh.
Patch là những thay đổi về mặt chức năng, các hàm, phần cốt lõi và tinh vi hơn trong mã nguồn. Khái niệm patch (có thể hiểu là bản vá, chỉnh sửa) là một thứ xa lạ với người dùng máy tính phổ thông, nếu bạn thấy khó hiểu và có phần e ngại thì đừng lo! Hồi mới dùng các phần mềm của Suckless tôi cũng không hiểu gì cả… Vì tâm lý người dùng trước giờ dạng như mỳ ăn liền, tải về dùng ngay. Chuyển sang các phầm mềm Suckless không thể không bỡ ngỡ, vì giống như được trao một đặc quyền là trước giờ chưa từng được nắm giữ, tùy chỉnh 100% phần mềm của mình, từng dòng code một!
Tôi có thói quen cài đặt các patches theo thứ tự độ phức tạp giảm dần. Nghĩa là tôi sẽ xem file diff của từng patch, xem độ dài ngắn, mức độ phức tạp (thay đổi file gốc nhiều hay ít) để rồi sẽ cài đặt những patches phức tạp trước. Đây là một kinh nghiệm tôi học được sau nhiều lần làm việc với các phần mềm Suckless. Tin tôi đi, khi các patches phức tạp được cài đặt từ đầu, việc cài các patches đơn giản về sau là dễ hơn nhiều!
3.2. Cơ chế
Các patches sẽ được lưu dưới định dạng file diff (có thể là viết tắt của differences?). Nó đơn giản chỉ là file thể hiện những thay đổi của các văn bản, khi một người chỉnh sửa mã nguồn của phần mềm, họ sẽ dùng lệnh diff
để so sánh mã nguồn cũ với mã nguồn mới và xuất ra file diff. Bạn chỉ cần chú ý:
Tên của file được so sánh
Vị trí diễn ra thay đổi trong các files
Dòng có dấu “+” thì copy vào file gốc
Dòng có dấu trừ “-” thì xóa đi
Để cài đặt patch bằng lệnh, tất nhiên chúng ta cần lệnh patch
. Lệnh này có thể được cung cấp thông qua gói base-devel
trên Arch Linux và Void Linux, build-essential
trên Debian, Ubuntu… Hoặc trên máy của tôi (chạy Void Linux), patch
sẽ được cài riêng lẻ không theo một gói meta (meta-package) nào cả bằng lệnh sudo xbps-install -S patch
.
These packages (meta-packages) do not contain actual software, they simply depend on other packages to be installed.
Meta-packages có thể hiểu đơn giản là gói của các gói. Nó là một chiếc hộp chứa các gói khác, bản thân nó không là gì cả, chỉ là một tên gọi để các Trình quản lý gói (Package Manager) hiểu là hãy cài đặt cả thảy những gói này nhé!
4. Cài đặt
Sau khi đã áp các patch thành công vào mã nguồn, việc tiếp theo cần làm là cài đặt nhân vật chính (dwm, dmenu, st…) lên máy để đưa vào sử dụng.
4.1. Chuẩn bị
Bước này yêu cầu trên máy của bạn phải có make
, một phần mềm dùng để bảo máy tính thực hiện lần lượt các bước trong Makefile
— một file kịch bản. Để cài đặt make
một cách đơn giản, hãy cài đặt các gói như sau:
# Debian/Ubuntu/PopOS:
sudo apt install build-essential
# Arch Linux:
sudo pacman -Sy base-devel
# Void Linux
sudo xbps-install -S base-devel
4.2. Chạy thử
Trước hết hãy chắc chắn rằng bạn đang trong thư mục chứa mã nguồn (thư mục chứa các files như config.def.h, Makefile, config.mk…). Sau đó chạy lệnh sau:
$ make
Lệnh này sẽ làm mọi thứ cần thiết để có một file binary bạn có thể chạy và dùng, chỉ có điều nó sẽ đặt mọi thứ vào folder chứa mã nguồn thay vì trên các folder thuộc hệ điều hành (/usr/local/
). Tại sao không cài thẳng lên máy luôn mà phải qua bước này?
Ghi chú | Ngay lúc này đây, trong thư mục mã nguồn của bạn đã có file binary của các phần mềm, ví dụ như đang làm việc với dmenu bạn có thể dùng lệnh |
Việc cài đặt lên máy yêu cầu bạn phải có quyền root, nghĩa là phải dùng lệnh sudo
. Khi chạy lệnh make
, máy tính sẽ copy file config.def.h thành config.h và sử dụng các cài đặt trong config.h để áp dụng cho phần mềm của bạn. Việc chạy make
bằng sudo
sẽ khiến file config.h thuộc quyền sở hữu của root, điều này là rất bất tiện khi muốn chỉnh sửa file này về sau.
Lưu ý | config.def.h Đây là file cài đặt gốc (original configuration file), có thể xem như file cài đặt mẫu. Mọi tinh chỉnh của bạn không nên xảy ra trong file này, vì khi có bản cập nhật mới trong mã nguồn, config.def.h sẽ thay đổi gây ra mâu thuẫn với các cài đặt của bạn. Thay vào đó, hãy làm mọi thứ bạn muốn trong config.h, khi có cập nhật trong config.def.h hãy tự cập nhật config.h theo file mẫu. Đây là một thói sử dụng phần mềm Suckless gần đây mà tôi học được, tin tôi đi, nó sẽ giúp bạn tránh được nhiều phiền phức đấy! |
Do đó tôi sẽ chạy lệnh make
trước hết, để đảm bảo file config.h thuộc quyền sở hữu của tôi, sau này chỉnh sửa sẽ không cần rườm rà sudoedit
hay sudo vim
…
4.3. Cài chính thức
Sau khi đã chạy lệnh make
để chạy thử và chuẩn bị, hãy vào config.h để tinh chỉnh mọi thứ bạn muốn:
Phím tắt
Giao diện
Tính năng
…
Một khi đã xong xuôi, để chính thức cài đặt phần mềm lên máy, hãy chạy lệnh sau:
$ sudo make clean install
Để hiểu rõ lần lượt từng thao tác máy tính của bạn sẽ làm trong lệnh này, hãy mở file Makefile
lên và đọc qua nhé! Tóm lại, lệnh này sẽ làm các bước sau:
Biên dịch các file mã nguồn (source code) thành file nhị phân (binary)
Tạo các thư mục cần thiết
Sao chép các files vào đúng nơi của chúng trong
/usr/local/
File binary sẽ nằm trong
/usr/local/bin/
File manual (hướng dẫn) sẽ nằm trong
/usr/local/share/man/
Chính vì đã được copy vào /usr/local/bin/
, một trong những folder thuộc $PATH
, sau khi chạy lệnh này, bạn sẽ có thể chạy phần mềm của mình bất cứ đâu bạn muốn.
5. Không cần root (Không khuyến cáo)
Cảnh báo | Đây là một bước tôi thường làm nhưng gần đây khi hiểu hơn về nguyên lý hoạt động của các phần mềm Suckless, tôi không còn làm điều này nữa. Tôi khuyến cáo bạn chỉ đọc tham khảo cho vui thôi nhé! |
Mặc định khi cài đặt các files sẽ được chuyển đến /usr/local
, điều này đòi hỏi ta phải thực hiện các thao tác bằng người dùng root
. Để né tránh việc sử dụng root
, ta có thể chuyển thư mục cài đặt thành $HOME/.local
.
Lưu ý | Để đảm bảo bước này thành công, bạn phải chắc chắn rằng trong
Nếu trong chuỗi kết quả không có đoạn
Một lưu ý nhỏ là việc thay đổi này sẽ khiến chỉ có người dùng bạn dùng để compile các phần mềm mới có thể dùng chúng, những người dùng khác trên hệ thống nếu muốn dùng sẽ phải tự compile một bản cho riêng mình. |
Trong file config.mk có một dòng như sau:
PREFIX = /usr/local
Để thay đổi vị trí cài vào $HOME/.local
, bạn có thể dùng lệnh:
$ sed -i 's/^PREFIX =.*$/PREFIX = \/home\/$(shell whoami)\/.local/' config.mk
Lệnh sed
này sẽ tìm trong file config.mk dòng bắt đầu bằng PREFIX =
và thay cả dòng đó thành PREFIX = /home/$(shell whoami)/.local
. Khi bạn chạy lệnh make install
. Biến PREFIX
sẽ được khởi tạo, bên trong biến này có cụm $(shell whoami)
sẽ dùng kết quả của lệnh whoami
lấp vào chỗ đó.
Ghi chú |
|
Nghĩa là biến PREFIX
lúc này sẽ là /home/<tên người dùng>/.local
. Thế là xong, sau này mỗi lần cài đặt không cần phải dùng root
nữa.
6. Kết lại
Thế là tôi đã nói hết những gì tôi học được sau hơn một năm sử dụng và làm việc với các phần mềm Suckless. Để tìm hiểu chi tiết hơn về từng phần mềm một, hãy đọc các bài viết tôi viết riêng về chúng nhé!