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

2025年12月29日 星期一

ubuntu 24.04 如何使用兩台 SATA SSD 建立 RAID 1

  ubuntu 24.04 如何使用兩台 SATA SSD 建立 RAID 1

在 Ubuntu 24.04 中使用两块 SATA 硬盘建立 RAID 1(镜像)主要有两种方式:
在安装系统时配置,通过 Subiquity 或 Ubiquity(手动分区)创建 RAID 阵列作为根目录 / 和 /boot/efi;在系统安装完成后使用 mdadm 工具在现有的磁盘上创建软件 RAID 阵列,并修改 /etc/fstab 进行挂载,实现数据冗余。 
方法一:安装时配置(推荐系统盘)
这是最彻底的方案,将系统安装在 RAID 1 阵列上,实现系统级别的冗余。
  1. 启动安装程序,选择 "Custom storage layout" (自定义存储布局)。
  2. 为每块硬盘创建分区 (例如 /dev/sda 和 /dev/sdb)。
  3. 创建 RAID 1 阵列:
    • 选择 "Create software RAID" (创建软件 RAID)。
    • 选择 RAID Level 1,添加两个硬盘上的对应分区 (如 /dev/sda2 和 /dev/sdb2)。
    • 将此 RAID 阵列分配给 / (根目录) 和 /boot/efi (UEFI/GPT 必须为每块硬盘单独创建 EFI 分区)。
  4. 安装引导加载程序:在引导加载程序安装界面,将 Grub 安装到两个物理硬盘 (/dev/sda 和 /dev/sdb),确保双引导。 
方法二:安装后使用 mdadm (适用于数据盘/后添加)
如果在系统运行中添加硬盘,或不希望系统盘是 RAID,可使用此方法。
  1. 安装 mdadm:
    bash
    sudo apt update && sudo apt install mdadm
    
  2. 分区: 使用 fdisk (或 gdisk / parted) 为两块硬盘(例如 /dev/sdb, /dev/sdc)创建相同大小的 Linux RAID 分区 (Type: fd00)。
    bash
    sudo fdisk /dev/sdb
    # 选 n (new), p (primary), partition number, default start/end, t (type), fd (Linux raid autodetect)
    sudo fdisk /dev/sdc
    # 重复上述操作
    
  3. 创建 RAID 1 阵列:
    bash
    sudo mdadm --create --level=1 --raid-devices=2 --name=myraid1 /dev/md0 /dev/sdb1 /dev/sdc1
    
  4. 创建文件系统:
    bash
    sudo mkfs.ext4 /dev/md0
    
  5. 保存配置并挂载:
    • 保存配置: sudo mdadm -D -s >> /etc/mdadm/mdadm.conf。
    • 创建挂载点: sudo mkdir /mnt/raid1。
    • 编辑 /etc/fstab (sudo nano /etc/fstab),添加:
      /dev/md0 /mnt/raid1 ext4 defaults,nofail 0 0
      
    • 立即挂载: sudo mount -a。
  6. 更新 initramfs (以确保系统能识别 RAID 阵列):
    bash
    sudo update-initramfs -u
    
     
完成以上步骤后,你的两块 SATA 硬盘就组成了 RAID 1 镜像,一块硬盘故障,数据仍然可用。 

2025年8月25日 星期一

Docker Save & Load command by (commit container )

 你可以使用 docker save 指令將一個或多個 Docker 映像儲存為一個單一的 .tar 歸檔檔案。這個歸檔檔案包含了映像的所有層和中繼資料,方便你在沒有 Docker Registry 的環境下傳輸、備份或分享映像。

目的是備份在容器內對 ROS2 程式碼或組態檔所做的修改:

  • 最佳做法:應該將程式碼放在 Volume 中,然後備份 Volume 即可。

  • 替代做法:如果您是在容器內直接修改,建議您先使用 docker commit 將容器的修改保存為一個新的鏡像,然後再用 docker save 匯出這個鏡像為 .tar 檔案。這樣才能保留完整的環境配置和元數據,以便未來準確重建環境。

# 1. 將容器修改提交成新的 Image
docker commit my_amr_container my_amr_amr_image:v1.0

# 2. 匯出這個 Image 為 tar 檔案 (這是更推薦的備份方式)
docker save -o my_amr_image_v1.0.tar my_amr_amr_image:v1.0

指令格式

docker save 的基本格式如下:

docker save [選項] <映像名稱> -o <輸出檔名>

或

docker save [選項] <映像名稱> > <輸出檔名>

常用選項

  • -o 或 --output:將輸出寫入指定的檔案,而不是標準輸出。

  • <映像名稱>:要儲存的 Docker 映像名稱和標籤(例如 osrf/ros:humble-desktop-full)。

  • > <輸出檔名>:使用標準輸出重新導向的方式將歸檔內容寫入檔案。


使用範例

假設你想要將我們之前使用的 ros2_humble_gz_rviz_gpu/20250731 映像儲存為一個 .tar 檔案,你可以這樣做:

# 儲存單一映像
docker save ros2_humble_gz_rviz_gpu/20250731 -o ros2_dev_image.tar

如果你想將多個映像一起儲存,只需在指令中列出它們:


# 儲存多個映像
docker save ros2_humble_gz_rviz_gpu/20250731 my_custom_app:latest -o my_images.tar

如何載入儲存的映像

當你在另一台機器上,你可以使用 docker load 指令來載入這個 .tar 歸檔檔案,並將映像重新添加到本地的 Docker 映像列表中。

# 從歸檔檔案載入映像
docker load -i ros2_dev_image.tar

-------------------------

您可以將名為 ros2dev 的運行中 Docker 容器存入為一個新的映像,然後再將其保存到檔案中。

這是一個兩步過程:

  1. 將容器提交(Commit)為映像 使用 docker commit 指令將容器 ros2dev 的當前狀態儲存為一個新的映像。

    docker commit ros2dev my_ros2dev_image:latest
    

    這個指令會創建一個名為 my_ros2_image 的新映像,其中包含了您在容器內所做的所有更改和安裝。

  2. 將映像保存到檔案 使用 docker save 指令將新創建的映像儲存為一個 .tar 歸檔檔案。

    docker save my_ros2dev_image:latest -o ros2dev_image.tar
    

    這個 ros2dev_image.tar 檔案就是 ros2dev 容器的完整備份,您可以在沒有 Docker Registry 的情況下輕鬆地將其備份、分享或傳輸到其他機器上。


================================
tar gz command
.tar.gz
套件名稱:gzip。

壓縮:
$ tar zcvf FileName.tar.gz DirName

解壓縮:
$ tar zxvf FileName.tar.gz


.tar (僅打包,無壓縮)
套件名稱:tar。
打包:
$ tar cvf FileName.tar DirName
解包:
$ tar xvf FileName.tar


.gz
套件名稱:gzip。
壓縮
$ gzip FileName
解壓縮 1:
$ gunzip FileName.gz
解壓縮 2:
$ gzip -d FileName.gz

2025年7月28日 星期一

ros2dev by Docker run 啟動參數說明 ( by ros2_humble_gz_rviz_gpu/20250704 )

 以下是這支 docker run 指令中各參數的詳細說明,以助你理解每個選項的用途和效果。

[bash]
# 允許本地 Docker 容器存取 X11 顯示 xhost +local:docker docker run -it -d --name ros2dev \ --restart=always --gpus all \ --net=host \ --privileged \ --env DISPLAY=$DISPLAY \ --env QT_X11_NO_MITSHM=1 \ --volume /tmp/.X11-unix:/tmp/.X11-unix:rw \ --volume $(pwd)/ros2_data:/home/ubuntu/data \ --device /dev/ttyACM0:/dev/ttyACM0 \ --device /dev/ttyUSB0:/dev/ttyUSB0 \ ros2_humble_gz_rviz_gpu/20250704 \ bash -c "source /opt/ros/humble/setup.bash && bash"

===============================================================================
參數說明
xhost +local:docker允許本地使用者 docker(本地 UNIX domain)存取 X11 伺服器,以便容器內的 GUI(如 Gazebo、RViz)能顯示到本機螢幕。
docker run啟動並執行一個新的容器。
-it結合 -i(保持標準輸入開啟)與 -t(分配虛擬終端機),使你可以在容器中進行互動式操作。
-d以「背景模式」(detached)執行容器,命令執行後立即回到主機終端。
--name ros2dev為容器指定名稱 ros2dev,方便後續透過名稱管理(如 docker stop ros2dev、docker logs ros2dev)。
--restart=always容器異常退出或 Docker 重啟後,自動重啟此容器,確保長期穩定運行。
--gpus all將主機上所有 GPU 都分配給此容器,允許容器內做 GPU 加速運算(需 Docker 19.03+ 與 NVIDIA Container Toolkit)。
--net=host使用 主機網路模式,容器與主機共用網路堆疊,無 NAT,延遲更低,適合 ROS2 DDS 多播與網路通訊。
--privileged賦予容器幾乎等同於主機的「特權」權限,才能存取低階裝置、修改網路設定等(如使用 --device 時通常搭配)。
--env DISPLAY=$DISPLAY將主機的 DISPLAY 環境變數傳入容器,告訴容器 GUI 應該輸出到哪個 X11 顯示伺服器。
--env QT_X11_NO_MITSHM=1解決 Qt 應用(如 RViz)在 X11 上使用共享記憶體時可能的顯示錯誤。
--volume /tmp/.X11-unix:/tmp/.X11-unix:rw將主機的 X11 socket(Unix domain)掛載到容器,使容器內程式能透過該 Socket 與 X 伺服器溝通,rw 表示可讀寫。
--volume $(pwd)/ros2_data:/home/ubuntu/data將當前工作目錄下的 ros2_data 資料夾映射到容器內 /home/ubuntu/data,用於持久化地圖、日誌或其他資料。
--device /dev/ttyACM0:/dev/ttyACM0將主機的 USB 裝置(例如 Arduino、micro:bit 之類的 Serial 裝置)映射進容器,供容器內驅動程式或節點存取。
--device /dev/ttyUSB0:/dev/ttyUSB0類似上條,映射另一個 USB Serial 設備(如 IMU、LiDAR 透過 USB 連線)。
ros2_humble_gz_rviz_gpu/20250704要執行的 Docker 映像名稱及 Tag(版本標記),通常會標示 ROS 版本、包含的軟體與建立日期。
bash -c "source /opt/ros/humble/setup.bash && bash"容器啟動後執行的命令:先 source ROS 2 環境設定,然後開啟一個互動式 bash,讓你馬上能夠使用 ROS2 指令。

💡 小技巧

  • 顯示 GUI:需先在主機執行 xhost +local:docker,並將 /tmp/.X11-unix 與 DISPLAY 傳入容器。

  • 持久化資料:使用 --volume $(pwd)/ros2_data:/home/ubuntu/data,即使重建或刪除容器,資料仍保留在主機。

  • 多設備:--device 可以多次指定,用於連接多種實體硬體(USB、串口、GPU)。

  • 自動重啟:--restart=always 保證服務長期在線,適合開發板或長期測試。

  • 網路模式:--net=host 避免 ROS2 DDS 的多播發不出的問題,但在跨主機部署時需注意安全性。


這樣的設定能讓你在容器內 完整模擬(Gazebo)、可視化(RViz)以及與實體硬體串接(IMU、Arduino、LiDAR)時,都擁有接近原生的體驗。


=================================================


以下是這份 docker‑compose.yml 主要欄位的功能與建議設定,幫你釐清每個參數的意義與用途:

[yaml]
version: "3.8" services: ros2dev: build: . container_name: ros2_humble_gz_gpu # ---------- GPU 支援 ---------- deploy: resources: reservations: devices: - capabilities: [gpu] runtime: nvidia # ---------- 環境變數 ---------- environment: - NVIDIA_VISIBLE_DEVICES=all # 容器可見所有 GPU - NVIDIA_DRIVER_CAPABILITIES=graphics,utility,video,compute - DISPLAY=${DISPLAY} # 傳遞主機 DISPLAY,啟用 GUI - QT_X11_NO_MITSHM=1 # 解決 Qt X11 共享記憶體問題 # ---------- Volume 掛載 ---------- volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw # X11 Socket,用於顯示 Gazebo/RViz - ./src:/root/ros2_ws/src:rw # 專案原始碼掛載到容器 network_mode: host # 與主機共用網路堆疊 privileged: true # 賦予容器特權模式,可存取所有裝置 stdin_open: true # -i 保持 stdin tty: true # -t 分配虛擬終端

各參數說明

  • version: "3.8"
    定義 Compose 檔案的語法版本,3.8 支援 deploy.resources 等新功能。

  • services → ros2dev
    服務名稱,自訂為 ros2dev,後面所有設定都套用在這個容器上。

  • build: .
    以當前目錄的 Dockerfile 來建置映像。

  • container_name: ros2_humble_gz_gpu
    容器啟動後的名稱,方便用 docker ps、docker logs、docker exec 等指令操作。


GPU 支援

  • deploy.resources.reservations.devices.capabilities: [gpu]
    宣告此服務需要 GPU,當你使用 Swarm 或支援 deploy 的環境時才會生效。

    ⚠️ 如果你用的是單機 Docker Compose(非 Swarm),這段通常不會生效,你可以直接在 CLI 加上 --gpus all。

  • runtime: nvidia
    指定使用 NVIDIA Container Runtime,確保容器可以存取 GPU。


環境變數

  • NVIDIA_VISIBLE_DEVICES=all
    讓容器看得到所有 GPU,或改為 0,1 只顯示指定卡號。

  • NVIDIA_DRIVER_CAPABILITIES=graphics,utility,video,compute
    啟用 GPU 的圖形、計算等功能,必須包含 compute 才能跑 CUDA。

  • DISPLAY=${DISPLAY}
    傳遞主機的 DISPLAY,告訴容器 GUI 畫面要輸出到哪個螢幕。

  • QT_X11_NO_MITSHM=1
    解決 Qt 應用(如 RViz)在 X11 上的共享記憶體錯誤。


Volume 掛載

  • /tmp/.X11-unix:/tmp/.X11-unix:rw
    掛載主機的 X11 Unix Socket,讓容器透過這個 Socket 與 X11 伺服器通訊,才能顯示 Gazebo、RViz。

  • ./src:/root/ros2_ws/src:rw
    將當前目錄下的 src(你的 ROS2 原始碼)掛到容器的工作目錄,方便在本機修改程式後立即反映到容器內。


網路與權限

  • network_mode: host
    容器與主機共用網路堆疊,DDS 多播等通訊可直接發送到本機網路。

  • privileged: true
    賦予容器幾乎與主機相同的權限,可存取全部裝置,適合要操作串口、GPIO、USB 等硬體。

  • stdin_open: true (-i)
    保持標準輸入開啟,使你可以 docker attach 或 docker exec -it 進行互動。

  • tty: true (-t)
    為容器分配虛擬終端機,使輸出排版漂亮。


啟動方式建議

如果你的 Compose 版本不支援 deploy.resources,可改用:

bash
docker compose --profile=gpu up --build

或在 CLI 加上 GPU 參數:

bash
docker-compose up -d --build # 然後手動執行: docker run --gpus all ...

如此一來,既能在容器中使用 Gazebo、RViz,又能透過 USB、TTY 控制真實硬體,是開發與測試 ROS2 自走車的理想配置。