flashpod 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {flashpod-0.2.0 → flashpod-0.2.2}/PKG-INFO +232 -52
  2. {flashpod-0.2.0 → flashpod-0.2.2}/README.md +231 -51
  3. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/cli.py +218 -31
  4. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/ipod_flash.py +13 -1
  5. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/platform/linux.py +4 -1
  6. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/platform/windows.py +70 -13
  7. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/PKG-INFO +232 -52
  8. {flashpod-0.2.0 → flashpod-0.2.2}/pyproject.toml +1 -1
  9. {flashpod-0.2.0 → flashpod-0.2.2}/LICENSE +0 -0
  10. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/__init__.py +0 -0
  11. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/__main__.py +0 -0
  12. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/contrib/99-flashpod-firewire-ipod.rules +0 -0
  13. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/fat32.py +0 -0
  14. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/fatfs.py +0 -0
  15. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/firmware/firmware.json +0 -0
  16. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/itunesdb.py +0 -0
  17. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/platform/__init__.py +0 -0
  18. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/platform/base.py +0 -0
  19. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/platform/macos.py +0 -0
  20. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod/resources.py +0 -0
  21. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/SOURCES.txt +0 -0
  22. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/dependency_links.txt +0 -0
  23. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/entry_points.txt +0 -0
  24. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/requires.txt +0 -0
  25. {flashpod-0.2.0 → flashpod-0.2.2}/flashpod.egg-info/top_level.txt +0 -0
  26. {flashpod-0.2.0 → flashpod-0.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flashpod
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Command-line iPod sync + card-flashing tooling for early FireWire-era iPods, pure Python
5
5
  Author: David Barnhart
6
6
  License-Expression: MIT
@@ -30,13 +30,13 @@ Dynamic: license-file
30
30
 
31
31
  # flashpod
32
32
 
33
- flashpod is a command-line tool for putting flash storage cards into
34
- early-generation iPods and managing the music on them.
33
+ flashpod is both an iPod flash-card imager and a tool for syncing and
34
+ organizing the music on it.
35
35
 
36
- It handles the whole setup without iTunes, so you can revive a vintage iPod
37
- and run it from a modern desktop: it writes the firmware to the card, creates
38
- the initial music database, and loads the card with music. Then, once you pop
39
- the card into an iPod and connect it over USB or FireWire, flashpod manages
36
+ It handles the whole setup without iTunes, so you can revive a vintage iPod
37
+ and run it from a modern desktop: it writes the firmware to the card, creates
38
+ the initial music database, and loads the card with music. Then, once you pop
39
+ the card into an iPod and connect it over USB or FireWire, flashpod manages
40
40
  the library on the device too — adding and removing songs right on the iPod.
41
41
 
42
42
  ## Requirements
@@ -44,6 +44,11 @@ the library on the device too — adding and removing songs right on the iPod.
44
44
  - **iPod:** Gen 1, 2, or 3 (tested successfully); Gen 4 should work but isn't
45
45
  tested yet. Later models (2007 and newer) aren't supported — they need an
46
46
  iTunesDB checksum/hash flashpod doesn't generate.
47
+ - **Adapters:** CF to 1.8" IDE adapter (common on eBay); CF to SD card adapter
48
+ (if using an SD card).
49
+ - **Flash cards:** CompactFlash card, or SD card with a CompactFlash adapter.
50
+ - **Card reader:** USB CompactFlash reader (to flash the card and load the bulk
51
+ of your music).
47
52
  - **Operating system:** Linux and macOS (tested). Windows has a backend but
48
53
  isn't tested yet.
49
54
 
@@ -66,9 +71,29 @@ Mac hardware. It's been tested on a MacBook running OS X 10.8 so far. Since old
66
71
  Macs often can't get online, the macOS release can be copied to a USB drive on
67
72
  a modern machine and installed on the MacBook from there.
68
73
 
74
+ ## Loading music
75
+
76
+ There are two complementary ways to get music onto a flash-modded iPod:
77
+
78
+ 1. **Over FireWire, once the card is installed in the iPod** — convenient, but
79
+ slower.
80
+ 2. **A one-time bulk load onto the flash card while it's still in the card
81
+ reader** — fast, but only possible before the card goes into the iPod.
82
+
83
+ flashpod supports both. We suggest loading the majority of your library onto the
84
+ card while it's still in the (much faster) card reader, and saving the FireWire
85
+ sync for occasionally adding new albums later.
86
+
69
87
  ## Install
70
88
 
71
- Download the archive for your OS from the
89
+ If you already have the **pip** Python package manager (or **pipx**), install
90
+ with a single command:
91
+
92
+ ```sh
93
+ pip install flashpod # or: pipx install flashpod
94
+ ```
95
+
96
+ Otherwise, download the archive for your OS from the
72
97
  [Releases page](https://github.com/davidbarnhart/flashpod/releases) — each holds
73
98
  a single self-contained executable (no Python or anything else to install).
74
99
 
@@ -88,7 +113,7 @@ downloads the image you pick (verified by checksum), or you supply your own with
88
113
  `--firmware`. (The **macOS 10.8** build is different — see below.) Building the
89
114
  binaries yourself is documented in [BUILD.md](BUILD.md).
90
115
 
91
- **Vintage Macs (OS X 10.8):** use `flashpod-macos-10.8.tar.gz`. Extract it,
116
+ **Vintage Macs (OS X 10.8):** use `flashpod-macos-10.8.tar.gz`. Extract it,
92
117
  then make the binary runnable and clear the Gatekeeper quarantine (it's unsigned):
93
118
 
94
119
  ```sh
@@ -98,10 +123,6 @@ xattr -d com.apple.quarantine flashpod # or right-click → Open once
98
123
  ./flashpod --help
99
124
  ```
100
125
 
101
- > `flashpod flash` needs root. `sudo` uses root's PATH, so if `sudo flashpod`
102
- > isn't found, run it by full path — `sudo "$(command -v flashpod)" flash`, or
103
- > `cd` into the extracted folder and run `sudo ./flashpod flash`.
104
-
105
126
  ## Typical workflow
106
127
 
107
128
  **Set the card up in a USB reader first — transfers are far faster there than
@@ -109,9 +130,95 @@ over FireWire.** Flash it, then let flashpod initialize the database and load
109
130
  your music, all in one sitting:
110
131
 
111
132
  ```sh
112
- sudo flashpod flash # flash firmware + format the card; then answer Y to
113
- # init the database, and Y to load your music onto it
133
+ flashpod flash # flash firmware + format the card; then answer Y to
134
+ # init the database, and Y to load your music onto it
135
+ ```
136
+
137
+ <details>
138
+ <summary><strong>See a full <code>flashpod flash</code> session</strong> — model and firmware pick, card selection, erase, verify, init, and first music load</summary>
139
+
114
140
  ```
141
+ $ flashpod flash
142
+ flashpod flash: writing to a disk needs root — elevating via sudo...
143
+ [sudo] password for david:
144
+ Which iPod are you flashing for?
145
+
146
+ # iPod Years How to identify it
147
+ - -------------- ------- ------------------------------------------------
148
+ 0 1st generation 2001-02 scroll wheel physically turns
149
+ 1 2nd generation 2002 wheel does not move (touch-sensitive)
150
+ 2 3rd generation 2003 four buttons in a row above the wheel
151
+ 3 4th generation 2004 click wheel, buttons on the wheel, grayscale
152
+ 4 iPod photo 2004-05 click wheel, color display
153
+
154
+ Select model: 0
155
+ Firmware for 1st generation (newest first):
156
+
157
+ # Version Built Size Notes
158
+ - ------- ---------- ---- ----------------------------------------------
159
+ 0 1.5 * 2005-02-18 2.0M Last stock Apple-released firmware for 1G/2G
160
+ iPods
161
+ 1 1.4 2004-04-23 1.9M Adds 20+ EQ presets, shuffle by album, track
162
+ scrubbing, Contacts/Calendar/Clock, Korean and
163
+ Chinese; iTunes 4.5 compatibility
164
+ 2 0.4 2001-12-23 0.7M Adds Italian, Dutch, Spanish, Brazilian
165
+ Portuguese, Danish, Finnish, Norwegian and
166
+ Swedish; 255-character filenames; fixes low-
167
+ battery sleep wake and blue-and-white Power
168
+ Macintosh G3 compatibility
169
+ 3 0.0 2001-11-01 0.7M Initial release for the original 1G iPod
170
+
171
+ * recommended default
172
+
173
+ Select firmware [0]: 0
174
+ flashpod flash: downloading iPod_1.1.5_2005_02_18.bin.gz
175
+ from https://github.com/davidbarnhart/flashpod/releases/download/firmware/iPod_1.1.5_2005_02_18.bin.gz
176
+ 91% (1.8/2.0 MiB)
177
+ flashpod flash: verified and cached iPod_1.1.5_2005_02_18.bin.gz
178
+ firmware OK: iPod_1.1.5_2005_02_18.bin.gz (5068800 bytes, structure validated)
179
+ Attached removable storage:
180
+
181
+ # Device Size Reader
182
+ - -------- --------- ------------------------------------------
183
+ 0 /dev/sdb 119.1 GiB USB3.0 Card Reader (Genesys Logic), slot 1
184
+ MBR: unformatted 32 MiB, vfat 119.1 GiB 'IPOD' <-
185
+ looks like an iPod card
186
+ 1 /dev/sdc 0 B USB3.0 Card Reader (Genesys Logic), slot 2
187
+ no card inserted
188
+
189
+ Select device number (or 'q' to quit): 0
190
+
191
+ PLAN — this will ERASE /dev/sdb
192
+ layout : MBR + FAT32
193
+ device size : 119.1 GiB (249737216 sectors)
194
+ firmware : sectors 63..65598 (32 MiB)
195
+ data (FAT32) : sectors 65599..249735167 type 0x0B (119.1 GiB)
196
+
197
+ Type "ERASE sdb" to proceed: ERASE sdb
198
+ wrote MBR partition table + firmware
199
+ formatted data partition (FAT32, 7798364 clusters @ 16 KiB, label 'IPOD')
200
+ verifying firmware on the card byte-for-byte (5068800 bytes @ sector 63) ...
201
+ verify OK: 5068800 firmware bytes on the card match the image exactly.
202
+
203
+ The card still needs the iPod database before it can take music ("flashpod init").
204
+ Run init on /dev/sdb2 now? [Y/n] Y
205
+ Initialized iPod directory structure on /dev/sdb2
206
+
207
+ Music can be loaded onto the card now, or later when it is in the iPod.
208
+ Load music onto the card now? [Y/n] Y
209
+ File or directory to add (TAB to complete): /mnt/homestore/sound/mp3/New Order/Technique/
210
+ flashpod add: this batch is 54.8 MiB. You've got 118.94 GiB more than you need, Dude. That's gnarly!
211
+ [6/9] Adding: Run — New Order... 100% (6.2/6.2 MiB)
212
+ [7/9] Adding: Mr. Disco — New Order... 100% (6.0/6.0 MiB)
213
+ [8/9] Adding: Vanishing Point — New Order... 100% (7.3/7.3 MiB)
214
+ [9/9] Adding: Dream Attack — New Order... 100% (7.2/7.2 MiB)
215
+ 9 tracks added in 42s (54.8 MiB at 1.3 MiB/s)
216
+ flushing + ejecting /dev/sdb
217
+
218
+ Done. /dev/sdb is ready — insert it into the iPod.
219
+ ```
220
+
221
+ </details>
115
222
 
116
223
  Load the **bulk** of your library now, while the card is in the reader. Once the
117
224
  card is in the iPod, music transfers over FireWire are much slower — fine for a
@@ -121,16 +228,16 @@ Now pop the card into the iPod and connect the iPod to your computer. flashpod
121
228
  finds it on its own — no mounting, no device paths, no `sudo` to type:
122
229
 
123
230
  ```
124
- $ flashpod ls
231
+ $ flashpod list
125
232
  flashpod: looking for an iPod means reading attached disks, which needs root — elevating via sudo...
126
- Password:
127
- Found iPod on /dev/rdisk182 tracks.
128
- iPod "David's iPod": 38 tracks, 2 artists, 2 albums
233
+ [sudo] password for david:
234
+ Found iPod on /dev/sdb2 (IPOD FireWire 119.1G) 25 tracks.
235
+ iPod "iPod": 25 tracks, 2 artists, 3 albums
236
+ Can
237
+ Tago Mago (7 tracks)
129
238
  New Order
130
- Power, Corruption & Lies (8 tracks)
131
- Substance (12 tracks)
132
- The Cure
133
- Kiss Me, Kiss Me, Kiss Me (18 tracks)
239
+ Brotherhood (9 tracks)
240
+ Technique (9 tracks)
134
241
  ```
135
242
 
136
243
  Add or remove the odd track right on the device:
@@ -151,51 +258,95 @@ Removed 12 tracks
151
258
 
152
259
  ## Commands
153
260
 
154
- flashpod finds your iPod for you. With no flags, it uses one that's already
261
+ The easiest way to use flashpod is to run a simple command like `flashpod
262
+ flash` or `flashpod add` — and let it walk you through the options. Many
263
+ commands accept extra flags, but you don't need to supply any.
264
+
265
+ **flashpod finds your iPod for you.** With no flags, it uses one that's already
155
266
  mounted; otherwise it scans the attached disks and picks out the iPod by the
156
267
  iTunes database on it (no guessing from volume labels), then reads and writes it
157
268
  **directly over the raw device** with its own FAT driver — no OS mount required.
269
+
158
270
  That raw path is what lets flashpod manage an iPod the OS *can't* mount, like a
159
271
  flash-modded FireWire iPod on a Mac (macOS's read-ahead corrupts the boot
160
272
  sector, so it refuses the volume). Raw access needs root, so flashpod re-runs
161
273
  itself under sudo and prompts for your password — you never type `sudo`
162
274
  yourself.
163
275
 
164
- To skip detection, name the target explicitly`--mount <path>` for a
165
- mountpoint or `--raw <device>` for a raw device (the data partition or the whole
166
- disk), before or after the subcommand. On Linux you can also just mount the iPod
167
- yourself and let flashpod find the mount. On a non-terminal, flashpod won't
168
- guess pass one of these.
276
+ If more than one iPod is attachedsay a freshly-flashed card sitting in a
277
+ reader while a FireWire iPod is also plugged in flashpod lists them and asks
278
+ which to use rather than picking one for you. And on Linux, if a FireWire iPod
279
+ is plugged in but the kernel hasn't attached it as a disk yet, flashpod loads
280
+ the driver it needs first, so the iPod shows up instead of silently going
281
+ missing.
169
282
 
170
- All library commands — `ls`, `add`, `rm`, `init`, `rebuild` — work this way.
283
+ All library commands — `list`, `add`, `rm`, `init`, `rebuild` — work this way.
171
284
 
172
- ### `flashpod ls` (alias: `flashpod list`)
285
+ ### `flashpod list`
173
286
 
174
287
  ```
175
- $ flashpod ls # artist → album tree with track counts
176
- iPod "iPod": 68 tracks, 1 artists, 5 albums
288
+ $ flashpod list # artist → album tree with track counts
289
+ iPod "iPod": 25 tracks, 2 artists, 3 albums
290
+ Can
291
+ Tago Mago (7 tracks)
177
292
  New Order
178
- Power, Corruption & Lies (8 tracks)
179
- Substance (12 tracks)
293
+ Brotherhood (9 tracks)
294
+ Technique (9 tracks)
180
295
 
181
- $ flashpod ls all # same tree + every track (id, track no., duration)
182
- New Order
183
- Substance
184
- 52 1. Ceremony 4:25
185
- 53 2. Everything's Gone Green 5:31
296
+ $ flashpod list all # same tree + every track (id, track no., duration)
297
+ $ flashpod list artist # flat per-artist track counts (or `artists`)
298
+ $ flashpod list album # flat per-album track counts (or `albums`)
299
+ ```
300
+
301
+ <details>
302
+ <summary><strong>See full <code>flashpod list all</code> output</strong> — every track with its id, track number, and duration</summary>
186
303
 
187
- $ flashpod ls artist # flat per-artist track counts (or `artists`)
188
- $ flashpod ls album # flat per-album track counts (or `albums`)
189
304
  ```
305
+ $ flashpod list all
306
+ flashpod: looking for an iPod means reading attached disks, which needs root — elevating via sudo...
307
+ Found iPod on /dev/sdb2 (IPOD FireWire 119.1G) — 25 tracks.
308
+ iPod "iPod": 25 tracks, 2 artists, 3 albums
309
+ Can
310
+ Tago Mago
311
+ 70 1. Paperhouse 7:28
312
+ 71 2. Mushroom 4:03
313
+ 72 3. Oh Yeah 7:24
314
+ 73 4. Halleluhwah 18:28
315
+ 74 5. Aumgn 17:33
316
+ 75 6. Peking O 11:38
317
+ 76 7. Bring Me Coffee or Tea 6:46
318
+ New Order
319
+ Brotherhood
320
+ 61 1. Paradise 3:50
321
+ 62 2. Weirdo 3:52
322
+ 63 3. As It Is When It Was 3:46
323
+ 64 4. Broken Promise 3:47
324
+ 65 5. Way Of Life 4:05
325
+ 66 6. Bizarre Love Triangle 4:21
326
+ 67 7. All Day Long 5:12
327
+ 68 8. Angel Dust 3:43
328
+ 69 9. Every Little Counts 4:25
329
+ Technique
330
+ 52 1. Fine Time 4:42
331
+ 53 2. All The Way 3:24
332
+ 54 3. Love Less 3:04
333
+ 55 4. Round And Round 4:31
334
+ 56 5. Guilty Partner 4:48
335
+ 57 6. Run 4:31
336
+ 58 7. Mr. Disco 4:21
337
+ 59 8. Vanishing Point 5:17
338
+ 60 9. Dream Attack 5:12
339
+ ```
340
+
341
+ </details>
190
342
 
191
- Track ids shown by `ls all` are what `flashpod rm <id>` takes.
343
+ Track ids shown by `list all` are what `flashpod rm <id>` takes.
192
344
 
193
345
  ### `flashpod add [path ...]`
194
346
 
195
347
  Add audio files and/or directories. Directories are scanned recursively in
196
- sorted order; macOS `._*` AppleDouble files and non-audio files are skipped.
197
- Recognized extensions: `.mp3 .m4a .m4b .aac .wav .aif .aiff`. Tags, duration,
198
- and bitrate are read automatically (mutagen).
348
+ sorted order. Recognized extensions: `.mp3 .m4a .m4b .aac .wav .aif .aiff`.
349
+ Tags, duration, and bitrate are read automatically.
199
350
 
200
351
  Files already on the iPod are skipped, so you can safely re-point `add` at an
201
352
  overlapping set — e.g. add a single, then later add the whole album folder
@@ -205,9 +356,9 @@ duplicate when its size, duration, and title all match one already present
205
356
  copies have a different size and are added as new.
206
357
 
207
358
  ```
359
+ $ flashpod add # ← the usual way: prompts, with tab completion
208
360
  $ flashpod add ~/music/Some\ Album # a directory
209
361
  $ flashpod add a.mp3 b.mp3 ~/music/More/ # mix files and directories
210
- $ flashpod add # no args: prompts, with tab completion
211
362
  ```
212
363
 
213
364
  Progress is one line per track, shown in a scrolling 4-line window so a big
@@ -225,6 +376,28 @@ window, are counted in the summary, and don't stop the batch:
225
376
  12 tracks added, 1 skipped (already on iPod), 1 failed in 1m02s
226
377
  ```
227
378
 
379
+ <details>
380
+ <summary><strong>See a full <code>flashpod add</code> session</strong> — adding an album to the iPod over FireWire</summary>
381
+
382
+ ```
383
+ $ flashpod add
384
+ flashpod: add over the iPod's raw device needs root — elevating via sudo...
385
+ Found iPod on /dev/sdb2 (IPOD FireWire 119.1G).
386
+ File or directory to add (TAB to complete): /mnt/homestore/sound/mp3/New Order/Brotherhood/
387
+ flashpod add: this batch is 51.0 MiB. You've got 118.89 GiB more than you need, Dude. That's gnarly!
388
+ [6/9] Adding: Bizarre Love Triangle — New Order... 100% (6.0/6.0 MiB)
389
+ [7/9] Adding: All Day Long — New Order... 100% (7.2/7.2 MiB)
390
+ [8/9] Adding: Angel Dust — New Order... 100% (5.1/5.1 MiB)
391
+ [9/9] Adding: Every Little Counts — New Order... 100% (6.1/6.1 MiB)
392
+ 9 tracks added in 2m38s (51.0 MiB at 330 KiB/s)
393
+ ```
394
+
395
+ Run with no arguments, `add` finds the iPod itself and prompts for a path (with
396
+ tab completion). Only the last four progress lines stay on screen — tracks 1–5
397
+ scrolled away above.
398
+
399
+ </details>
400
+
228
401
  > **Adding over FireWire is slow** (~270 KiB/s — a hardware limit of these early
229
402
  > bridges, not something a setting can fix). For **bulk** loads, pull the card
230
403
  > into a USB reader and `add` over the normal mount — USB bypasses the bridge
@@ -233,7 +406,7 @@ window, are counted in the summary, and don't stop the batch:
233
406
  ### `flashpod rm`
234
407
 
235
408
  ```
236
- $ flashpod rm 52 53 # by track id (see `flashpod ls all`)
409
+ $ flashpod rm 52 53 # by track id (see `flashpod list all`)
237
410
  $ flashpod rm artist Relic Pop # every track by the artist
238
411
  $ flashpod rm album Thick As Thieves # every track in the album
239
412
  ```
@@ -257,18 +430,25 @@ Rebuild the iTunes database **from the music files already on the iPod**. Walks
257
430
  `iPod_Control/Music/F##`, reads each track's tags, and writes a fresh database
258
431
  pointing at the existing files — so a corrupt or missing database is recovered
259
432
  without re-copying or losing music. (It reads every track to sniff its tags, so
260
- it's slow over FireWire; fine for a one-off recovery.) `flashpod ls` points you
433
+ it's slow over FireWire; fine for a one-off recovery.) `flashpod list` points you
261
434
  here when it finds an iPod with an unparseable database, and `flashpod add` onto
262
435
  such an iPod offers to rebuild first, then adds your new files on top.
263
436
 
264
437
  ### `flashpod flash [/dev/sdX]`
265
438
 
266
439
  Write the iPod firmware and partition layout to a CF/SD card. **Erases the
267
- card.** Needs root (`sudo flashpod flash`).
440
+ card.** Writing needs root, so flashpod re-runs itself under sudo (prompting for
441
+ your password) — you launch it as a regular user.
442
+
443
+ **Just run `flashpod flash` with no arguments.** That's the normal way: it lists
444
+ the removable disks, walks you through picking the right one, writes the
445
+ firmware, and then offers to initialize the database and load your music — the
446
+ whole card set up in one sitting. The forms below are only for when you want to
447
+ name the device yourself or preview the plan.
268
448
 
269
449
  ```
270
- $ sudo flashpod flash # interactive: pick from removable disks
271
- $ sudo flashpod flash /dev/sdb # direct
450
+ $ flashpod flash # ← the usual way: pick a disk interactively
451
+ $ flashpod flash /dev/sdb # name the device yourself
272
452
  $ flashpod flash /dev/sdb --dry-run # print the plan, write nothing (no root)
273
453
  $ flashpod flash --self-test # validate layout logic, no hardware
274
454
  ```