Hexa's Blog

Hướng dẫn tinh gọn lại initramfs

13/09/2025 @ Saigon Linux

I. Điều gì đã xảy ra?

Trước khi đi sâu về mặt kỹ thuật, bạn cần hiểu lý do nào mà tôi cần phải tinh gọn, việc tạo ram file system image (initramfs.img) là mặc định khi update Fedora. Những việc này, người dùng như tôi, thường không phải đụng tay vào. Hoặc rất đen mới phải đụng tay vào.

Tuy nhiên, mọi thứ phát sinh sau khi tôi update lên kernel 6.16.5-200.fc42.x86_64, việc build initramfs tự động tạo ra file initramfs-6.16.5-200.fc42.x86_64.img với dung lượng hơn 300MB, và nó là quá nhiều với /boot vốn khi cài đặt mặc định chỉ có 1GB mà thôi.

$ ls -lah /boot
164M Aug 31 02:19 initramfs-6.16.3-200.fc42.x86_64.img
164M Sep 12 18:25 initramfs-6.16.4-200.fc42.x86_64.img
320M Sep 12 18:50 initramfs-6.16.5-200.fc42.x86_64.img

Bạn thấy chứ, có gì đó đã xảy ra, initramfs-6.16.5-200.fc42.x86_64.img có dung lượng cao đột biến so với các .img tiền nhiệm. Tôi có sử dụng nvidia driver tôi nghi ngờ rằng, nvidia driver đã được tích hợp vào initramfs theo cách không cần thiết, và thêm nữa, nó quá chiếm dung lượng.

Vốn dĩ, initramfs.img chỉ dùng ban đầu như là một bước mồi trước khi chroot (change root). Nó thực sự không cần:

  • Hình ảnh (nvidia, amd)
  • Âm thanh
  • Bluetooth
  • Internet

Nhân tiện, việc build initramfs.image sử dụng command dracut.

II. Cách liệt kê những module tích hợp trong initramfs

Cách 1: lsinitrd file.img

Ở cách này, chúng ta đã có file .img rồi, chúng ta muốn khám xem trong .img đang có cái gì.

$ lsinitrd initramfs-6.16.5-200.fc42.x86_64.img | grep "\.ko" | grep nvidia

usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia-drm.ko.xz
usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia.ko.xz
usr/lib/modules/6.16.5-200.fc42.x86_64/extra/nvidia-modeset.ko.xz

Có 3 module có chữ nvidia:

  • nvidia
  • nvidia-drm
  • nvidia-modeset

Một lần nữa, initramfs.img không cần graphic, những module này là không cần thiết.

Cách 2: Vào /lib/modules/KERNEL_VERSION/extra/

Mặc định, những module .ko (kernel object) phụ sẽ nằm ở /lib/modules/KERNEL_VERSION/extra/.

$ ls /lib/modules/6.16.5-200.fc42.x86_64/extra

nvidia-drm.ko.xz
nvidia.ko.xz
nvidia-modeset.ko.xz
nvidia-peermem.ko.xz
nvidia-uvm.ko.xz

Tôi không hiểu hay quan tâm tại sao nvidia-peermemnvidia-uvm không xuất hiện trong .img. Tuy nhiên, nó là đủ để hiểu dracut lấy các file kernel object nvidia từ đâu.

3. Cách bỏ qua‌/omit những module không cần thiết khi tạo initramfs

Để build .img mà bỏ qua những driver không cần thiết, ta sử dụng flag --omit-drivers trong dracut. Dưới đây là command build .img có loại trừ các driver sau:

  • nvidia-drm
  • nvidia
  • nvidia-modeset
  • nvidia-peermem
  • nvidia-uvm
$ dracut --omit-drivers "nvidia-drm nvidia nvidia-modeset nvidia-peermem nvidia-uvm" \
    initramfs-6.16.5-200.fc42.x86_64.img  6.16.5-200.fc42.x86_64

Nhìn dung lượng mới mà xem, 164MB.

$ du -h initramfs-6.16.5-200.fc42.x86_64.img
164M	initramfs-6.16.5-200.fc42.x86_64.img

4. Cài thiết lập mặc định cho dracut

Tất nhiên việc cứ tạo initramfs.img thủ công sau mỗi lần kernel update là rất bất tiện. Để can thiệp vào bước tự động hóa đang có, ta sẽ cần vào thư mục /etc/dracut.conf.d/ và tạo file omit-driver-nvidia.conf với nội dung như sau:

omit_drivers+=" nvidia-drm nvidia nvidia-modeset nvidia-peermem nvidia-uvm "

Sau khi tạo xong, việc chạy dracut sẽ không cần đến flag --omit-drivers nữa. Bên cạnh đó, khi Fedora OS update, nó cũng sẽ bỏ qua việc tích hợp nvidia module khi tạo initramfs.img.

$ dracut initramfs-6.16.5-200.fc42.x86_64.img 6.16.5-200.fc42.x86_64

Hi vọng ai đó có thể tiết kiệm được 2 phút cuộc đời nếu gặp vấn đề tương tự!

5. Reference

Cảm ơn Chatgpt đã giúp tôi hiểu thêm về dracutinitramfs.

Elixir expert (LSP), tản mạn xung quanh cách build

05/09/2025 @ Saigon Elixir

Hôm này ngày đẹp trời, tôi tò mò rất nhiều về expert - language server mới của elixir. Xem một hồi về cách build, tôi học thêm được nhiều cái mới.

1. Just

Just có mục đích tối thượng là giúp giảm thời gian dev gõ command. Để làm việc đó, nó sẽ cho phép bọc nhiều shell command lại, và tạo command tương đương, là tôi thì tôi sẽ gọi là alias command. Trong repo, những thiết lập này nằm trong justfile.

Cùng xem thử một đoạn nhé:

[doc('Run mix deps.get for the given project')]
deps project:
    #!/usr/bin/env bash
    cd apps/
    mix deps.get

just command được tạo ra sẽ có tên là deps, nó bọc lại một danh sách các shell command sau:

  • cd apps/
  • mix deps.get

Điều này có nghĩa là nếu bạn siêng, bạn sẽ gõ 2 lệnh, còn nếu bạn dùng just, bạn sẽ chỉ cần chạy just deps project.

Cá nhân tôi, lần đầu biết đến just, mix project của tôi thường nằm ngay repo root / thành ra chưa có nhu cầu. Tuy nhiên, đáng để ghi nhớ.

Trường hợp ở trên, mix project nằm ở trong /apps‌/, thành ra khá bất tiện.

2. Zig

Zig thì là một ngôn ngữ lập trình luôn! Tôi không hiểu tại sao cái repo 99% là viết bằng elixir, nhưng lại cần đến zig. Đoạn này tôi mù mịt rồi rồi nên phải nhờ chatGPT.

  • Zig chỉ đóng vai trò hỗ trợ khi đóng gói/bundling, cụ thể là với burrito(tôi sẽ nói ở ngay sau)
  • Nếu mà chỉ cần tạo ra release với mix release đơn thuần (cái loại mà tạo ra nhiều thư mục, file, kèm theo runtime), Zig là hoàn toàn không cần thiết.

3. Burrito

Burrito có mục đích lớn nhất là tạo ra một file executable duy nhất cho mix project. Bạn nhớ cái mix release truyền thống chứ, nó bao gồm (erlang runtime, nhiều file, thư mục đi kèm), Burrito thì ngược lại, nó sẽ build ra chỉ một file executable duy nhất.

Bạn còn nhớ thằng Zig ở trên chứ, nó giúp Burrito tạo ra executable file phù hợp cho đa nền tảng (linux, mac, window). Zig nó kết nối(link), đóng gói những header .h và file liên quan vào.

Kết quả là với cùng một source code expert - language server, chúng ta có phiên bản cho

  • expert_windows_amd64.exe (window)
  • expert_linux_arm64 (linux + chip kiến trúc arm64)
  • expert_linux_amd64 (linux + chip kiến trúc amd64)
  • expert_darwin_arm64 (macos + chip kiến trúc arm64)
  • expert_darwin_amd64 (macos + chip kiến trúc amd64)

Xem danh sách mới nhất ở đây: Expert Releases

Chuyện của ông ngoại - 1

Lời đầu tiên, anh muốn nói lời cảm ơn em Nguyễn Xuân Mai (Bống) đã ghi chép lại câu chuyện của ông ngoại. Bài viết này chỉ đơn giản là phiên bản số hóa từ ghi chép của em Bống.


I. Kính viếng hương hồn cậu

Tôi viết truyện này xảy ra 72 năm về trước, tại đình làng Chèm, huyện Từ Liêm, Hà Nội.

Tôi có bốn người cậu, hai cậu đã hi sinh trong cuộc kháng chiến chống Pháp.

Cậu Hoàng Viên đã tốt nghiệp trường Trung học Albert Sarraut, tham gia Vệ Quốc Đoàn, đóng lại làng Chèm, hi sinh năm 1946.

Cậu Hoàng Tâm,tốt nghiệp trường trung học Chu Văn An, hi sinh tại chiến trường Cao-Bắc-Lạng.

Năm 1946, phát xít Nhật đầu hàng quân đồng minh. Quân đội Tưởng Giới Thạch kéo vào Đông Dương, giải giáp vũ khí Nhật. Quân Tưởng với khẩu hiệu: "Diệt Cộng Cầm Hồ". Chúng cướp bóc, sát hại phụ nữ, trẻ thơ Việt Nam.

Hành động của chúng đã lọt vào mắt người biệt động thành Hoàng Lan (bí danh)

Bọn Tưởng lừa bà con vào sân đình, lôi ra một người nông dân 35 tuổi và một em bé 14 tuổi, hãm hiếp cho tới chết và vứt xác xuống ao. Bà Hoàng Lan cùng cậu Hoàng Viên bày kế hoạch bắt chúng trả nợ máu.

Sáng hôm sau, trong vai người bán rượu, bà mời cho bọn Tưởng uống say và trói chúng, thu vũ khí và vứt xác xuống sông.

Có một điều không ngờ đã xảy ra, một tên Tưởng cới trói được về báo cáo với bọn Tưởng. Chính phủ cụ Hồ quyết định tử hình bảy người tại bến Chèm.

Đêm hôm trước thi hành án, bố tôi, cụ Nguyễn Xuân Tuyết (lão thành cách mạng), cụ Lưu Quyên (trưởng ban tạp chí Cộng Sản) đã có ý định giải thoát cho cậu tôi, bằng cách thay thế người khác. Cậu Hoàng Viên trả lời: “Em làm em chịu, cho em hỏi thăm Hoàng Lan”.

Cuộc hành hình diễn ra sáng hôm sau tại bến Chèm, có sự chứng kiến của mợ Lan, cụ Nguyễn Xuân Tuyết, cụ Lưu Quyên.

Sau này, cậu Hoàng Viên được công nhận là liệt sĩ và quy tập về nghĩa trang Mai Dịch, Hà Nội.

Tháng 10 năm 1953, tôi tình cờ gặp được mợ Hoàng Lan tại nhà bà ngoại. Một người phụ nữ mảnh mai, rắn rỏi, đôi mắt sáng hiền và đượm buồn man mác.

Mợ Hoàng Lan nói với bà ngoại tôi: “Con xin làm con dâu của mẹ” Bà ngoại trả lời: “Thằng Viên nó chết vì dân, vì nước. Con phải lập gia đình để có người trả thù cho nó”

Mợ Lan khóc trong khói hương, nước mắt chảy trên gò má
Từ ngày đó qua đi, tôi không còn được gặp mợ, thấy mợ
Tôi có trở lại làng Chèm, hỏi thăm vài bà cùng trang lứa với mợ, họ cho biết bà là biệt động thành, sau này không lấy chồng và đi tu tại chùa Yên Tử.

Câu chuyện này con viết ra đây, nếu mợ còn sống hãy cho con biết được nhé. Con, Hoàng Nhu, giảng viên Vật Lý Đại Học Quốc Gia, số nhà 28, ngõ 255, Nguyễn Khang, Hà Nội.

Tôi tìm được một người đồng đội với cậu tôi là ông Quý, xóm Tre, làng Cót, Yên Hòa, Cầu Giấy, biết chuyện này.

Tập sau xin đăng tiếp.

Hoàng Nhu
27/7/2019


II. Thơ: Đi tìm cậu

Lên cao ngắm nhìn trời
Mây trôi nước trôi
Cả một dòng đời
    Trôi theo thời gian
        Trôi mãi

Công sự ngày xưa lô cốt ngày xưa
    Tan thành hết
Xa xa phía chân trời
    Cậu nằm lại

Cho đất trời giao nhau
Cho đôi lứa chụm đầu
Cho tình yêu dịu ngọt
Cho đất trời đắm say
    Mợ đứng đợi
        Cây vọng phu - thời đại

        Hoàng Nhu
        27/7//2019

III. Hình ảnh chép tay, bằng chứng

[1] Ảnh 1
[1] Ảnh 1
[2] Ảnh 2
[2] Ảnh 2
[3] Ảnh 3
[3] Ảnh 3

IV. Trích dẫn, tài liệu liên quan

SQL Join Visualized (repost)

28/08/2025 @ Saigon SQL

I write this post because:

  • The original blog hosting provider is having error, I cannot enlarge the summary image. link.
  • It’s super useful.

SQL Join Visualized
SQL Join Visualized

All credit goes to C.L. Moffatt. Thank you so much!

References

Discord setup script

18/08/2025 @ Saigon Linux

I am tired downloading Discord discord.tar.gz and setup manually when it has new version! This post is all about doing it automatically!

#!/bin/zsh
discord_setup() {
    DISCORD_DIRECTORY=/home/nguyenvinhlinh/Software/Discord # change it to yours
    echo "Create directory $DISCORD_DIRECTORY"
    mkdir -p $DISCORD_DIRECTORY;
    echo "Remove temporary files: /tmp/discord.tar.gz"
    /usr/bin/rm -rf /tmp/discord.tar.gz;
    echo "Remove temporary files: /tmp/Discord/"
    /usr/bin/rm -rf /tmp/Discord/;
    echo "Remove old discord files: $DISCORD_DIRECTORY/*"
    /usr/bin/rm -rf /home/nguyenvinhlinh/Software/Discord/*;
    echo "Download discord and save to /tmp/discord.tar.gz";
    wget -O /tmp/discord.tar.gz "https://discord.com/api/download?platform=linux&format=tar.gz"
    echo "Extract discord.tar.gz to /tmp/Discord"
    tar -xf /tmp/discord.tar.gz --directory /tmp/;
    echo "Copy new Discord files to $DISCORD_DIRECTORY/"
    cp -r /tmp/Discord/* /home/nguyenvinhlinh/Software/Discord/;
}

Then, when you want to update your Discord, you can open your terminal and execute discord_setup.

Good luck!

Optimizing MPV for Wayland and Nvidia

15/08/2025 @ Saigon Linux

I. What is it?

MPV is my favorite open source media player. On Fedora 42, the default display manager is Wayland (as a replacement for X11). MPV does not play well with Wayland, playing videos is delay/lagging. In addition, I am using an NVIDIA graphic card 3080. it could be a reason that my video playing is delay.

This post is all about customize mpv’s flags to work with Wayland and NVIDIA graphic card.

II. How to do?

Go to ~/.local/share/applications and create a new file named mpvfast.desktop.

[Desktop Entry]
Type=Application
Name=mpv (Fast Mode)
Exec=mpv --gpu-context=wayland -vo=gpu --video-sync=display-resample --profile=gpu-hq --hwdec=auto --demuxer-max-bytes=8G %U
Icon=mpv
Terminal=false
Categories=AudioVideo;Player;Video;
MimeType=video/x-matroska;video/mp4;video/x-msvideo;video/webm;audio/mpeg;audio/x-flac;audio/x-wav;
  • --gpu-context=wayland: Tells mpv to create its GPU rendering context using Wayland APIs instead of X11, SDL, or other backends.
  • -vo=gpu: select GPU as video output
  • --video-sync=display-resample: Syncs video playback to the display refresh rate and dynamically resamples audio to keep A/V in perfect sync.
  • --profile=gpu-hq: GPU high quality — enables higher-quality scaling algorithms
  • --hwdec=auto: Enables automatic hardware video decoding if available.
  • --demuxer-max-bytes=8G: The demuxer buffer is where mpv stores pre-read data from a file/network before decoding.

Then execute update-desktop-database to update desktop.

$ update-desktop-database ~/.local/share/applications

III. Credit

Thank for ChatGPT, it helps me so much! I can’t understand all 1250 options of MPV.

Compressing image directly on Fedora's Nautilus (File Explorer)

15/08/2025 @ Saigon Linux

I. What is it?

This post is all about compressing image on Gnome Desktop Environment with GUI. This is core script

ffmpeg -i "$img" -q:v 4 "$output_dir/$filename"

-q:v 4: refers to quality for video. It’s value range is 1-31, the smaller this value is, the higher the quality.

There are two way to executable the script

  • [1] Open gnome-terminal and execute script.
  • [2] Open nautilus (default file explorer on GNOME).

In addition, to enhance user experience, I used zenity to display progress bar.

II. How to do?

  • Create a file named 01-compress-images.sh at ~/.local/share/nautilus/scripts/
#!/bin/bash
input_dir="$1"
output_dir="${input_dir}_compressed"
mkdir -p "$output_dir"

shopt -s nullglob
files=("$input_dir"/*.{jpg,jpeg,png,webp})
total=${#files[@]}
count=0

(
for img in "${files[@]}"; do
    [ -f "$img" ] || continue
    filename=$(basename "$img")
    ffmpeg -i "$img" -q:v 4 "$output_dir/$filename" &>/dev/null
    count=$((count+1))
    echo $(( count * 100 / total ))
    echo "# [$count/$total] Compressing: $filename"
done
) | zenity --progress --title="Compress Images" --percentage=0 --auto-close

zenity --info --text="Finished! Compressed images stored at:\n$output_dir"
  • Use chmod to make 01-compress-images.sh executable.
$ chmod +x 01-compress-images.sh

III. Result

IV. Credit

Thank to ChatGPT, It helps me so much!

How to generate UUID in Libreoffice Calculator/Excel?

10/07/2025 @ Saigon etc

LibreOffice Calc & UUID formula
LibreOffice Calc & UUID formula

In this post, I would like to make a note about generating UUID in Libreoffice Calc/Excel.

=LOWER(CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,65535),4),"-",DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,65535),4)))

References

Fedora, Change directory quickly with autojump

13/06/2025 @ Saigon Linux

Why do I create this post?

Damn man, I really expected that after install dnf install autojump-zsh, everything should run without any modification, I can start using j command. But no, command j not found. This post is all about installing autojump on Fedora.

Each user has their favorite shell, I am using zsh. this guide is all about setup autojump on zsh. The methodology is the same for fish or bash.

How to install

Step 1: Install dnf install autojump-zsh -y

$ sudo dnf install autojump-zsh -y
# Output
Updating and loading repositories:
Repositories loaded.
Package                                  Arch              Version           Repository        Size
Installing:
 autojump-zsh                            noarch            22.5.3-17.fc41    fedora         2.8 KiB
Installing dependencies:
 autojump                                noarch            22.5.3-17.fc41    fedora        93.2 KiB

Transaction Summary:
 Installing:         2 packages

Complete!

Step 2: Find installed file location rpm -ql autojump-zsh

$ rpm -ql autojump-zsh
# Output
/usr/share/autojump/autojump.zsh
/usr/share/zsh/site-functions/_j

Step 3: Load autojump.zsh when start terminal

I am using zsh, it means that I need modify ~/.zshrc and append source /usr/share/autojump/autojump.zsh.

It will load autojump.zsh when terminal start.

# File ~/.zshrc

source /usr/share/autojump/autojump.zsh

Good luck, have fun!

Firefox on Wayland, can't do mouse click

12/06/2025 @ Saigon Linux

Hi, I am running Firefox on Fedora 41, my display manager is wayland by default. While using Firefox, sometime, I can’t do mouse click on Firefox. This post will help you save 5 minutes.

First of all, the key point here is environment variable MOZ_ENABLE_WAYLAND=1. We need it before running firefox.

You can test by running this command. If it works, you can read futher, else, stop wasting your time reading my post.

$ export MOZ_ENABLE_WAYLAND=1
$ firefox

I assume that you have play with your firefox smoothly. Now, we will edit .desktop file. So what is it? it’s a application shortcut for GNOME. You can find it /usr/share/applications.

$ ll /usr/share/applications  | grep firefox
-rw-r--r--. 1 root root 9.4K Jun 12 11:16 org.mozilla.firefox.desktop

Now, edit /usr/share/applications/org.mozilla.firefox.desktop, add env MOZ_ENABLE_WAYLAND=1 on Exec= line. Remember that there are many places need to update.

Example:

# Before
Exec=firefox %u

# After
Exec=env MOZ_ENABLE_WAYLAND=1 firefox %u

Done, and good luck!

References: