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

2026年2月11日 星期三

ROCm 6.4.4 & pytorch 2.9.1 gfx803 / gfx900 build note

 後來想一想前篇留著當筆記, pytorch 2.9.1 再開一篇文寫.

以下筆記我自己實驗出可用的版本, ubuntu 24.04.3, ROCm 6.4.4, pytorch 2.9.1, 目標 gfx803, gfx900. 以下都可以在虛擬機裡編譯, 不需要真的有 AMD GPU. 之所以用 ROCm 6.4.4 不用 7.1.1 | 7.2.0 是因為這是最後一版支援 gfx803 (RX460/470/480/560/570/580) 的 ROCm, 也是最後一版支援 WSL 的 ROCm, 所以這篇就以 ROCm 6.4.4 (6.x 最後一版), pytorch 2.9.1 為主. 還是跟前篇一樣, 要編哪一版 pytorch 就要注意它是對到哪一版 ROCm.

ps. ROCm 7.1.1 可以支援在 ryzen 3000 開始的 APU (代號 gfx902), 但沒實驗出讓它跑 code 的辦法.

#首先 /etc/default/grub 裡替開機參數加東西, GRUB_CMDLINE_LINUX_DEFAULT 後面加上 "intel_iommu=on, iommu=pt", intel_iommu 是對 intel 用的, AMD ryzen 體系的預設 amd_iommu 都是 on, ryzen 之前的要看板子能不能開 IOMMU.

# 環境變數裡加東西, 下次登入時就生效. ps. 加在 /etc/environment.d/ 裡無效, 理由不明.

# Add GFX803 related variables
echo "ROC_ENABLE_PRE_VEGA=1" | sudo tee -a /etc/environment
echo "HSA_OVERRIDE_GFX_VERSION=8.0.3" | sudo tee -a /etc/environment

安裝 miniconda 3. conda init 是在 $LOGUSER , 特別記清處 rocm-build 這個字, 後面會很常用上

Miniconda 3

# Download and Install Miniconda 3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -P /tmp/
sudo bash /tmp/Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda
sudo sed -i 's|^PATH="|PATH="/opt/conda/bin:|' /etc/environment

# Logout to apply environment
exit

# Logged in
conda init
source ~/.bashrc
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
conda create -n rocm-build -y python=3.12
conda activate rocm-build

Install Prerequisites

sudo apt install -y build-essential ccache git libjpeg-dev \
libjpeg-turbo8-dev libpng-dev libmsgpack-dev libssl-dev \
python3-virtualenv libboost-dev libboost1.83-dev libmsgpack-cxx-dev \
ninja-build

ROCm 6.4.4

# Setup AMD repository
wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor \
| sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] \
https://repo.radeon.com/rocm/apt/6.4.4 noble main" | sudo tee \
--append /etc/apt/sources.list.d/rocm.list

echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: \
600' | sudo tee /etc/apt/preferences.d/rocm-pin-600

sudo apt update

# Install ROCm 6.4.4
sudo apt install rocm rocm-developer-tools rocm-ml-sdk \
rocm-ml-libraries rocm-hip-sdk rocm-hip-libraries

sudo sed -i 's|^PATH="|PATH="/opt/rocm/bin:|' /etc/environment

echo "ROCM_PATH=/opt/rocm" | sudo tee -a /etc/environment

# Logout to apply environment
exit

此時如果要修改 rocm 安裝版本, 就要在 /etc/apt/sources.list.d/rocm.list 中修改版本數字跟 ubuntu 發行主版號

#sudo nano /etc/apt/sources.list.d/rocm.list 

ps. 到寫這篇前還沒看到支援 ubuntu 26.04

rocBLAS 

# Re-enable conda environment
conda activate rocm-build

# Download rocBLAS
sudo mkdir /opt/rocBLAS

sudo chown $LOGNAME: /opt/rocBLAS

git clone --recursive https://github.com/ROCm/rocBLAS.git -b \
rocm-6.4.4 /opt/rocBLAS

cd /opt/rocBLAS

# Install required packages
pip install "cmake<4.0" joblib pyyaml virtualenv \
typing-extensions

# Build rocBLAS
time ./install.sh -a "gfx803;gfx900;gfx90a;gfx942;gfx1100" \
-b rocm-6.4.4

# Copy compiled library
sudo rsync -vrh /opt/rocBLAS/build/release/rocblas-install\
/lib/rocblas/library/ /opt/rocm/lib/rocblas/library/

SRC=$(sudo find \
/opt/rocBLAS/build/release/rocblas-install/lib/ \
-type f -name "librocblas.so.*")

TGT=$(sudo find /opt/rocm/ -type f -name "librocblas.so*")

LIST=$(find /opt/rocm/ -type l -name "librocblas.so*")

sudo rsync -vrh \
/opt/rocBLAS/build/release/rocblas-install/lib/rocblas/library/ \
/opt/rocm/lib/rocblas/library/

sudo cp -f ${SRC} ${TGT}
for d in ${LIST}; do sudo ln -sf ${TGT} ${d}; done

rocBLAS 這裡新加一個很重要的參數 -b, -b 參數是指定 Tensile branch, 這個最好跟 rocBLAS branch 一樣指到哪版就指定哪版, 否則預設會去抓最新版, 最新版往往要不根本編不起來, 要不根本不存在. 我在寫這篇文的時候編譯時 Tensile 指到 4.45, github 上只 release 4.43. 這裡只能更確定做這些東西的人根本沒試過能不能正常安裝就丟出來了.

rocSOLVER

ps. rocSOLVER ROCm 7.0 開始才能指定 Tensile 版本, 如果是 7.0 之後的版本就建議跟 rocBLAS 一樣 install.sh 要多下一個 -b 指定 Tensile 版號.

(update: ROCm 7.0以上特有) rocSOLVER的編法很奇怪, 最好特別連進去 ssh console 裡再操作 install.sh, 否則不會動作.

# Download rocSOLVER
sudo mkdir /opt/rocSOLVER
sudo chown $LOGNAME: /opt/rocSOLVER
git clone --recursive https://github.com/ROCm/rocSOLVER.git -b \
rocm-6.4.4 /opt/rocSOLVER
cd /opt/rocSOLVER

# Build rocBLAS
time ./install.sh -a "gfx803;gfx900;gfx90a;gfx942;gfx1100"


# Copy compiled library
SRC=$(sudo find \
/opt/rocSOLVER/build/release/rocsolver-install/lib/ \
-type f -name "librocsolver.so.*")

TGT=$(sudo find /opt/rocm/ -type f -name "librocsolver.so*")

LIST=$(find /opt/rocm/ -type l -name "librocsolver.so*")

sudo cp -f ${SRC} ${TGT}
for d in ${LIST}; do sudo ln -sf ${TGT} ${d}; done

# Reboot 

如果你是在目標機器上編的話才要 reboot.

PyTorch 2.9.1

# Re-enable conda environment
conda activate rocm-build

# Download PyTorch
sudo mkdir /opt/pytorch
sudo chown $LOGNAME: /opt/pytorch
git clone --recursive https://github.com/pytorch/pytorch.git -b v2.9.1 /opt/pytorch
cd /opt/pytorch

# Install required packages
pip install mkl-static mkl-include -r requirements.txt

# Build PyTorch
export PYTORCH_ROCM_ARCH="gfx803;gfx900"
export PYTORCH_BUILD_VERSION=2.9.1 PYTORCH_BUILD_NUMBER=1
python tools/amd_build/build_amd.py
time python setup.py bdist_wheel

# Install PyTorch
pip install /opt/pytorch/dist/torch-2.9.1-cp312-cp312-linux_x86_64.whl

ps1. torchVision 要編譯 0.24.1 , pytorch 也是有對應版號的
https://github.com/pytorch/vision

ps2. torchAudio 對應版號是 2.9.1 

之後就比照 https://github.com/NULL0xFF/rocm-gfx803?tab=readme-ov-file 這邊筆記操作.
後續有實驗成功的版本我會再貼上來.

update: 操蛋的, 花了我三個禮拜試一堆組合後終於可以動了....

MNIST PyTorch example

  1. Clone the PyTorch examples repository.

    git clone https://github.com/pytorch/examples.git
    
  2. Go to the MNIST example folder.

    cd examples/mnist

以上引用自 https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/3rd-party/pytorch-install.html

update2: rocm 7.0 開始擋掉對 gfx803 的支援.


2026年2月6日 星期五

ROCm 6.3.3 & pytorch 2.4.1 gfx803 / gfx900 build note

這篇只是筆記, 主要引述自(NULL0xFF / rocm-gfx803)這裡的編譯指引, 這篇主要針對 ubuntu 22.04 的環境使用, 對的是 ROCm 6.1.5, 所以 pytorch 最好的配對版本是 2.4.1, pytorch 對 ROCm 的版本基本不會是自由配對, 可以參考這裡, 而 pytorch 每個版本編譯情況不一樣, 通常要選好特定的版本下手比較穩.. 

以下筆記我自己實驗出可用的版本, ubuntu 24.04.3, ROCm 6.3.3, pytorch 2.4.1, 目標 gfx803, gfx900. 以下都可以在虛擬機裡編譯, 不需要真的有 AMD 的 GPU.

# 環境變數裡加東西, 下次登入時就生效. ps. 加在 /etc/environment.d/ 裡無效, 理由不明.

# Add GFX803 related variables
echo "ROC_ENABLE_PRE_VEGA=1" | sudo tee -a /etc/environment
echo "HSA_OVERRIDE_GFX_VERSION=8.0.3" | sudo tee -a /etc/environment

安裝 miniconda 3. conda init 是在 $LOGUSER 下, 特別記清處 rocm-build 這個字, 後面會很常用上

# Download and Install Miniconda 3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -P /tmp/
sudo bash /tmp/Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda
sudo sed -i 's|^PATH="|PATH="/opt/conda/bin:|' /etc/environment

# Logout to apply environment
exit

# Logged in
conda init
source ~/.bashrc
conda create -n rocm-build -y python=3.12
conda activate rocm-build

Install Prerequisites

sudo apt install -y build-essential ccache git libjpeg-dev libjpeg-turbo8-dev libpng-dev libmsgpack-dev libssl-dev python3-virtualenv libboost-dev libboost1.83-dev libmsgpack-cxx-dev 

ps. ROCm 6.3 最後一版是 6.3.4, 但 rocblas 關聯 ROCm 6.3 的部份只到 6.3.3, 所以以下 ROCm 使用 6.3.3

Install ROCm (基本到 7.2.0 也一樣)

ROCm 6.3.3

# Setup AMD repository
wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.3.3 noble main" | sudo tee --append /etc/apt/sources.list.d/rocm.list
echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' | sudo tee /etc/apt/preferences.d/rocm-pin-600
sudo apt update

# Install ROCm 6.3.3
sudo apt install rocm rocm-developer-tools rocm-ml-sdk rocm-ml-libraries rocm-hip-sdk rocm-hip-libraries
sudo sed -i 's|^PATH="|PATH="/opt/rocm/bin:|' /etc/environment
echo "ROCM_PATH=/opt/rocm" | sudo tee -a /etc/environment

# Logout to apply environment
exit

此時如果要修改 rocm 安裝版本, 就要在 /etc/apt/sources.list.d/rocm.list 中修改版本數字跟 ubuntu 發行主版號: 

#sudo nano /etc/apt/sources.list.d/rocm.list 

ps. 到寫這篇前還沒看到支援 ubuntu 26.04

rocBLAS 

# Re-enable conda environment
conda activate rocm-build

# Download rocBLAS
sudo mkdir /opt/rocBLAS
sudo chown $LOGNAME: /opt/rocBLAS
git clone --recursive https://github.com/ROCm/rocBLAS.git -b rocm-6.3.3 /opt/rocBLAS
cd /opt/rocBLAS

# Install required packages
pip install "cmake<4.0" joblib pyyaml

# Build rocBLAS
time ./install.sh -a "gfx803;gfx900;gfx90a;gfx942;gfx1100"

# Copy compiled library
sudo rsync -vrh /opt/rocBLAS/build/release/rocblas-install/lib/rocblas/library/ /opt/rocm/lib/rocblas/library/
sudo cp -f $(find /opt/rocBLAS/build/release/rocblas-install/lib/ -type f -name "librocblas.so.*") $(find /opt/rocm/ -type f -name "librocblas.so*")$(find /opt/rocBLAS/build/release/rocblas-install/lib/ -type f -name "librocblas.so.*") $(find /opt/rocm/ -type f -name "librocblas.so*")

rocBLAS 這裡會編譯從 ROCm 6.0 開始就被拿掉的 gfx803, gfx900 hsaco 等 kernel 檔案, 以及把檔案關聯放進 librocblas.so 裡 (ROCm 5.0 開始 gfx803, gfx900 有檔案但沒有相關連結), 因為如果全部的 GPU 都塞進來的話, 會在後面編 pytorch ldd 時因為 so 檔太大無法成功連結, 所以選好自己想要編進去的東西. 而 gfx90a/942/1100 這三個是 pytorch 要的, 不是我想加的...


rocSOLVER的編法很奇怪, 最好特別連進去 ssh console 裡再操作 install.sh, 否則不會動作.

rocSOLVER

# Download rocBLAS
sudo mkdir /opt/rocSOLVER
sudo chown $LOGNAME: /opt/rocSOLVER
git clone --recursive https://github.com/ROCm/rocSOLVER.git -b rocm-6.3.3 /opt/rocSOLVER
cd /opt/rocSOLVER

# Build rocBLAS
time ./install.sh -a "gfx803;gfx900;gfx90a;gfx942;gfx1100"

# Copy compiled library
sudo cp -f $(find /opt/rocBLAS/build/release/rocblas-install/lib/ -type f -name "librocblas.so.*") $(find /opt/rocm/ -type f -name "librocblas.so*")echo $(find ./build/release/rocsolver-install/lib/ -type f -name "librocsolver.so.*") $(find /opt/rocm/ -type f -name "librocsolver.so*")

# Reboot 

如果你是在目標機器上編的話才要 reboot.

Install PyTorch

PyTorch 2.4.1 (可以自己改 2.7.1)

# Re-enable conda environment
conda activate rocm-build

# Download PyTorch
sudo mkdir /opt/pytorch
sudo chown $LOGNAME: /opt/pytorch
git clone --recursive https://github.com/pytorch/pytorch.git -b v2.4.1 /opt/pytorch
cd /opt/pytorch

# Install required packages
pip install mkl-static mkl-include ninja -r requirements.txt

# Build PyTorch
export PYTORCH_ROCM_ARCH="gfx803;gfx900"
export PYTORCH_BUILD_VERSION=2.4.1 PYTORCH_BUILD_NUMBER=1
python tools/amd_build/build_amd.py
time python setup.py bdist_wheel

# Install PyTorch
pip install /opt/pytorch/dist/torch-2.4.1-cp312-cp312-linux_x86_64.whl

ps1. 2.5.0 & 2.5.1 我嘗試編過, 失敗, 2.6我沒試, 2.7.1可以順利編過, 2.8.0 檔案下載 SHA256 有問題我找不到可以改哪裡. 以上也可以自己改成 2.7.1 跑.

ps2. 2.4.x & 2.5.x 編完記得把 ~/.triton/cache ~/.triton/dump 清一清.

ps3. 如果裝的是 pytorch 2.4.1 的話 torchvision 請用 0.19, pytorch 2.7.1 的話請用 0.22, 參考 https://github.com/pytorch/vision

之後就比照 https://github.com/NULL0xFF/rocm-gfx803?tab=readme-ov-file 這邊筆記操作.

後續有實驗成功的版本我會再貼上來.

update: pytorch 2.10.0 有編起來了, 後續 torchvision & pytorch 測試會以 2.10.0 優先, 除非 2.10.0 碰到什麼釘子我再回來 2.7 或 2.4 試試看.












2024年12月20日 星期五

linux & serial port mouse.

 linux 底下 serial port 可以怎樣搞它這不用我在這講, 這次只講 serial port 版本的滑鼠怎麼用. serial port touch 也是類似的用法.

https://forums.linuxmint.com/viewtopic.php?t=329420

"inputattach --microsoft -daemon /dev/ttyS0"


2024年12月5日 星期四

USB i2c dongle 一點小筆記

以下以 ubuntu linux 平臺下應用為主. 使用前個人建議給自己的帳號加入兩個群組:

# sudo usermod -aG dialout ${USER}
# sudo usermod -aG i2c ${USER}

方便以一般使用者身份操作.

目前買過的幾種:

  1. WCH CH341: 市面上最多也最便宜, i2c  / spi 要另外掛 driver. 我目前用 flank 的版本, 不過 SPI 要另外寫 script 開啟. ch341 i2c 本身有不等待 ACK 回應的問題, 會有些相容性問題, 這點要特別注意.
  2. WCH CH347: 目前簡單測試是還沒碰到問題, driver 我用 aystarik的版本, 這個是我從 aystarik的版本再修改過的版本, ACK 回應還沒測試, 後面補上..
  3. FTDI FT232H: 這個要用它的 i2c 要透過它的 MPSSE library, 但看來還需要 programming GPIO 的 EEPROM 資料, 目前不會動. python i2c 據說可以繞過沒 EEPROM 資料直接操作, 懶的理會....
  4. SiliconLab CP2112: 這個跟 FT232H 一樣沒原生 i2c master 的 kernel module 可用, 都要透過它自家的 library 操作, 看到這裡就直接丟在一邊沒繼續再試.
  5. STM32F103C8T6 i2c-tiny-usb: 這個是眾多寫成 i2c-tiny-usb 的裝置之一, code在這裡, 不過這個我用 C6T6 跑不起來, 一定要 C8T6. 
目前拿 stm32 寫的 i2c-tiny-usb 先用, 缺點只是反應稍慢.

i2c-tiny-usb 還有強者寫出 attiny45/85 的版本, attiny 跟 STM32f1 的差別在 attiny 本身沒有 h/w USB, 這個是拿 GPIO 模擬的, 所以 i2c master clock 預設為 50Khz, 然後我沒用過這個版本, 無從報告好壞.


2024年6月18日 星期二

小麥輸入法@xubuntu24.04

作者 git

安裝方式如 git 所寫, 不需要修改, 我只是貼上我自己編的版本 (2.7.11 for ubuntu 24.04 amd64)

替代用了好幾年的新酷音 (ibus-chewing) 輸入法用的, 新酷音在 fcitx5 上的純注音模式還要多按一個下鈕才會出現, fcitx5-zhuyin 也一模一樣, 總之這年頭要找一個純粹注音輸入法竟然是有這麼困難. 還好小麥輸入法這作者還有保留純注音模式, 只是檔案需要自己編譯, 裡面是用 cmake, 所以單獨抽出 binary 包成 .deb 來用. 雖然即便如此, 為了一個 fcitx5 仍要安裝龐大的 qt6 runtime 跟一大票有的沒的東西, 基本上不小於 build-essential...

關聯兩個套件, fcitx5, libfmt9, 也可以用 dpkg -i 安裝完 fcitx5-mcbopomofo 再用 apt-get install -f 叫 apt 自己去補上缺的套件..

2025/10/08 update. 更版到 2.9.2, 後來發現 ibus 的問題也終於修好了. 以下 github:

https://github.com/openvanilla/fcitx5-mcbopomofo

檔案:

https://github.com/zetta-shao/fcitx5-mcbopomofo-deb/releases/


2024年6月5日 星期三

VMware workstation ubuntu 24.04 note

 最後竟然是 libfreetype 卡關很久.........

sudo apt-install libncursesw6
ln -s /usr/lib/x86_64-linux-gnu/libncursesw.so.6 /usr/lib/x86_64-linux-gnu/libncursesw.so.5

rm /usr/bin/vmware-modconfig
ln -s /usr/bin/true /usr/bin/vmware-modconfig

rm /usr/lib/vmware/lib/libz.so.1/libz.so.1
ln -s /usr/lib/x86_64-linux-gnu/libz.so.1 /usr/lib/vmware/lib/libz.so.1/libz.so.1

rm /usr/lib/vmware/lib/libfontconfig.so.1/libfontconfig.so.1
ln -s /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 /usr/lib/vmware/lib/libfontconfig.so.1/libfontconfig.so.1

rm /usr/lib/vmware/lib/libfreetype.so.6/libfreetype.so.6
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6 /usr/lib/vmware/lib/libfreetype.so.6/libfreetype.so.6

2024年3月5日 星期二

AMD R5 340/350 R7 240/250 一點筆記

 GPU: AMD Oland

https://www.techpowerup.com/gpu-specs/amd-oland.g389

這是從鹹魚上找來的 dell 拆機貨, 打算取代 GTX750Ti 的 HDMI YUV422 4K 用. GTX750ti 沒有不好, 就是沒有 DP 輸出可用, 也無法輸出 RGB888 4K, 不然論 GPU 能力是強過 Oland 的. 然後因為我是在 ubuntu 底下用, linux 下 AMD GPU 支援度要好的多.

不過需注意的是, kernel 同時有兩支 driver 支援這系列的卡, radeon 跟 amdgpu, 而 mesa RADV 只支援後者, 所以記得在 /etc/defconfig/grub 裡加上"

radeon.si_support=0 amdgpu.si_support=1

的敘述, RADV 才能使用, 才能原生支援 vulkan.

2024年2月5日 星期一

rustdesk @ ironlake GPU

 應用情境是使用 i5-520m 的 Thinkpad x201, GPU 是 ironlake, 只有 OpenGL 2.1 可用, OS 使用 xubuntu 22.04.3, kernel 6.5.0-14, mesa 23.0.4

在這麼老的 landtop 上可以安裝 rustdesk client 的 deb, 不過啟動會碰上一堆錯誤 (serial 292 error_code 167 request_code 152 (GLX) minor_code 0). 

解法是啟動參數這邊這樣下:

---

env LIBGL_ALWAYS_SOFTWARE=true MESA_GL_VERSION_OVERRIDE=3.3 MESA_GLSL_VERSION_OVERRIDE=330 rustdesk

---

update: 可以當控端, 可以當被控端, 看 CPU 使用率應該是沒有 h/w encoder 可以支援, 無法確認.


update: 環境多設定一個參數, 即可讓 rustdesk 以純軟體方式啟動, 沒有 OpenGL 可用都無所謂 (但應該是 liunx 下才能用...):

LIBGL_ALWAYS_SOFTWARE=1

linux x11 例:

env LIBGL_ALWAYS_SOFTWARE=1 rustdesk



2023年10月17日 星期二

筆記 systemd-networkd

 簡單的說 ubuntu 體系的常會在開機時卡在 systemd-networkd-wait-online 很久很久, 如果機器本身是需要設定固定 ip, 沒有對外更沒有啥 dhcp server 可連線時就會卡很久

這裡有位高手提供一個解法: 首先:

sudo systemctl edit --full systemd-networkd-wait-online.service

在裡面找到 ExecStart, 改成像這樣:

ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --timeout=10

就可以跳過這個無意義工作.

2023年7月6日 星期四

usb ethernet adapter rename

USB ethernet 像 AX88772, AX88179 等在 ubuntu 下會重命名為 enx<MAC address> 的名稱, 我對名稱叫什麼沒有意見, 但 nfs client 有, 做 IPv6 nfs mount 時都會出現 "an incorrect mount option was specified" 的錯誤.

這問題我找了一段時間, 沒有找到解法. 直到有一天因為工作的需求使用 SUSE 這套 distro 時發現, 在它底下 USB thernet 可以正常使用 IPv6 nfs mount.... !! 只是跟 ubuntu 不一樣的是, 它 USB ethernet 就只是叫 eth? 而已, 不是照 bus-tree 這些來命名... 

好了, 那如何更改 ubuntu 下的 USB ethernet 名稱? 我在這裡找到有人提供改寫 udev rules 的方式達成:

以 root 身份增加檔案 /etc/udev/rules.d/76-netnames.rules
---
# USB device by path
# get ID_PATH if not present yet
ENV{ID_PATH}=="", IMPORT{builtin}="path_id"
SUBSYSTEM=="net", ACTION=="add", ENV{ID_PATH}=="*-usb*", NAME="ueth%n"

---

以 root 身份重觸發 udev:

# udevadm control --reload-rules; udevadm trigger;

下次再接上 USB ethernet 時就會更名為 ueth?, 更名成這樣就可以正常使用 IPv6 nfs mount.