Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

Friday, November 08, 2024

Linux 上應用程式利用使用者資料夾的標準

整個 Linux 作業系統怎麼安排檔案系統,有 Filesystem Hierarchy Standard (FHS) 作為參考標準,在使用者資料夾 (Home directory; ~/) 的部分,目前主要應該都是參考 XDG Base Directory 來放。

使用者設定: $XDG_CONFIG_HOME (~/.config/)
使用者為應用程式做的偏好設定。
使用者資料: $XDG_DATA_HOME (~/.local/share/)
存放類似書籤、憑證、郵件、金鑰等使用者操作應用程式所得到或產生的資料,期待資料格式應具備一定程度的可攜性,使用者可能會想要備份這些資料。
應用程式狀態: $XDG_STATE_HOME (~/.local/state/)
存放像是執行紀錄 (log) 檔、最近存取資料的紀錄、視窗最後位置等,可以用在應用程式啟動時初始狀態的資料,使用者備份這些資料可能沒有太多意義。
使用者自行安裝的程式: ~/.local/bin/
各 distribution 應該自動的在這個資料夾存在時,把他加到使用者的 $PATH 環境變數中。

雖然沒有那麼常見,但最好可以考慮使用者資料夾可能會在不同處理器架構的主機間共用的情形。

規格中另外有定義一些環境變數,用來指定搜尋資料的順序。

Wednesday, November 06, 2024

在 WSL 2 上掛載 USB disk

如果要在 WSL 2 (Windows Subsystem for Linux) 掛載在 Linux 格式 (EXT4, XFS ... etc.) 的 USB 外接磁碟,可以先試試看這篇 Mount a Linux disk in WSL 2 說的方法,萬一不行再去試 Connect USB devices 的方式。

雖然第一篇說該方法針對的是內部儲存裝置,外接式裝置無法支援,但我自己在 Windows 11 (23H2; build 22631) 試是可以的。反而透過 USBIPD 的方式,因為 WSL 提供的 kernel 沒有包含 USB mass storage 的驅動程式,雖然 lsusb 看得到裝置,但是沒辦法掛載起來使用。

Thursday, July 13, 2023

Linux 上的 load average 怎麼解釋?

在 Linux 或是大多數的 UNIX-like 的系統上,系統核心 (kernel) 會提供一組稱為 load average 的值,用來反應系統負載狀態。

這組值原則上是基於工作佇列中的工作數量與工作特性權重去計算出來,可以說是在等待資源中的工作數量,系統會提供 1, 5, 15 分鐘的平均值。

以 Linux 來說,納入考量的資源包含了處理器、被分頁置換的記憶體、儲存設備、網路介面等等,因此在 Linux 上 load average 可以說是一個綜合性的指標,可以相當程度的反映出程式分享設備資源的狀況。

舉例來說,如果這個值是 2.00 的話,可以想像成有兩個工作正在等待資源,換句話說,這些等待中的工作所需要的資源目前是完全使用中的。

系統中多半會有許多程式在運行,他們會因為程式本身設計的目的使用不同的資源,因此 load average 也一定程度可以反映出工作組合在特定主機設備上的狀況。

比如說,如果主機上的工作是類似資料庫或是需要大量存取檔案的應用程式,由於儲存設備相對處理器與記憶體多半是相對慢的,工作勢必是需要做一些等待來得到資料,所以在偏高的 load average 下整體而言還是可以有不錯的處理能力 (throughput) 表現。

但如果是使用處理器為主的應用程式,那麼偏高的 load average 就意味著有工作在進行單純的等待,在這個情況下如果處理能力不符合需求的話,可以考慮是不是做一些硬體資源的調整來提升處理能力。

利用這樣的特性,我們也可以透過監視 load average 來偵測到系統的工作組合是不是發生了變化。比如要是遭到了勒索軟體的入侵,由於勒索軟體會進行大量的儲存裝置操作,那麼 load average 就會衝到比平常還高的數值上。

Ref:

Sunday, July 02, 2023

Visual Studio Code 無法識別 PATH_MAX 或 realpath

利用 Visual Studio Code 寫 C/C++ 程式時,發現一些系統定義或是函數被畫了無法識別的紅色波浪 (red squiggly line) 在下面,但是真的編譯程式又會過。

原因是那些定義被放在 feature test macros (FTM) 的後面,當沒有特別給像是 -ansi, -std=c17 之類的參數時 gcc 預設會定義 _DEFAULT_SOURCE 巨集,因此編譯可以順利進行。但是 vscode 的解析器似乎是比照給了 -std=c17 之類的參數,因此這些 Linux 上特有的常數或函數定義就不會被抓到。

解決方法就是在 .vscode/c_cpp_properties.jsondefines 區塊中,加上 _DEFAULT_SOURCE=1 或是 _XOPEN_SOURCE=700 來把 Linux 上的常數或函數定義納入。或是,為求慎重的話,也可以看函數的 man page 裡面所描述的 feature test macros 需求,來決定要怎麼設定。

Ref:

Monday, May 16, 2022

Podman 清除建置失敗的殘餘容器資料

使用 podman build 建置容器時,建置失敗的中間容器會被留下來,而且不會被 podman system prune -a 清除。

$ podman system prune -a
WARNING! This command removes:
	- all stopped containers
	- all networks not used by at least one container
	- all images without at least one container associated with them
	- all build cache

Are you sure you want to continue? [y/N] y
Error: Image used by fbcfbb...7e8: image is in use by a container

這個原因看起來是因為 podman system prune 清除的對象是 Podman 本身產生的資料,而 podman build 背後是透過 Buildah 來進行建置,而這部份就不被認為是 Podman 的直接行為。細節可以參考在 #7889 Failed to remove image, image is in use by container 這個 Issue 裡的描述。

處理的方式就是手動刪除,先執行 podman ps --all --storage 把所有的容器列出來,再用 podman rm 刪掉。

$ podman ps --all --storage
CONTAINER ID  IMAGE                                      COMMAND     CREATED      STATUS      PORTS       NAMES
b396d84310a4  docker.io/library/ubuntu:16.04             buildah     10 days ago  storage                 ubuntu-working-container
fbcfbbc3c233  docker.io/library/bd7139...bed-tmp:latest  buildah     10 days ago  storage                 793b78...79a-working-container
$ podman rm b396d84310a4 fbcfbbc3c233

Monday, August 10, 2020

Setup Flutter desktop development environment manually

I choose the manual approach to make sure I know what is needed for building a flutter application.

Version of Flutter SDK is 1.20. Platform is Ubuntu 18.04. Here are the steps I took:

  1. Download and unpack Flutter SDK.
  2. Manually built and install cmake:

    • ./configure --prefix=.../bin/app/cmake-3.18>
    • make
    • make install
  3. Manually built and install ninja:

    • python ./configure.py --bootstrap
    • mkdir -p .../bin/app/ninja-1.10/bin
    • cp ninja .../bin/app/ninja-1.10/bin/
  4. Install clang and GTK-3 development files: sudo apt install clang pkg-config libgtk-3-dev.

    This will bring clang-6 into the box.

The environment can be verify by generate a empty project.

Saturday, May 25, 2019

Build Thrift compiler (without libraries)

最近在 Linux 與 OS X 上編了 Thrift 0.12.0 要用,跟之前 0.10.0 狀況好像不太一樣了。

Built Thrift 0.12.0 on Linux and OS X recently. The steps to get successful build is different from 0.10.0.

我只需要 Thrift 的 IDL 編譯器,不需要語言的函式庫,用下面的方法可以建置出來:

All I need is Thrift compiler. I excluded libraries for languages to speed-up the build process. Here is the commands to complete the build:

  1. 將會需要 C++ 編譯器,系統上要有基本的建置環境。另外比較特殊的是 Flex 與 Bison (>= 2.5) 這兩個工具,也需要事先安裝好。

    Essential build environment is required. Flex and Bison (>= 2.5) are also required.

    Ref: Apache Thrift Requirements

  2. 會需要 Boost 的標頭檔,因此要先建置出 Boost 標頭檔:

    We will need Boost. Headers are good enough for completing build. Generate Boost headers first:

    $ ./bootstrap.sh --prefix=/tmp/p

    $ ./b2 --with-headers

  3. 開始正式建置 Thrift 編譯器:

    Configure and build the Thrift compiler:

    $ ./configure CXXFLAGS=-I/private/tmp/b/boost_1_70_0 --enable-libs=no --enable-tests=no --enable-tutorial=no --with-boost=/tmp/p --prefix=/target/thrift-0.12.0

    $ make

    $ make install

    比較特殊的是要使用 CXXFLAGS= 來讓建置過程可以找到 Boost 標頭檔,說明文件中的 --with-boost= 似乎是完全沒作用。

    The most tricky part is instructing build process to reach Boost header with CXXFLAGS= flag. The --with-boost= flag in help message does not work for me.

Monday, January 08, 2018

在 proxy 後使用 rustup 碰到 https 連線失敗

本來以為是憑證的問題,後來發現原來是連線方法的問題。

可能是因為 https_proxy 被設定為 https://proxy... 的型式,導致 rustup 使用 TLS 去連 proxy 伺服器,但 proxy 並不會進行 TLS 連線,所以就連線失敗。

https_proxy 環境變數中的 https 改成 http 就可以了。

錯誤的訊息長下面這樣子:

info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu' error: could not download file from 'https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256' to '/.../.rustup/tmp/d0y3dwu_7bx2v1ub_file' info: caused by: error during download info: caused by: [35] SSL connect error (error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol)

Saturday, October 19, 2013

VirtualBox VM 中的 Apache 存取共用資料夾內檔案

因為開發上的方便,透過共用資料夾把檔案給 VM 裡的 Apache 使用。

但發生了即使檔案在 host 上已經變更了,透過在 guest 裡的 Apache 讀到的內容卻還是舊版本的狀況。

查了一下發現是要在 <Directory> 設定中加上下面兩個設定:

EnableMMAP Off
EnableSendfile Off

Friday, October 11, 2013

在 debian 上更動預設的磁碟排班器

在對儲存裝置負載比較重的主機上,調整 I/O scheduler 很可能可以得到效能的改善。

要讀取目前所選取的 scheduler 只要執行 cat /sys/block/sda/queue/scheduler 即可,目前使用中的 scheduler 會用方括號標示出來。

在執行時期可以透過 echo "noop" > /sys/block/sda/queue/scheduler 來更改,不過這個變更重開機後會失效。

永久變更可以使用 sysfsutils 來針對特定裝置選用不同的排程器,或是直接改啓動時的 kernel 參數來變更系統預設選用的排程器。

因為我是要用在 VM 上面,不太有多個裝置要用不同組態的需求,所以我選擇使用改變 kernel 參數的方式。

基本上就是編輯位於 /etc/default/grub 的這個設定檔,修改 GRUB_CMDLINE_LINUX_DEFAULT 變數以加入 elevator=noop 選項:

GRUB_CMDLINE_LINUX_DEFAULT="elevator=noop quiet"

最後要記得執行 sudo update-grub 以更新線上的 grub 設定,不然設定不會生效。

Wednesday, November 14, 2012

在 OS X 下編譯 squashfs-tools

我的環境是 Snow Leopard, 不知道在比較新的版本是不是還是這樣。

參考了 Build squashfs tools for Mac OS X 這篇描述了編譯 4.0 版的方法,不過因為我想用 4.2 的版本,所以我是手動作就是。

大致上要解決的問題包含:

  1. OS X 上未被定義的 FNM_EXTMATCH 常數
  2. 改引入 sys/sysctl.h 以供 unsquashfs.c 取得 CPU 數量
  3. OS X 上未被定義的一系列 l 開頭的 xattr 函數 (我猜應該也可以透過關閉 xattr 相關的功能避掉)

patch 丟到 Gist 上了,軟體跨平台真的是一件很藝術的事情。

Wednesday, October 24, 2012

在 ubuntu 12.10 上安裝 gcin

用 gcin 習慣了,所以裝好新版本第一件事情就是裝 gcin 上去。

首先刪掉 ibus 跟相關的套件:
sudo dpkg -P ibus ibus-gtk ibus-gtk3 ibus-pinyin-db-android
接著設定工具列圖示的顯示:
gsettings set com.canonical.Unity.Panel systray-whitelist "['JavaEmbeddedFrame', 'Wine', 'Update-notifier', 'gcin']"
安裝 gcin:
sudo apt-get install gcin
重設 GTK3 IM-Module 快取:
sudo /usr/lib/i386-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 --update-cache

這一步似乎是因為目前 ubuntu 所包版本 (2.7.6.1+dfsg-1) 的 post install script 漏了這步的關係,未來也許可以省掉。

設定為預設輸入法:
im-switch -s gcin

清除 cache 的部份花了很久才找到 (囧)

沒有更新 im-module cache 前,我遇到的狀況是: 在 gnome-terminal 與 gedit 怎麼弄都不能使用 Ctrl+Space 切換輸入法,按右鍵跑出來的輸入法選擇清單中也沒有 gcin 可選。

以往只要裝上 im-config 就會動,不過從作者的說法,現在這麼做反而會有問題。

Monday, October 24, 2011

從指令列開啟檔案

在 Linux 上很直觀的就是執行要開啟的程式來開檔案,不過也可以使用 xdg-open / gvfs-open / gnome-open 工具來透過 GNOME 開啟檔案。


在 MacOS 上則是用 open 工具,要指定開啟的 App 的話就是用 -a 選項這樣。

Wednesday, November 03, 2010

debian 上安裝基本的 GNOME 環境

在 debian 透過 tasksel 裝進來的 GNOME 環境不知道為什麼包了超多有的沒的東西,相當之傷腦筋... 但今天發現,可以只裝必須的部份就好了。

apt-get install gnome-core avahi-daemon p7zip synaptic system-config-printer hal-cups-utils

Saturday, May 22, 2010

在 Linux 上編譯 Objective C 程式

套件的部份要加裝 gobjc 跟 gnustep-base-dev 兩個套件,後者包含 Foundation 等 Framework 檔案。

編譯時也很麻煩,要設定 inclusion path 跟 linking library 才可以。

gcc -lgnustep-base -lobjc -I /usr/include/GNUstep -fconstant-string-class=NSConstantString helloworld.m