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)
This commit is contained in:
356
docs/ISCSI_GOTGT_TEST_REPORT.md
Normal file
356
docs/ISCSI_GOTGT_TEST_REPORT.md
Normal file
@@ -0,0 +1,356 @@
|
||||
# MarkBase gotgt iSCSI Target Integration Test Report
|
||||
|
||||
**創建時間**: 2026-05-19 21:00
|
||||
**版本**: 1.0
|
||||
**測試環境**: macOS 26.4.1 arm64 (M4 Mac mini)
|
||||
**測試人員**: warren
|
||||
|
||||
---
|
||||
|
||||
## 目錄
|
||||
|
||||
1. [系統架構](#1-系統架構)
|
||||
2. [測試摘要](#2-測試摘要)
|
||||
3. [測試項目詳情](#3-測試項目詳情)
|
||||
4. [Block Device 支援](#4-block-device-支援)
|
||||
5. [效能數據](#5-效能數據)
|
||||
6. [原始碼變更](#6-原始碼變更)
|
||||
7. [使用方式](#7-使用方式)
|
||||
8. [已知問題](#8-已知問題)
|
||||
9. [後續建議](#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 attach` → `diskutil eraseDisk APFS` |
|
||||
|
||||
---
|
||||
|
||||
## 3. 測試項目詳情
|
||||
|
||||
### 3.1 配置自動生成
|
||||
|
||||
```json
|
||||
{
|
||||
"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>` 參數,支援兩種後端:
|
||||
|
||||
```rust
|
||||
pub fn start(user: &str, port: u16, lun_size: &str, force: bool, device: Option<&str>)
|
||||
```
|
||||
|
||||
### 4.2 安全機制
|
||||
|
||||
```rust
|
||||
fn is_block_device_mounted(device: &str) -> Result<bool>
|
||||
```
|
||||
|
||||
- `diskutil info` 解析 Mounted: Yes/No
|
||||
- 若已掛載 → 噴錯並提示 `diskutil unmountDisk`
|
||||
- 防止 macOS + gotgt 同時寫入造成 corruption
|
||||
|
||||
### 4.3 Block Device 大小偵測
|
||||
|
||||
```rust
|
||||
fn get_block_device_size(device: &str) -> Result<u64>
|
||||
```
|
||||
|
||||
- `diskutil info` 解析 Disk Size 欄位
|
||||
- 自動決定 LUN size(無需 `--lun-size` 參數)
|
||||
|
||||
### 4.4 使用方式
|
||||
|
||||
```bash
|
||||
# 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 iSCSI(gotgt + 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
|
||||
|
||||
```rust
|
||||
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 命令
|
||||
|
||||
```bash
|
||||
# 主二進制
|
||||
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 客戶端
|
||||
|
||||
```bash
|
||||
# 發現 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
|
||||
|
||||
```bash
|
||||
# 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 被外部 kill,PID file stale(下次 start --force 可解決) |
|
||||
| 2 | macOS 無 kernel iSCSI initiator | ⚠️ 限制 | Apple 未提供,需 libiscsi userspace 或 GlobalSAN(EOL) |
|
||||
| 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)
|
||||
|
||||
---
|
||||
|
||||
*報告結束*
|
||||
Reference in New Issue
Block a user