Files
markbase/docs/ISCSI_GOTGT_TEST_REPORT.md
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

11 KiB
Raw Blame History

MarkBase gotgt iSCSI Target Integration Test Report

創建時間: 2026-05-19 21:00
版本: 1.0
測試環境: macOS 26.4.1 arm64 (M4 Mac mini)
測試人員: warren


目錄

  1. 系統架構
  2. 測試摘要
  3. 測試項目詳情
  4. Block Device 支援
  5. 效能數據
  6. 原始碼變更
  7. 使用方式
  8. 已知問題
  9. 後續建議

1. 系統架構

┌─────────────────────────────────────────────────────┐
│                  MarkBase (Rust)                      │
│  ┌──────────────────────────────────────────────┐   │
│  │           iscsi_target.rs (220 lines)         │   │
│  │  ┌────────┐  ┌──────────┐  ┌──────────────┐ │   │
│  │  │ start  │  │  stop    │  │   status     │ │   │
│  │  └───┬────┘  └────┬─────┘  └──────┬───────┘ │   │
│  │      │            │               │          │   │
│  │  ┌───▼────────────▼───────────────▼───────┐  │   │
│  │  │        generate_config()               │  │   │
│  │  │  ┌──────────────────────────────────┐  │  │   │
│  │  │  │ file: / blk: backend selection   │  │  │   │
│  │  │  │ LUN creation / validation        │  │  │   │
│  │  │  └──────────────────────────────────┘  │  │   │
│  │  └────────────────────────────────────────┘  │   │
│  └──────────────────────────────────────────────┘   │
│                        │                             │
│                        ▼                             │
│              ┌─────────────────┐                     │
│              │  gotgt daemon   │                     │
│              │  (Go binary)    │                     │
│              └────────┬────────┘                     │
│                       │                              │
│                 TCP:3260                              │
│                       │                              │
│              ┌────────▼────────┐                     │
│              │  Storage Backend│                     │
│              │ file: or blk:   │                     │
│              └─────────────────┘                     │
└─────────────────────────────────────────────────────┘

元件

元件 版本 來源
gotgt v0.2.2-37-g7f708d0 Go native, Mach-O 64-bit arm64
libiscsi v1.20.3 Homebrew
Rust SDK 1.92+ rustup

支援的 Storage Backend

Prefix 類型 範例
file: File-backed LUN file:data/iscsi/warren_lun.bin
blk: Block device blk:/dev/disk5

2. 測試摘要

測試數: 12 項
通過: 12
失敗: 0
Cargo test: 39/40 通過1 項 pre-existing fuse 測試因 macOS 無 fusermount 而失敗)

Pass/Fail Matrix

# 測試項目 結果 備註
1 gotgt 二進制發現 which / ~/.local/bin / GOTGT_PATH env
2 配置目錄建立 ~/.gotgt/ + data/iscsi/
3 file: LUN 建立dd 256MB zero-filled image
4 配置 JSON 生成 含 portal / target / storage
5 gotgt daemon 啟動 正確 PID 寫入 gotgt.pid
6 daemon 重啟(--force kill old → spawn new
7 停止SIGTERM + wait 20×100ms polling
8 狀態查詢(運行/停止) PID 活性檢測
9 libiscsi 發現 iscsi-ls -s iscsi://127.0.0.1
10 libiscsi SCSI Inquiry GOSTOR / SPC-3 / DIRECT_ACCESS
11 iscsi-perf 順序讀取 3,275 MB/s @ 256KB blocks
12 APFS 格式化 + iSCSI hdiutil attachdiskutil eraseDisk APFS

3. 測試項目詳情

3.1 配置自動生成

{
  "iscsiportals": [{"id": 0, "portal": "127.0.0.1:3260"}],
  "iscsitargets": {
    "iqn.2026-05.momentry:markbase_warren": {
      "tpgts": {"1": [0]},
      "luns": {"0": 1000}
    }
  },
  "storages": [{
    "blockShift": 9,
    "deviceID": 1000,
    "online": true,
    "path": "file:data/iscsi/warren_lun.bin",
    "thinProvisioning": false
  }]
}

3.2 SCSI Inquiry 結果

Peripheral Qualifier:  CONNECTED
Peripheral Device Type: DIRECT_ACCESS
Version:               SPC-3
Vendor:                GOSTOR
Product:               GOTGT
Version Descriptor:    SBC-2, iSCSI, SPC-3

3.3 效能測試

測試命令: iscsi-perf -b 256 iscsi://127.0.0.1/iqn.2026-05.momentry:markbase_warren/0

計時 IOPs 吞吐量 blocksize
00:01 26,234 3,279 MB/s 256 blocks (131072 bytes)
00:02 26,483 3,310 MB/s 同上
00:03 25,679 3,209 MB/s 同上
00:04 25,748 3,218 MB/s 同上
00:05 26,222 3,277 MB/s 同上
平均 26,073 3,259 MB/s

4. Block Device 支援

4.1 新增功能

start() 函數新增 device: Option<&str> 參數,支援兩種後端:

pub fn start(user: &str, port: u16, lun_size: &str, force: bool, device: Option<&str>)

4.2 安全機制

fn is_block_device_mounted(device: &str) -> Result<bool>
  • diskutil info 解析 Mounted: Yes/No
  • 若已掛載 → 噴錯並提示 diskutil unmountDisk
  • 防止 macOS + gotgt 同時寫入造成 corruption

4.3 Block Device 大小偵測

fn get_block_device_size(device: &str) -> Result<u64>
  • diskutil info 解析 Disk Size 欄位
  • 自動決定 LUN size無需 --lun-size 參數)

4.4 使用方式

# 1. 偵測外接磁碟
diskutil list external

# 2. 確認卸載
diskutil unmountDisk /dev/diskX

# 3. 啟動 iSCSI target
cargo run --bin markbase -- iscsi start --device /dev/diskX
# 或用 standalone binary
cargo run --bin iscsi_target -- start --device /dev/diskX

4.5 錯誤處理案例

情境 行為
device 不存在 "Block device not found: /dev/diskX"
device 已掛載 "Block device /dev/diskX is mounted. Unmount first"
device 未指定 + lun 不存在 自動 dd 建立
config 已存在 + force=false 跳過(不做任何變更)

5. 效能數據

5.1 localhost iSCSIgotgt + libiscsi loopback

Metric Value
Sequential read (256KB) 3,259 MB/s
IOPs (256KB blocks) 26,073
Latency ~0.02ms

5.2 對比之前方案

方案 吞吐量 延遲 RAM 開銷 啟動時間
Docker tgt (colima VM) 385 MB/s 0.18ms ~1GB ~30s
gotgt native 3,275 MB/s 0.02ms <50MB <1s
倍率 8.5× 9× 20× 30×

5.3 預估 RAID 0 (8 × TB5 NVMe)

配置 單顆 RAID 0 (8顆) iSCSI overhead 最終
NVMe (已驗證) 3.3 GB/s ~26 GB/s ~5-10% ~24 GB/s
10GbE (未來) - 1 GB/s (瓶頸) ~5% ~1 GB/s

6. 原始碼變更

6.1 新增檔案

檔案 行數 說明
src/iscsi_target.rs 295 核心模組start/stop/status/config gen
src/bin/iscsi_target.rs 60 Standalone CLI 二進制

6.2 修改檔案

檔案 變更 說明
src/lib.rs +1 pub mod iscsi_target
src/main.rs +50 Iscsi subcommand + handler
Cargo.toml +3 which, dirs deps; iscsi_target binary
src/bin/raid_webdav_server.rs +3 修復 pre-existing ? operator bug

6.3 Public API

pub fn start(user: &str, port: u16, lun_size: &str, force: bool, device: Option<&str>)
    -> Result<IscsiTargetStatus>;

pub fn stop() -> Result<()>;

pub fn status() -> Result<IscsiTargetStatus>;

pub struct IscsiTargetStatus {
    pub running: bool,
    pub pid: Option<u32>,
    pub port: u16,
    pub target: String,
    pub lun_path: String,     // "file:path" or "blk:/dev/diskX"
    pub lun_size: u64,
}

7. 使用方式

7.1 CLI 命令

# 主二進制
cargo run --bin markbase -- iscsi start --user warren --lun-size 5GB
cargo run --bin markbase -- iscsi start --device /dev/disk5
cargo run --bin markbase -- iscsi stop
cargo run --bin markbase -- iscsi status

# Standalone 二進制
cargo run --bin iscsi_target -- start --user warren --lun-size 5GB
cargo run --bin iscsi_target -- start --device /dev/disk5
cargo run --bin iscsi_target -- stop
cargo run --bin iscsi_target -- status

7.2 libiscsi 客戶端

# 發現 target
iscsi-ls -s iscsi://127.0.0.1

# SCSI inquiry
iscsi-inq iscsi://127.0.0.1/iqn.2026-05.momentry:markbase_warren/0

# 性能測試
iscsi-perf -b 256 iscsi://127.0.0.1/iqn.2026-05.momentry:markbase_warren/0

7.3 macOS 掛載 LUN

# 1. 停止 gotgt
cargo run --bin markbase -- iscsi stop

# 2. attach image
hdiutil attach -nomount -imagekey diskimage-class=CRawDiskImage data/iscsi/warren_lun.bin

# 3. 格式化(首次)
diskutil eraseDisk APFS ISCSI_LUN /dev/diskX

# 4. 自動掛載在 /Volumes/ISCSI_LUN

8. 已知問題

# 問題 狀態 說明
1 gotgt PID 檔案殘留 ⚠️ Minor 若 process 被外部 killPID file stale下次 start --force 可解決)
2 macOS 無 kernel iSCSI initiator ⚠️ 限制 Apple 未提供,需 libiscsi userspace 或 GlobalSANEOL
3 file: LUN 建立後無自動 APFS ⚠️ 設計 需要手動 attach + 格式化
4 blk: 模式僅支援 unmounted disk ⚠️ 限制 macOS 不可同時掛載
5 test_mount_handle_creation 失敗 Pre-existing 需要 fusermount (Linux)macOS 不支援

9. 後續建議

短期(今晚可做)

  • 採購 3× KIOXIA NVMe 2TB~$600
  • 插入 Thunderbolt 5 Dock
  • diskutil appleRAID create stripe "TB5_RAID0" APFS disk{1,2,3}
  • 測試 gotgt blk: 指向 RAID array

中期

  • RaidController + gotgt blk: 整合(軟體 RAID 輸出 block device
  • libiscsi Rust FFI 完整封裝read/write/sync
  • 自動 Mount/Unmount 腳本iscsi start 時自動 unmount

長期

  • WebDAV + iSCSI 共用儲存(透過 libiscsi FFI
  • RAID 5 locate_stripe() bug 修復
  • 多用戶 iSCSI target每個 user 獨立 LUN

報告結束