分類
Linux

AlmaLinux 9 with Xfce for daily use

隨着年紀的增長,不可避免的越來越保守。所以打算試試保固期更長的 AlmaLinux 來替換隔兩年就要升級的 Fedora。

安裝 AlmaLinux 9 與 Windows 10 雙系統

製作安裝盤

curl -O https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux-9
gpg --import RPM-GPG-KEY-AlmaLinux-9
curl -O https://repo.almalinux.org/almalinux/9/isos/x86_64/CHECKSUM
gpg --verify CHECKSUM
sha256sum AlmaLinux-9.4-x86_64-Live-XFCE.iso

sudo fdisk -l
sudo dd if=./AlmaLinux-9.4-x86_64-Live-XFCE.iso of=/dev/sdb status=progress conv=fsync bs=4M

安装 AlmaLinux 9

此段從略。大概流程是先到 Windows 中使用磁盤管理工具釋放出安裝 AlmaLinux 的磁盤空間。建議 100 GB 以上吧。然後重啟電腦進入 BIOS (一般是在屏幕出現品牌 Logo 時按 F2 或 F10) 將「從優盤啟動」的優先級提到「從硬盤啟動」前。然後插入優盤啟動就進入 AlmaLinux 9 了,選擇其中的安裝到硬盤即可。

AlmaLinux 9 with Xfce 小撇步

Flatpak

使用 Flatpak 來安裝常用的軟件可以避免依賴出現問題,而且軟件更新速度也更快。下面是我推薦的一些軟件:

Delta Chat	chat.delta.desktop 基於 Email 的加密聊天
Bilal Elmoussaoui	com.belmoussaoui.Decoder 二維碼生產與掃描
Flameshot	org.flameshot.Flameshot 截圖(在鍵盤快捷方式里設置 flatpak run org.flameshot.Flameshot gui 可以一鍵截圖)
Kovid Goyal	com.calibre_ebook.calibre 電子書管理與轉換
Vlad Krupinskii	io.github.mrvladus.List  Todo 列表
The GoldenDict-ng Community	io.github.xiaoyifang.goldendict_ng 字典
Michal Kosciesza	net.mkiol.Jupii 投屏
The GIMP team	org.gimp.GIMP  圖片修改
digiKam Team	org.kde.digikam 照片管理
KDE	org.kde.kcalc 計算器
KDE	org.kde.kdenlive 視頻剪輯
The qBittorrent Project	org.qbittorrent.qBittorrent 種子下載
VideoLAN et al.	org.videolan.VLC 音視頻播放器

AppImage

AppImage 類軟件很像 Windows 里的綠色軟件,無需安裝(有時需要在文件屬性里勾上「可執行」),雙擊既可運行。

  • Beekeeper-Studio 數據庫客戶端
  • IPTVnator 在線電視播放器
  • LibreCAD CAD
  • Simple mind map 開源腦圖(節目僅支持簡體中文)

其他軟件

Firefox ESR 作為我的主力瀏覽器一直是通過到官網直接下載,然後解壓即可運行的。值得一提的是,截至 2024 年 11 月,Firefox 官網以及賬號書籤同步系統都未被牆。Firefox 的多賬戶玩法請參考 Profile Manager - Create, remove or switch Firefox profiles. (firefox -P)

有時需要 Google Chrome 來救急。安裝方法如下:

#新建文件
sudo nano /etc/yum.repos.d/google-chrome.repo
#內容如下
[google-chrome]
name=google-chrome
baseurl=https://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub

#更新並安裝 Chrome
sudo dnf update
sudo dnf install google-chrome-stable

#查看 Chrome 版本
google-chrome --version

Bugs

偶爾地,從 Windows 10 關機後再啟動 AlmaLinux,Wi-Fi會停止工作。我也不知道如何永久解決此問題,但是可以通過再次進入 Windows 10,從右下角快捷方式里禁用 Wi-Fi,再打開 AlmaLinux,Wi-Fi 就正常工作了。這個 Bug 並不常出現。

分類
Linux 软件

小內存 OpenWrt 折騰記錄

我有一個路由器(CPU:580 MHz, RAM: 128 MB, Flash: 16 MB),幾年前刷過 OpenWrt 19,三年來工作的很好,裡面的 dnscrypt2 也運行的很好。最近看到可以更新到 23.05.4,於是打算試試。順便把一個舊優盤的容量擴展上去試試更多的軟件。

重裝 OpenWrt

由於我是跨版本升級,所以為了避免出現問題選擇的不保留資料。在 Table of Hardware 查詢自己的路由器,然後在 Device page 就能找到升級所需要的 Sysupgrade image。 也可以到 Download OpenWrt firmware for your device 搜索並下載所需的升級鏡像。而且這個下載頁還有一個 Customize installed packages and/or first boot script,裡面可以添加預裝軟件。有興趣的朋友可以嘗試將 wget-ssl 添加進去。下載 squashfs-sysupgrade.bin 文件到電腦後,就可以路由器界面 System > Backup / Flash Firmware > Flash new firmware image 升級系統了。升級後使用網線連接電腦就能獲得 IP。瀏覽器輸入 192.168.1.1 就能進入控制台。進入後設置密碼和密鑰,再到 Network > Wireless 開啟 WiFi,路由器就可以使用了。

為 opkg 配置代理

如果你網絡沒問題,就不必使用代理,但國情在此,直連的話基本上無法更新軟件。正常情況下設置代理非常簡單:

#進入路由器
ssh [email protected]
#添加代理到到 /etc/profile
echo "export http_proxy=http://192.168.1.235:44083" >> /etc/profile
echo "export https_proxy=http://192.168.1.235:44083" >> /etc/profile
#重新加載 profile
source /etc/profile
echo $http_proxy
#此時應出現 http://192.168.1.235:44083/
wget http://ip-api.com/json
#應能成功顯示 proxy 的 IP

但是使用 wget 下載 https 連接卻會出現 400 錯誤,可以先把軟件源替換成 http 安裝 wget-ssl 後再替換回來。

#備份下軟件源
cp /etc/opkg/distfeeds.conf distfeeds.conf
#然後將軟件源中的 https 替換為 http
sed -i -e "s/https/http/" /etc/opkg/distfeeds.conf
#之後就可以更新並安裝軟件了
opkg update
opkg install wget-ssl
#安裝 wget-ssl 後就可以換回 https 的軟件源了
cp distfeeds.conf /etc/opkg/distfeeds.conf
#在 opkg 配置文件李設置代理
#/etc/opkg.conf 中添加
option http_proxy http://192.168.1.1:44083/
option https_proxy http://192.168.1.1:44083/
#後台運行程序
opkg install coreutils-nohup

使用優盤為路由器拓展空間

不到 10 MB 的可用空間非常限制 OpenWrt 的可玩性,好在可以用優盤來拓展。首先在電腦上把優盤格式化成 ext4 格式:

#查看優盤盤符
lsblk
#得到類似 /dev/sdb 或 /dev/sdc

#格式化成 ext4 格式
sudo mkfs.ext4 /dev/sdX

然後將優盤插入路由器:

#安裝依賴
opkg update
opkg install block-mount kmod-usb-storage kmod-fs-ext4 e2fsprogs

#建立掛載點
mkdir -p /mnt/usb
#查看優盤盤符
ls /dev/sd*
#得到類似 /dev/sda
#掛載優盤
mount /dev/sda /mnt/usb
#查看掛載結果
df -h
#應該可以看到 /dev/sda 掛載到了 /mnt/usb

#備份 /overlay
cp -a /overlay/* /mnt/usb
#卸載優盤
umount /mnt/usb
#掛載到 /overlay
mount /dev/sda /overlay
#更新 /etc/config/fstab,在文件底部增加如下內容
config 'mount'
   option  target  '/overlay'
   option  device  '/dev/sda'
   option  fstype  'ext4'
   option  options 'rw,sync'
   option  enabled '1'
   option  enabled_fsck '0'
#重啟路由器即可看到路由器顯示優盤容量
reboot

其他 OpenWrt 命令行小撇步

在使用 scp 從電腦往路由器傳文件時出現 ash: /usr/libexec/sftp-server: not found,可以通過添加 -O 參數來解決:

scp -O source target
#如果是文件夾或多個文件
scp -O -r source target

在命令行下載文件文件時,鏈接過長導致無法輸入完整鏈接?可以安裝 bash

opkg install bash
#使用 bash 而不是 ash
bash
wget https://a.vrey.long/url/that/you/would/like/to/access
#返回 ash
exit

嘗試在 OpenWrt 上編譯 Python 庫

測試的項目是 ssr-command-client,這裡只能說歷經劫難修成正果,最終編譯出來了也成功安裝上了。但是由於路由器性能實在孱弱,並不能直接運行 ssr-command-client,不過可以通過自己寫一個 Python 腳本,只引用需要的庫來運行。

使用更輕便的 HTTPS DNS Proxy 來增加網絡安全性

安裝 https-dns-proxyluci-app-https-dns-proxy 然後重新登錄路由器,頂部導航應該就出現 Services > HTTPS DNS Proxy 了。在 HTTPS DNS Proxy - Instances 中編輯或添加 DNS 服務器。

Provider: Custom
Parameter: https://YOUR.DNS.PROVICDER/PATH
Bootstrap DNS:
Listen Address: 127.0.0.1
Listen Port: 5353
Run As User: nobody
Run As Group: nogroup

經過兩周的使用,發現這個路由器還是可以在性能有限的情況下同時穩定運行 ssr + v2fly + dnscrypt2 的。最高網速相較於電腦上的客戶端可能有所下降,但是也還好。

本文更新於 2024/11/08。

分類
软件

使用 F-Droid 分享應用給局域網的手機

F-Droid 有個功能是分享自己已安裝的應用給局域網的手機,但是操作不甚直觀,這裡簡單記錄一下。

現有手機甲,已安裝 Organic Maps;手機乙,未安裝 Organic Maps(或已安裝低版本)。兩個手機都打開 Nearby > Find People Nearby > 並啟用發現開關。

在甲手機上選擇掃描到的乙手機,然後勾選要分享的應用 Organic Maps,最後點擊右上角的分享藍色按鈕。此時乙手機會提示“是否要從甲手機獲取應用”,同意後會進入選擇“乙手機要分享的應用”的界面。由於乙手機是要獲取甲手機的應用,所以不用選擇分享的應用,直接點擊右上角的分享按鈕,就能看到甲手機分享的應用 Organic Maps 了。點擊應用旁邊的“安裝”或“更新”即可完成操作。

以上步驟經過測試,是沒有問題的。但是要注意,如果兩個手機的架構不同,可能會出現應用安裝包不匹配的情況而導致無法安裝。

分類
程序

使用 Python 或/和 Cloudflare Worker 代理 NextDNS 的 DoH 服務

Previously:使用 nginx 代理 NextDNS 的 DoH 服務

使用 Cloudflare Worker 代理 NextDNS 的 DoH 服務

使用 tina-hello 的 doh-cf-workers 項目可以方便的建立一個 DoH 代理。由於只需要一個 index.js 文件,所以我這裡轉載一下。默認的示例是 Cloudflare 的 DoH,切換成 NextDNS 的話只需要修改 doh 和 dohjson 的網址,其他都不用動。

// SPDX-License-Identifier: 0BSD

const doh = 'https://dns.nextdns.io/YOUR_ID/YOUR_TAG'
const dohjson = 'https://dns.nextdns.io/YOUR_ID/YOUR_TAG'
const contype = 'application/dns-message'
const jstontype = 'application/dns-json'
const r404 = new Response(null, {status: 404});

// developers.cloudflare.com/workers/runtime-apis/fetch-event/#syntax-module-worker
export default {
    async fetch(r, env, ctx) {
        return handleRequest(r);
    },
};

async function handleRequest(request) {
    // when res is a Promise<Response>, it reduces billed wall-time
    // blog.cloudflare.com/workers-optimization-reduces-your-bill
    let res = r404;
    const { method, headers, url } = request
    const searchParams = new URL(url).searchParams
    if (method == 'GET' && searchParams.has('dns')) {
        res = fetch(doh + '?dns=' + searchParams.get('dns'), {
            method: 'GET',
            headers: {
                'Accept': contype,
            }
        });
    } else if (method === 'POST' && headers.get('content-type') === contype) {
        // streaming out the request body is optimal than awaiting on it
        const rostream = request.body;
        res = fetch(doh, {
            method: 'POST',
            headers: {
                'Accept': contype,
                'Content-Type': contype,
            },
            body: rostream,
        });
    } else if (method === 'GET' && headers.get('Accept') === jstontype) {
        const search = new URL(url).search
         res = fetch(dohjson + search, {
            method: 'GET',
            headers: {
                'Accept': jstontype,
            }
        });
    }
    return res;
}
#測試下 GET 請求
curl -H 'accept: application/dns-json' 'https://YOURPROJECT.YOURWORKER.workers.dev/dns-query?name=ft.shaman.eu.org&type=A'
#POST請求由於需要構造 DNS 參數,所以就不測了

使用 Python 代理 NextDNS 的 DoH 服務

輕量級的 API 框架我不熟悉,所以這裡還是用 Django。

#file:app1/views.py
from django.http import HttpResponse
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import requests

@csrf_exempt
def forward_to_doh(request):
    cloudflare_doh_url = "https://YOURPROJECT.YOURWORKER.workers.dev/"
    contype = 'application/dns-message'
    jstontype = 'application/dns-json'

    try:
        if request.method == 'GET':
            if 'dns' in request.GET:
                params = {'dns': request.GET['dns']}
                headers = {'Accept': contype}
                response = requests.get(cloudflare_doh_url, params=params, headers=headers)
                return JsonResponse(response.json(), status=response.status_code)
            elif request.headers.get('Accept') == jstontype:
                response = requests.get(cloudflare_doh_url + '?' + request.GET.urlencode(), headers={'Accept': jstontype})
                return JsonResponse(response.json(), status=response.status_code)
        elif request.method == 'POST':
            if request.headers.get('content-type') == contype:
                headers = {'Accept': contype, 'Content-Type': contype}
                data = request.body
                response = requests.post(cloudflare_doh_url, data=data, headers=headers)
                return HttpResponse(response.content, content_type=response.headers['Content-Type'], status=response.status_code)
        else:
            return JsonResponse({'error': 'Unsupported request method'}, status=405)
        return JsonResponse({'error': 'Not Found'}, status=404)

    except requests.exceptions.RequestException as e:
        return JsonResponse({'error': str(e)}, status=500)
#file:mysite/urls.py
from django.urls import include,path
from app1 import views

urlpatterns = [
    path('YourSecNextDns/', views.forward_to_doh, name='forward_to_doh'),
    path('i/', include('i.urls')),
]
#測試下 GET 請求
curl -H 'accept: application/dns-json' 'https://YOUR_DOMAIN.LTD/YourSecNextDns/?name=ft.shaman.eu.org&type=A'

上面的請求經過三次請求,速度(高達秒級)自然是比不了直連。但是為了體驗 DoH,還是可以用用看。反正網速本身也不快,DNS 慢一點完全可以怪到網速上。

分類
软件

觀鳥輔助工具 whoBIRD

whoBIRD可以在手機離線的情況下,根據當前地理位置和所處時間通過 BirdNET 訓練的模型識別鳥叫。有時候用眼睛找鳥是很困難的,但是有 whoBIRD 的幫助,會更容易分辨是自己已知的鳥類還是一個叫聲很相似,但是是不同的鳥類。對於新到一個地方有很多未知鳥類時也很有幫助。如果當時手機有網絡,還能直接顯示出鳥的照片。當然也可以等手機有網絡後從歷史記錄里慢慢查看之前聽到了什麼鳥叫。

分類
Linux 软件

使用 nginx 代理 NextDNS 的 DoH 服務

免費版的 NextDNS 每個月有 300,000 次請求,個人一般是夠用的。通過 nginx 代理其 DoH 服務可以用自己的域名來使用 NextDNS 的服務。Nginx 配置文件 /etc/nginx/conf.d/MY.DOMAIN.conf 如下:

# Cache the dns query
proxy_cache_path /var/cache/nginx/dns levels=1:2 keys_zone=dns_cache:10m max_size=1g inactive=1d use_temp_path=off;

server {
    server_name my.domain;

    root /usr/share/nginx/html;

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/my.domain/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/my.domain/privkey.pem; # managed <p>by</p> Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    http2 on;
    resolver 45.90.28.136;

    location /YOUR_DNS_QUERY_PATH {
        proxy_pass https://dns.nextdns.io/YOUR_ID/YOUR_TAG;
        proxy_set_header Host dns.nextdns.io;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache dns_cache;
        proxy_cache_valid 1d;
        proxy_cache_use_stale error timeout updating;
    }
    
    location / {
    }
}
server {
    if ($host = my.domain) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name my.domain;
    return 404; # managed by Certbot


}

Nginx 搭配 Cerbot 獲取免費證書請參考:網站用上了letsencrypt的免費ssl證書

搭建完成後可以通過 curl 來檢查服務是否正常:curl -H 'accept: application/dns-json' 'https://my.domain/YOUR_DNS_QUERY_PATH?name=ft.shaman.eu.org&type=A'

使用 personalDNSfilter 以在安卓手機上使用 DoH

使用 personalDNSfilter (去 F-droid 下載)實現的本地 VPN 來修改系統的DNS查詢,它同時還能攔截廣告。配置非常簡單,只需要在 DNS 配置欄選中禁用 DNS 服務器查找,選中文本編輯模式,並在輸入框中加入下面一行並啟用即可。

[MY.SERVER.IP]::443::DOH::https://my.domain/YOUR_DNS_QUERY_PATH

也可是使用重一點的 Rethink 來管理 DNS。加入自己的 DoH 也很簡單。選擇 Other DNS,DoH,新增。名稱隨便,Resolver URL 填:https://my.domain/YOUR_DNS_QUERY_PATH 即可。

在 Xfce 口味的 Fedora 上使用 DoH

似乎是沒辦法直接在圖形界面上進行設置。我最終是用熟悉的 dnscrypt-proxy 2 來代理。不熟悉的朋友請參考:Fedora 使用 DNSCrypt。只需要修改三處文件即可:

#file:dnscrypt-proxy.toml

#設置 server_names,默認是注釋掉的
server_names = ['mydns']

#如果在中國,可以把 bootstrap_resolvers 設置成 114
bootstrap_resolvers  = ['114.114.114.114:53', '8.8.8.8:53']

#拉到文件底部,添加這兩行
  [static.mydns]
  stamp = 'sdns://AgAAAAAAAAAABzEuMS4xLjEACW15LmRvbWFpbhQvWU9VUl9ETlNfUVVFUllfUEFUSA'

stamp 的生成請打開這個網頁:Online DNS Stamp calculator Protocol 選擇 DoH,IP 寫 IP,Host 寫域名,Path 寫/YOUR_DNS_QUERY_PATH ,然後複製生成的 Stamp 就可以了。

今天是 2024 年 4 月 1 日,看看自己域名的 DoH 可以存活多久。安卓網絡設置里雖然可以直接指定 DoT,NextDNS 的 DoT 也可以用 Nginx 代理,但是感覺陣亡幾率更大(專用端口),所以我選擇了更穩妥一點的 DoH。

2024-04-05: 移動網絡偶爾出現 SSL handshake timed out IO Error occured! Check network or DNS config! 和 Read timed out IO Error occured! Check network or DNS config! 但是還是能用。

2024-04-06: 晚上移動網絡開始出現 SSL handshake aborted: ssl=0x7b2db05fc8: I/O error during system call, Connection reset by peer IO Error occured! Check network or DNS config! 基本用不了了。之間訪問網站也顯示 The connection was reset 。所以清明節沒過完域名就掛了,存活時間約 5 天。如果想要繼續使用被屏蔽的域名,或者直接使用 NextDNS,無論是 DNSCrypt 還是 personalDNSfilter 都支持代理。一息尚存的 DNSCrypt 內置不少 DNS,還可以在不用代理的情況下使用。

2024-04-15:偶爾外出就餐時連接餐廳的 WiFi,發現電信的寬帶仍然可以使用。但是移動網絡和移動寬帶已經完全無法連上。


另請參閱:使用 Python 或/和 Cloudflare Worker 代理 NextDNS 的 DoH 服務

本文更新於 2024/04/24。

分類
Linux

Fedora 39 Xfce tricks

前段時間用了一些 KDE 團隊開發的應用,又聽說 Linux 界的安卓模擬器新星 Waydroid 很厲害,於是裝個 KDE Plasma 體驗。結果離開了 X 才只知道 X 的好!KDE Plasma 在默認配置下,瀏覽器播放視頻會有輕微卡頓,如果快進快退則卡頓感更加明顯。而且原來可以輕鬆設定的全局熱建,搜索一通居然發現無法實現!在英文系統里裝中文輸入法,也是個痛。所以用了一天時間就跟這酷炫的桌面拜拜了——裝回了順手的 Xfce。

多媒體工作站

	
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'

dnf check-update
sudo dnf install code vlc ffmpeg libreoffice calibre

安裝拼音輸入法

Applications > Settings > Input Method Selector,選擇 Use IBus。然後點擊旁邊的 Preferences 打開 IBus 的設置。

在 General 標籤頁可以將候選詞設置為橫排(默認為豎排)。在 Input Method 標籤頁點擊 Add 按鈕添加輸入法(選擇 Chinese > Intelligent Pinyin)。添加後選中拼音輸入法,在點擊右邊的 Preferences 可以設定拼音輸入法,比如候選詞數量、候選詞翻頁按鍵、字典詞庫以及中英文切換鍵等。設置過程中如果有問題,可能是需要登出一下才會生效。

調大字體

歲月不饒人,雖然屏幕是 1920*1080 全高清,但是字體顯示真的有點小,看久了會累。在 Applications > Settings > Apperance 中的 Fonts 標籤頁可以設置 DPI,改為 119,字體大小就舒服多了。Style 標籤也有很多主題,但是丑的居多,個人覺得默認的 Adwaita 確實已經是最好看的了。在 Applications > Settings > Window Manager 中也可以設定窗口樣式,推薦大家試試 Mint-Y-Aqua。

睡眠模式掉電快

在我的電腦上,默認的睡眠模式是 s2idle,如果想要在睡眠時省電,需要改成 deep 模式。

#查看當前模式
cat /sys/power/mem_sleep
#可能會輸出 [s2idle] 或[s2idle] deep
#通過下面命令設定成 deep 模式
echo deep | sudo tee /sys/power/mem_sleep
#再次查看 /sys/power/mem_sleep
#應該變成 s2idle [deep]
#此時可以嘗試睡眠觀察一下電量消耗
#如果沒有問題,還需要通過下面命令將這個模式保存下來

#打開 /etc/default/grub 文件
sudo nano /etc/default/grub
#找到 GRUB_CMDLINE_LINUX= 開頭的一行
#有的系統是 GRUB_CMDLINE_LINUX_DEFAULT= 但是沒關係
#這行中一般都還有一個關鍵字 quiet
#在這行的末尾,引號前加入
 mem_sleep_default=deep
#然後保存文件
#最後執行下更新啟動項
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Virtual Box

使用sudo dnf install VirtualBox virtualbox-guest-additions即可安裝 VirtualBox,現在最新版是 7.0 。安裝後進入虛擬機發現共享文件以及顯示縮放都不能用。原來是自動下載失敗了,需要手動下載虛擬機增強插件 ISO。從 https://download.virtualbox.org/virtualbox/7.0.14/VBoxGuestAdditions_7.0.14.iso 下載後,掛載上就可以在虛擬機里安裝增強插件了。


其他小撇步另請參考:Fedora Workstation Tricks

本文更新於 2024/03/16。