2026年3月10日 星期二

[macOS] 使用 macstrap 批次快速設定 Mac Mini M4 與架設 OpenClaw 環境 @ macOS

最近拿到一台 Mac mini M4 32GB/1TB ,之前很習慣用 Notes 貼一下快速安裝的指令,想著想著自己十多年前都在用 ansible 管理百台 Ubuntu servers ,這個年代一直貼指令微遜 XD 就 vibe coding 一下,請 AI 小弟幫忙實現工具,於是乎就長出個 macstrap 工具,其特色就是讓不熟悉 ansible 的人也能快速上手,而安裝途徑是透過 ssh remote command ,這樣搞定一台後,未來有多台 mac mini 要初始化,也可以快速搞定。

首先,先把 Mac mini 開箱後,設定好登入的帳號密碼,接著在 System Settings -> General -> Sharing -> Remote login 打開,這樣就完成很基本的 ssh 可登入機制,然而 macstrap 是基於 python 的工具,所以 Mac mini 本地需要故意打一下 python 指令觸發系統去下載安裝 Python3

接下來就是 macstrap 領域了:

```
% cd /tmp
% python3 -m venv venv
% source /tmp/venv/bin/activate
% pip install macstrap
...
% macstrap --version 
macstrap, version 1.1.0
```

初始化一些範例來用:

```
% macstrap init --exmaples
% tree -L 1 examples
examples
├── ai-cli
├── openclaw
├── php8.3-dev
└── utilities-dev

5 directories, 0 files
```

設置連上 Mac mini 的帳密,假設 Mac mini IP 是 192.168.1.100 (或 mac-mini.local) 登入帳號是 macuser 且擁有 sudo 權限:

```
% macstrap ssh-auth mac-mini.local --user macuser
```

替 192.168.1.100 (或 mac-mini.local) 安裝 AI CLI:

```
% macstrap run --config examples/ai-cli mac-mini.local
...

TASK [nvm : Install global npm packages] *****
ok: [mac-mini.local] => (item=@github/copilot)
ok: [mac-mini.local] => (item=@anthropic-ai/claude-code)
ok: [mac-mini.local] => (item=@openai/codex)
ok: [mac-mini.local] => (item=@google/gemini-cli)

...

```

安裝 OpenClaw:

```
% macstrap run --config examples/openclaw mac-mini.local
...
TASK [nvm : Install global npm packages] *****
ok: [user-macmini.local] => (item=openclaw)
...
```

接著登入 mac-mini.local 後,就可以用 openclaw onboard 啟動他來做設定:

```
% ssh macuser@mac-mini.local
Now using node v22.22.1 (npm v10.9.4)
[env] node: v22.22.1 | npm: 10.9.4 | Python 3.9.6

% openclaw onboard

🦞 OpenClaw 2026.3.8 (3caab92)
   Runs on a Raspberry Pi. Dreams of a rack in Iceland.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                  🦞 OPENCLAW 🦞                    
 
┌  OpenClaw onboarding
◇  Security ─────────────────────────────────────────────────────────────╮
│                                                                        │
│  Security warning — please read.                                       │
│                                                                        │
│  OpenClaw is a hobby project and still in beta. Expect sharp edges.    │
│  By default, OpenClaw is a personal agent: one trusted operator        │
│  boundary.                                                             │
│  This bot can read files and run actions if tools are enabled.         │
│  A bad prompt can trick it into doing unsafe things.                   │
│                                                                        │
│  OpenClaw is not a hostile multi-tenant boundary by default.           │
│  If multiple users can message one tool-enabled agent, they share      │
│  that delegated tool authority.                                        │
│                                                                        │
│  If you’re not comfortable with security hardening and access          │
│  control, don’t run OpenClaw.                                          │
│  Ask someone experienced to help before enabling tools or exposing it  │
│  to the internet.                                                      │
│                                                                        │
│  Recommended baseline:                                                 │
│  - Pairing/allowlists + mention gating.                                │
│  - Multi-user/shared inbox: split trust boundaries (separate           │
│    gateway/credentials, ideally separate OS users/hosts).              │
│  - Sandbox + least-privilege tools.                                    │
│  - Shared inboxes: isolate DM sessions (`session.dmScope:              │
│    per-channel-peer`) and keep tool access minimal.                    │
│  - Keep secrets out of the agent’s reachable filesystem.               │
│  - Use the strongest available model for any bot with tools or         │
│    untrusted inboxes.                                                  │
│                                                                        │
│  Run regularly:                                                        │
│  openclaw security audit --deep                                        │
│  openclaw security audit --fix                                         │
│                                                                        │
│  Must read: https://docs.openclaw.ai/gateway/security                  │
│                                                                        │
├────────────────────────────────────────────────────────────────────────╯
◆  I understand this is personal-by-default and shared/multi-user use requires
 lock-down. Continue?
│  ○ Yes / ● No

```

2026年2月13日 星期五

[Linux] 安裝 OpenClaw @ raspberrypi Debian 12




之前有一台 Pi 3 閒置,查了一下記憶體有 1GB ,試試看吧!先把它更新到 Debian GNU/Linux 12 (bookworm) ,接著用 nvm 安裝出 node.js v22 環境,再調整 swap 到 1GB 來跑:

```
@raspberrypi:~ $ uname -a
Linux raspberrypi 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux

@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 12 (bookworm)
Release: 12
Codename: bookworm

@raspberrypi:~ $ apt policy raspberrypi-bootloader
raspberrypi-bootloader:
  Installed: 1:1.20230405-1
  Candidate: 1:1.20230405-1
  Version table:
 *** 1:1.20230405-1 500
        500 http://archive.raspberrypi.org/debian bookworm/main arm64 Packages
        100 /var/lib/dpkg/status

@raspberrypi:~ $ cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ bookworm main

@raspberrypi:~ $ cat /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

@raspberrypi:~ $ lscpu
Architecture:            aarch64
  CPU op-mode(s):        32-bit, 64-bit
  Byte Order:            Little Endian
CPU(s):                  4
  On-line CPU(s) list:   0-3
Vendor ID:               ARM
  Model name:            Cortex-A53
    Model:               4
    Thread(s) per core:  1
    Core(s) per cluster: 4
    Socket(s):           -
    Cluster(s):          1
    Stepping:            r0p4
    CPU(s) scaling MHz:  100%
    CPU max MHz:         1200.0000
    CPU min MHz:         600.0000
    BogoMIPS:            38.40
    Flags:               fp asimd evtstrm crc32 cpuid
Caches (sum of all):     
  L1d:                   128 KiB (4 instances)
  L1i:                   128 KiB (4 instances)
  L2:                    512 KiB (1 instance)
Vulnerabilities:         
  Itlb multihit:         Not affected
  L1tf:                  Not affected
  Mds:                   Not affected
  Meltdown:              Not affected
  Mmio stale data:       Not affected
  Retbleed:              Not affected
  Spec store bypass:     Not affected
  Spectre v1:            Mitigation; __user pointer sanitization
  Spectre v2:            Not affected
  Srbds:                 Not affected
  Tsx async abort:       Not affected

@raspberrypi:~ $ sudo vcgencmd measure_temp
temp=54.8'C

@raspberrypi:~ $ sudo vcgencmd measure_clock arm
frequency(48)=600062000

@raspberrypi:~ $ sudo vcgencmd get_mem gpu
gpu=76M

@raspberrypi:~ $ cat /proc/device-tree/model
Raspberry Pi 3 Model B Rev 1.2

$ cat /proc/cpuinfo | grep Model
Model : Raspberry Pi 3 Model B Rev 1.2
```

---

```
@raspberrypi:~ $ openclaw onboard

<--- Last few GCs --->

[17543:0x7fb04c0000]   229321 ms: Scavenge 451.3 (463.5) -> 450.8 (464.3) MB, pooled: 0 MB, 21.16 / 0.00 ms  (average mu = 0.614, current mu = 0.204) allocation failure; 
[17543:0x7fb04c0000]   229421 ms: Scavenge 452.0 (464.3) -> 451.5 (469.0) MB, pooled: 0 MB, 40.55 / 0.00 ms  (average mu = 0.614, current mu = 0.204) allocation failure; 


<--- JS stacktrace --->

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----

 1: 0xe13218 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [openclaw]
 2: 0x11a7f8c v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [openclaw]
 3: 0x11a813c v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [openclaw]
 4: 0x13ccadc  [openclaw]
 5: 0x13e4a50 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [openclaw]
 6: 0x13bb378 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [openclaw]
 7: 0x13bc1b0 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [openclaw]
 8: 0x13972d0 v8::internal::Factory::NewFillerObject(int, v8::internal::AllocationAlignment, v8::internal::AllocationType, v8::internal::AllocationOrigin) [openclaw]
 9: 0x17b0b5c v8::internal::Runtime_AllocateInYoungGeneration(int, unsigned long*, v8::internal::Isolate*) [openclaw]
10: 0x1cc19d4  [openclaw]
```

```
@raspberrypi:~ $ free -h
               total        used        free      shared  buff/cache   available
Mem:           909Mi       209Mi       555Mi       3.8Mi       212Mi       700Mi
Swap:           99Mi        99Mi       160Ki


@raspberrypi:~ $ sudo dphys-swapfile swapoff
@raspberrypi:~ $ sudo vim /etc/dphys-swapfile
CONF_SWAPSIZE=1024
@raspberrypi:~ $ sudo dphys-swapfile setup
@raspberrypi:~ $ sudo dphys-swapfile swapon

@raspberrypi:~ $ free -h
               total        used        free      shared  buff/cache   available
Mem:           909Mi       313Mi       428Mi       5.0Mi       236Mi       596Mi
Swap:          1.0Gi          0B       1.0Gi
```

```
@raspberrypi:~ $ NODE_OPTIONS="--max-old-space-size=768" openclaw onboard

🦞 OpenClaw 2026.2.9 (33c75cb) — I read logs so you can keep pretending you don't have to.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                  🦞 OPENCLAW 🦞                    
 
┌  OpenClaw onboarding
◇  Security ──────────────────────────────────────────────────────────────────────────────╮
│                                                                                         │
│  Security warning — please read.                                                        │
│                                                                                         │
│  OpenClaw is a hobby project and still in beta. Expect sharp edges.                     │
│  This bot can read files and run actions if tools are enabled.                          │
│  A bad prompt can trick it into doing unsafe things.                                    │
│                                                                                         │
│  If you’re not comfortable with basic security and access control, don’t run OpenClaw.  │
│  Ask someone experienced to help before enabling tools or exposing it to the internet.  │
│                                                                                         │
│  Recommended baseline:                                                                  │
│  - Pairing/allowlists + mention gating.                                                 │
│  - Sandbox + least-privilege tools.                                                     │
│  - Keep secrets out of the agent’s reachable filesystem.                                │
│  - Use the strongest available model for any bot with tools or untrusted inboxes.       │
│                                                                                         │
│  Run regularly:                                                                         │
│  openclaw security audit --deep                                                         │
│  openclaw security audit --fix                                                          │
│                                                                                         │
│  Must read: https://docs.openclaw.ai/gateway/security                                   │
│                                                                                         │
├─────────────────────────────────────────────────────────────────────────────────────────╯
◆  I understand this is powerful and inherently risky. Continue?
│  ○ Yes / ● No
```

2026年1月1日 星期四

2026年,突然想用這個字了...

新年快樂

2025年9月21日 星期日

重度使用 Claude Code 五個月後...


累積到上個月,已經掏錢給 Claude 滿一年了,從一開始 claude.ai 的用法,不停地在瀏覽器上詢問,自己也開發了簡單的小工具,目的是把程式碼打包成單一檔案,方便超額後可以續作 XD 不過,這樣的生態慢慢在 2025.02 之後都改變了。我也從 vim 模式轉成 vscode + github copilot + agent mode ,然而,當我又摸熟 github copilot + agent mode 後,又轉進了 claude code 的世界,並在 2025.07 也提播助理費到百元美金 XD 好用,當然要給他加薪一下

如果要說最大的生活改變?可能就是進入到定義任務的開發模式了,以及享受慣老闆機制,凡事避開自己親自 coding ,自己不 coding 也能欣賞 AI coding,也是一種自我成長的過程,可以接納更多種的解方。

慣老闆方面也要體驗一下的,當然就想要極致壓榨 AI ,倒垃圾前、洗澡前、睡前下個指令是基本的,同時開 2-4 個 Terminal 做不同的事也是合情合理,只是到頭來自己的 context switch 反而吃重,並且隨著 AI 能力越來越強後,漸漸地收斂到同時做 1~2 件事就好,放過自己吧!

放過自己後,就是享受生活的開始,不再計較要怎樣操爆 AI ,反而是在生活時間的碎片化下,如何靠 AI 輔助串起一切,凡事盡可能規劃 Save/Load 架構,做事做到一個地步肯定要叫 AI 更新 CLAUDE.md 檔案,甚至另外規劃個 PLAN.md ,就像小老闆時時刻刻盯著 KPI 。那何謂享受?既然等待 AI 的時間慢慢拉長(AI處理的任務深度加深),就開始看一堆動畫 XD 想想倒看了不少:

  • 膽大黨
  • 阪本的日常
  • 怪獸8號
  • 薰香花朵凜然綻放
  • 治癒魔法的錯誤使用法
  • 我要架招一切
  • 我獨自升級
  • ...

現在是 2025-09-21 ,打算讓 Claude code 卸下重擔。開始試試 OpenAI codex ,從一開始對話窗上不能上傳圖片、不能工作時先打好下一道指令等等, codex 版本迭代後,基本上跟 Claude Code 的差距越來越小了。再加上 OpenAI GPT-5 的成效,其實很接近 Claude Sonnect 4 / Opus 4.1 ,只要任務定義的清楚,基本上都是一樣的。

我想,這大概就是另類的小確幸吧?AI 輔助十分競爭,各家業者的差距也在縮減。

不過,也有些殘忍的事正在發生,美國已經大量關閉新鮮人的職缺,原本認為中高階者會被新人+AI輔助取代,隨著時間已經變成新人的職缺大量縮減,因為有經驗者 + AI 輔助可以做更多的事,企業也不用等新人犯錯練等。就像十年前有錢的新創,起手式先掏錢挖走有經驗的人。

這件事在工作上也滿有感受到的,觀察到同事正進行一個尚未有經驗的任務時,原本期待 AI輔助的過程,可以讓同事朝向有效的路線發展,事實上還是很吃“提問者的提問方式“,因為 AI 也會順著提問者的思維去規劃,回歸到下 prompt 的品質依舊重要。觀察到一些計劃方向也出現繞路的情況,所幸,隨著實務經驗增加後,還是回歸了正途。這件事代表:雇用有經驗者 + AI 輔助,還是跟以往的生態一樣的,只是一個人的經驗價值,仍有可能因為 AI 的出現被貶低。

目前 開發者 與 AI 輔助仍努力的找個平衡點,應該不是 AI 的泡沫化?略知很多 AI 服務(如 Perplexity)仍是努力燒錢中,尚未損益平衡,這也是恰巧聽到矽谷 podcast ,行內在搞新創的都有時時追蹤業內的頭部,據說 Anthropic 話語權仍很好的,而整合類(沒有研發自己的 LLM且本身也沒錢研發)都非常辛苦,也怕搞 LLM 大廠推出新服務就打亂了自己的步調。

而最底層食物鏈的開發者呢?我想,真的只剩投資了 :P 只能配置好資產(大盤指數也行也夠),避免產業鏈一個瞬間轉身就...受到重傷 Orz



2025年6月26日 星期四

兒童相機記憶卡損毀救援筆記 - 在 macOS 修復摔壞的 microSD 卡資料



兩三年前買了兒童相機給小孩亂拍,坊間大部分的兒童相機都大同小異,有的著重相機畫素,有的著重拍攝的方便性,像是可自拍、觸控螢幕等。後來,我選了觸控螢幕款,畢竟方便第一,至於畫素、閃光燈等等的就放掉,並買了一張 32GB microSD ,讓小孩大小可隨便錄影。

最近出遊時,兒童相機在開機的狀態下,不小心摔到地上,接著無法拍照(儲存),也看不到所有已拍攝的資料。

當下在想,這種 microSD 跟 SSD 的,不像以前的 HDD 有轉盤在那邊轉,應該不至於壞軌,再細想一下,有可能像 OS 優化連續錄影/開多檔快速寫檔案,但這時撞到地上導致 OS 狀態異常,沒有把資料收尾而損毀,可能導致 micorSD 檔案系統 Header 就被破壞掉,而不是 microSD 受到什麼物理性的破壞。

接著,就來煩 AI 了 XD 我自己是先把損毀的 microSD 透過 macOS 內建的 Disk Utility 先備份一份 Image 檔案(備份過程也不是很正常的結束,但至少產生了一個 img 檔案),接著拿另一張同樣容量的 32GB microSD 來處理,避免一開始就對原始 microSD 卡操作。

最後,透過跟 AI 聊天的過程,他認為我的想法/直覺有機會解掉,於是乎就操作看看,出發點是想重建 microSD header,流程: 
  • 先把損毀的 microSD卡(A),透過 macOS 內建 Disk Utility 先備份一份 Image 檔案,產出 a_card.img
  • 製作乾淨的 microSD卡(B),把額外一張 microSD 卡放入兒童相機格式化,確保資料檔案系統跟損毀的 microSD 卡一樣,在產出 clean_b_card.img
  • 後續則是在 microSD卡(B) 操作,用 a_card.img 資料覆蓋 microSD卡(B),這時 microSD卡(B) 插入兒童相機一樣會顯示檔案損毀的狀態
  • 最後則是拿 clean_b_card.img 部分資料去覆蓋 microSD卡(B) ,直到可以 OS 正常讀出資料
執行過程中,AI 其實會去猜檔案系統為何,然後摸索 Header 大小,像是建議一開始用 8MB 來猜,然後測試完看不到資料,又說可以試試 4MB (一樣看不到資料),又說要不要試試 2MB,這時我反而去問他應該要從 header size 小到大來測試,也讓 AI 想起可以用 macos 內建的 diskutil 指令查詢資料,此例是 microSD 插入後被系統安置在 /dev/disk10 ,相關指令如:

%  diskutil info /dev/disk10 | grep -E "(Block|Cluster|Sector)" 
   Device Block Size:         512 Bytes
   Allocation Block Size:     512 Bytes

不然根據 AI 的建議,他的操作每一次都要重新製作一次 microSD卡(B) ,滿費時的,最終我就只測試三次,分別是 8MB, 4MB ,接著到 512KB 就搞定了(過程重建 3次資料),而我請 AI 由小到大的 header size 測試,他給予的指令流程:

# 1. 先一次性寫入 A 卡資料(只做這一次)
diskutil unmountDisk /dev/disk10
sudo dd if=a_card.img of=/dev/rdisk10 bs=1m

# 2. 從最小範圍開始測試 - 只覆蓋 Boot Sector (512 bytes)
sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=512 count=1 conv=notrunc
diskutil mountDisk /dev/disk10
# 檢查是否有資料,如果沒有繼續下一步

# 3. 如果 512 bytes 不夠,擴大到 40KB(到 FAT 表開始位置)
diskutil unmountDisk /dev/disk10
sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=40 conv=notrunc
diskutil mountDisk /dev/disk10
# 檢查結果

# 4. 如果還不夠,擴大到 100KB
diskutil unmountDisk /dev/disk10
sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=100 conv=notrunc
diskutil mountDisk /dev/disk10
# 檢查結果

# 5. 繼續擴大到 500KB
diskutil unmountDisk /dev/disk10
sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=500 conv=notrunc
diskutil mountDisk /dev/disk10
# 檢查結果

# 6. 最後到 1MB
diskutil unmountDisk /dev/disk10
sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=1k count=1024 conv=notrunc
diskutil mountDisk /dev/disk10

我後來只做這些,就看得到資料:

% diskutil unmountDisk /dev/disk10
% sudo dd if=a_card.img of=/dev/rdisk10 bs=1m
9297+1 records in
9297+1 records out
9748611584 bytes transferred in 642.300766 secs (15177643 bytes/sec)

% sudo dd if=clean_b_card.img of=/dev/rdisk10 bs=512 count=1 conv=notrunc
Password:
1+0 records in
1+0 records out
512 bytes transferred in 0.009456 secs (54146 bytes/sec)

% diskutil mountDisk /dev/disk10
Volume(s) mounted successfully

如此能看到資料後,也確定有些檔案相機的確沒正確寫入,顯示損毀,猜測應該是晚一點寫檔的機制(cache),導致有些檔案並未正確收尾。

最後在靠這些:

% diskutil unmountDisk /dev/disk10
Unmount of all volumes on disk10 was successful

% sudo fsck_msdos -f -y /dev/disk10
Password:
** /dev/rdisk10
** Phase 1 - Preparing FAT
** Phase 2 - Checking Directories
** Phase 3 - Checking for Orphan Clusters
Warning: 175 files, 31120736 KiB free (972523 clusters)

% brew install testdisk

% sudo photorec /dev/disk10

過程:

PhotoRec 7.2, Data Recovery Utility, February 2024
Christophe GRENIER <grenier@cgsecurity.org>
https://www.cgsecurity.org

Disk /dev/disk10 - 31 GB / 29 GiB (RO)
     Partition                  Start        End    Size in sectors
   P FAT32                          0   62333951   62333952 [NO NAME]

Destination /path/recup_dir

Pass 1 - Reading sector    6458368/62333952, 217 files found
Elapsed time 0h02m02s - Estimated time to completion 0h17m35
jpg: 101 recovered
txt: 94 recovered
mov: 17 recovered
gz: 5 recovered

希望可以救多一點