Suckless

Về phần mềm Suckless
Mục lục

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 ./dmenu để chạy dmenu mà không cần làm gì thêm.

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 $PATH của mình có địa chỉ $HOME/.local/bin. Nếu không sau khi cài đặt st sẽ không xuất hiện cho chúng ta khởi chạy. Để kiểm tra, hãy thử nhập lệnh này:

echo $PATH

Nếu trong chuỗi kết quả không có đoạn /home/<tên người dùng>/.local/bin thì hãy thêm dòng sau vào ~/.bash_profile (nếu bạn dùng shell khác thì chắc đã không cần tôi giải thích bước này).

export PATH=$HOME/.local/bin:$PATH

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ú

whoami là lệnh để tra cứu tên người dùng hiện tại, bạn có thể nhập vào terminal của mình lệnh này để thử.

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é!

Ngày 12 tháng 6, 2024

#tech

Tìm kiếm