顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2022/02/15

[Linux] Run eBPF with Linux Kernel v5.16 on Ubuntu 21.10

有鑒於eBPF相關的架構都還在開發中,這邊紀錄了目前編譯成功且能夠執行的版本。

系統需求:Ubuntu 21.10 (因為需要clang-13,且至少70GB以上的硬碟空間)

如同目前Linux官方文件上說,需要clang-13+的版本才能編譯eBPF的code。所以在這裡使用了還在開發中的Ubuntu 21.10,但只要是有clang-13+的作業系統版本應該都適用。

整個流程主要參考Cilium的BPF and XDP Reference Guide,加上一些網路找的bug fix posts。

2021/06/16

[Linux] zsh 好用的shell: 在Secure Shell上正確顯示agnoster主題

zsh因為有更好的介面,所以在使用上非常熱門。本篇主要紀錄怎麼在Chrome上的Secure Shell App上,使用oh-my-zsh:


2021/05/18

[Ubuntu] Build bbrv2 on Ubuntu 21.04

因為BBRv2還沒有在Linux的master tree中,所以Ubuntu目前也沒有BBRv2。本篇紀錄怎麼把編譯好的BBRv2放到Ubuntu 21.04中。以Google Cloud Platform的VM作為例子。

需要的有:1) 下載BBRv2的程式碼在本機端,2) 遠端的VM (本篇用GCP Ubuntu 21.04)。

首先在GCP上開一個Ubuntu 21.04的VM。接著可以在本機端下載BBRv2的程式碼(BBRv2 Alpha),接著編譯

$ cd bbr/
$ ./gce-install.sh -m ${HOST}

2019/07/05

[Ubuntu] 讓Ubuntu 16.04變成一個Router by IP Forwarding

有時候因為實驗需要,會把Ubuntu當作一個中間站來測試整個網路的Topology,因此就會需要把Ubuntu變成一個轉送的Router。從圖中可以看到原來的網路下,Ping到8.8.8.8的TTL是49。

2019/05/30

[Linux] 客製化Linux Kernel於VirtualBox Ubuntu18.04上

在Linux的學習之路上,常常會需要修改Linux Kernel來達到自己的需求,這篇紀錄如何在VirtualBox上置換Ubuntu18.04的Linux Kernel。目標是利用客製化成的deb檔案,來安裝修改的Linux Kernel,並且能夠在開機選單上挑選想要的版本開機。
這是Ubuntu18.04現有的Kernel版本。

[VirtualBox] MacOS與Ubuntu共用資料夾設定

在以MacOS為Host的情況下,要處理共用設定相對於Windows是比較麻煩的 。關於Windows與Ubuntu的共用資料夾設定可以參考這篇。因此,如果MacOS與Ubuntu要設定共用,比較簡單的方式是透過VirtualBox的共用資料夾來做。首先,在GuestOS上選擇設定Settings,如下圖:

2017/09/13

[Linux] Ubuntu之中Inter-Process Communication 利用sd-bus (D-bus)來實現

上次討論過在OpenWrt之中的IPC服務ubus,所以這次要來探討更大的系統Ubuntu之中所使用的IPC,也就是D-Bus。關於ubus的使用,有興趣可以參考這篇


從D-Bus的Wiki可以看到洋洋灑灑的介紹,但是這裡想要討論的是關於D-Bus的各種Implementations。目前比較常看到的有libdbus、sd-bus和GDBus等等,大體而言這三個都有依照D-Bus的標準來實作,只是三者在函式實作的等級不一樣。


2017/05/12

[C/C++] Thread Pool的實作 及 pthread_create參數的傳遞

假設一個使用情境,今天有10個人,每個人從1-10之間拿一個數字,隨機順序的累加。

設計上,可以利用pthread pool的方式來實作,用struct的方式來綁定一個thread,包含人名及所包含的值。然後各thread去累加一個global的變數。



2017/02/24

[OpenWrt] 用dnsmasq在OpenVPN設計custom domain

在OpenWrt中,可以透過dnsmasq來設定custom domain,基本的設定可以參考官網

但是如果想要透過OpenVPN連線,也能夠使用custom domain的話,要如何設定呢?

2017/02/17

[OpenWrt] 用ubus實現Inter-Process Communication

OpenWrt依靠ubus來做所有的IPC,所以也就是說,我認為玩OpenWrt不能不懂什麼是ubus。


[OpenWrt] ubus_invoke()使用介紹

一直在網路上找不到詳細介紹ubus_invoke的資料;在研究OpenWrt一段時間之後,決定把一些心得記錄下來。

2017/01/06

[C/C++] 轉換hex string to int

如果想要把hex string轉換成integer,可以利用stroul()stroull()來達成。

但要注意的是轉出來數值的範圍
資料型態
最大值(Decimal)
最大值(Hexadecimal)
unsigned long
4,294,967,295
0xFFFFFFFF
unsigned long long
18,446,744,073,709,551,615
0x1999999999999999

如表格所示,如果hex string數值超過0xFFFFFFFF,就要用stroull()來轉換。

2017/01/04

[Linux] shell script default values 腳本的變數預設值

如果我們要在腳本中,為變數設定預設值,可以透過"${a:-b}"的方式來設定

例如,設定變數$1之預設值為1492,則可以寫成
#!/bin/sh

mtu="${1:-1492}"
echo "$mtu"

2014/11/12

[Linux] Static Library和 Dynamic Library編譯

在Linux下編譯靜態連結函式庫(Static Library)和動態連結函式庫(Dynamic Library),兩者的差別是靜態函式庫是把整個Library包進去執行檔,因此可以保證到不同機器環境下執行,也不會因為少了這個函式庫導致無法執行檔案,但其缺點是檔案會比較大,假如大部分檔案都需要用到相同的函式庫,但全部都使用靜態連結的方式,那這樣非常的佔空間資源;而動態連結函式庫的好處,就是可以讓多個執行檔案,同時連結使用,可以減少佔空間,但是卻容易發生如果Library的版本不同,會導致連結執行錯誤。

兩者各有優缺點,要端看環境軟體和設定需求,來選擇編譯的方式。譬如檔案共用的多而且函式庫常見,那就要採用動態;少數檔案使用,或者函式庫較稀有,那就採用靜態設計。

2014/05/20

[Linux] Build Linux i2c-gpio module 標準Linux i2c interface[bit-banging]

I2C是在IC之間,常被使用的data bus,而在目前的MCU之中,很多時候都會用GPIO來做模擬,也稱作bit-banging,而且Linux kernel也有support這個部分的driver,以下為研究的小心得:

詳細的I2C protocol可以參考

這次的I2C detail information:
7 bits address / not open-drain / 100kHz

2014/05/11

[Linux] 使用getnameinfo()來get local IPv6 address及用mask比較subnet

IPv6會是未來使用IP address的趨勢,所以嘗試使用getnameinfo來拿到本機的IPv6位址,並且跟其他的IPv6位址(fe80::19fb:8e1d:e1c:947e)比較,看使否在同一個子網域之下。比較的方式採用IPv6的位址與mask做完AND運算,得到Network ID後與另外一個IPv6的Network ID位址比較,因為無法一次比較128bytes,所以依次8個bytes一組,總共比較16次,16的結果都相同,就判定在同一個subnet之下。

IPv6為長度128 bytes的位址,表示的方式會以每16個bytes以符號分號":"隔開的方式來表示,譬如例子的"fe80:0000:0000:0000:19fb:8e1d:e1c:947e",總個128bytes,然後連續0的地方可以用連續兩個分號"::"來表示,所以就變成"fe80::19fb:8e1d:e1c:947e"。

2014/03/18

[Linux] 連續記憶體分配策略(Contiguous Memory Allocation)

作業系統的記憶體管理,可以分成採用連續記憶體分配(Contiguous Memory Allocation)和採用分頁(Paging)技術。採用連續記憶體分配,方法簡單且速度快速,但缺點在於容易產生剩餘的記憶體片段(Fragmentation),記憶體的使用效率並不好,為了解決此現象,因此採用記憶體分頁的方式,來提升記憶體的使用率。

而在連續記憶體分配,有三個最常見的演算法,最先適用(first-fit)、最佳適用(best-fit)和最不適用(worst-fit)。底下舉特考的例子為例:

(102調查局特考_計算機概論)
五、記憶體的配置策略(Storage Placement Strategies)是用以決定進來的程式或資料應置於記憶體的那一區域。其策略包含最不適用(worst-fit)、最佳適用(best-fit)和最先適用(first-fit)等。 
(一)請說明上述三種策略(最不適用、最佳適用和最先適用)在比較之下,各策略的優勢為何?(10分)
(二)若目前記憶體分區(memory partitions)狀況依序為 490 KB,190 KB,290 KB及550 KB,而記憶體空間需求依序為400 KB,220 KB,120 KB及450 KB。請分別描述在最不適用、最佳適用和最先適用三種不同策略下的記憶體配置情形。(10分)

2014/03/16

[Linux] fork()的使用介紹

整個作業系統(Operating System, OS)是為了分配有限的硬體資源給Program使用,然而OS也視為一個Program,放進CPU中執行,為了讓OS Kernel辨識每個Process,就會有所謂的行程辨識元(Process Identifier, PID),其中特別的是PID 0和1,0是Kernel用來Swap,交換分頁使用;而1則是初始化行程,也是Kernel建立的第一個Process,其他的Process基本上都是透過PID 1的init Process來產生。因此整個OS系統本身可以想像成一個Tree of Processes,root為init Process,亦為Parent Process,然後用fork()依序產生底下的Child Process,並回傳值0代表是Child Process。

[Linux] Program, Process and Thread之差異

  • Program: code程式
  • Process: 正在CPU執行的Program
  • Thread: 使用CPU的最小單元,較為輕巧的process,一個process可以產生多的threadCPU是配給thread使用。


Thread存在有以下的目的:
(1) Responsiveness: 允許程式可以在被I/O中斷時,能夠繼續執行,譬如Web瀏覽器,可以同時看影片及下載檔案
(2) Resource Sharing: thread分享同樣的memoryresource,而process只能透過shared memorymessage passing的方法來分享資料
(3) Economy: threadprocess輕巧,創建和context switch thread比創建一個process來的快速
(4) Scalability: 可以平行執行於多核心的平台。


總結來說,寫好的code稱作為Program,放到CPU中執行就變成Process,但Process可以使用多的Thread代表的CPU執行單元,來增加執行效率。