Pi Zero als smart USB-stick 3

Door synoniem op vrijdag 6 december 2019 22:31 - Reacties (2)
Categorie: Raspberry Pi, Views: 2.383

Soms zit het mee, soms zit het tegen. Dat geldt ook voor mijn projectje met de Pi Zero. De uiteindelijke bedoeling is om een USB-stick te hebben met een ge-encrypte opslagmogelijkheid. Uitgerekend wanneer je daarmee bezig bent blijkt je SD-kaart het begeven te hebben. Gelukkig kon ik een voordelige 64 GB SD-kaart scoren met Black Friday.

De Pi om te toveren in een massaopslag is vrij eenvoudig. Dat is namelijk een kwestie van de module g_mass_storage laden met de juiste parameters. Er zijn twee maren:

1 - Je kunt betreffende fileimage of het block device niet gelijktijdig door de Pi en de host laten benaderen. Dit resulteert gegarandeerd in datacorruptie, als het al werkt. Ik heb het uiteraard wel geprobeerd met kopieeren maar bestanden stonden volgens de host op de stick maar de Pi leek ze volkomen te negeren. Maar zodra de Pi een keer ge-rebooted was bleken de bestanden verminkt te zijn. En volstrekt willekeurig of de data afkomstig is van de Pi of van de host.

2 - Je kunt de losse module g_serial en g_mass_storage niet gelijkertijd laden. Om dit laten werken moet je de module g_multi gebruiken met een configuratiebestand voor de parameters die je mee wil geven. Zoals gemeld in aflevering 2 is g_multi een composite driver en daarmee een combo van g_serial, g_ether en g_mass_storage. De parameters die je mee moet geven zijn overigens gelijk aan die van de losse g_ modules. Voor nu heb ik de parameters voor g_ether even gelaten voor wat het is.

Daarnaast was het mijn bedoeling om Veracrypt te gebruiken voor encryptie van de stick. Veracrypt is de opvolger van Truecrypt wat zowel onder Windows als Linux te gebruiken is. Het maakt standaard geen deel uit van Raspbian dus je moet het zelf downloaden en installeren. De laatste versie voor Raspbian is 1.21. Wil je versie 1.24 met hotfix dan zul je deze zelf moeten compileren (inclusief een patch aanbrengen en alle afhankelijkheden met de hand regelen).

Helaas is Veracrypt een maatje te groot voor de Pi Zero. Bij een ge-encrypte container van 8 GiB had de Zero bijna vijf minuten nodig om deze te openen. Mocht je Veracrypt willen gebruiken voor een Pi 3 of 4, versie 1.21 is te downloaden van Sourceforge.

De eerste stap nu is het maken van een fileimage op de Pi om te kijken of alles werkt zoals geadverteerd. Het aanmaken van een ge-encrypted deel komt hier na daarom begin ik met een imagefile van 8 GiB.
code:
1
2
3
4
5
$ sudo dd bs=4M if=/dev/zero of=/usbshare.img count=2048

  2048+0 records in
  2048+0 records out
  8589934592 bytes (8.6 GB, 8.0 GiB) copied, 506.236 s, 17.0 MB/s

Vervolgens willen we hier een bestandssysteem op maken. Dat doen we door de imagefile te 'mounten' als een loop device, deze te partitioneren en vervolgens met FAT32 te formatteren. FAT32 omdat die zowel in Windows als Linux goed ondersteund wordt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
$ sudo losetup -f 

  /dev/loop0

$ sudo losetup -P  /dev/loop0 /usbshare.img

$ sudo fdisk /dev/loop0

Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/loop0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-16777215, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215): 

Created a new partition 1 of type 'Linux' and of size 8 GiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden or  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi ea  Rufus alignment
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         eb  BeOS fs        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ee  GPT            
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        ef  EFI (FAT-12/16/
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f0  Linux/PA-RISC b
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f1  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f4  SpeedStor      
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      f2  DOS secondary  
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fb  VMware VMFS    
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fc  VMware VMKCORE 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fd  Linux raid auto
1c  Hidden W95 FAT3 75  PC/IX           bc  Acronis FAT32 L fe  LANstep        
1e  Hidden W95 FAT1 80  Old Minix       be  Solaris boot    ff  BBT            
Partition type (type L to list all types): c
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help):  w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo fdisk -l /dev/loop0
Disk /dev/loop0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device       Boot Start      End  Sectors Size Id Type
/dev/loop0p1       2048 16777215 16775168   8G  c W95 FAT32 (LBA)

$ sudo mkfs -t vfat /dev/loop0p1
 mkfs.fat 4.1 (2017-01-24)

Vervolgens geven we in /etc/modprobe.d/usbgadget.conf de minimale parameters mee voor g_mass_storage:
code:
1
options g_multi file=/usbshare.img ro=0

De belangrijkste parameters voor g_mass_storage zijn file, removable, cdrom, ro en luns.
Hierbij is:
file=bestandsnaam|blockdevice
removable=0|1 Standaard 1 = ja
cdrom=0|1 Standaard 0 = nee tenzij één of meer cdroms wil emuleren
ro= 0|1 Standaard 0 tenzij het achterliggende bestand readonly is en als cdrom=1
luns=N Standaard 1 en specificeert het aantal logical units. Geef je twee bestandsnamen op bij file maar staat luns op 1 dan zal alleen het eerste bestand gebruikt worden.

En dan wordt het tijd om te testen door de module g_multi te laden:
code:
1
$ sudo modprobe g_multi

Is alles goed gegaan dan wordt op de host een USB-stick van 8 GiB zichtbaar. In de log op de Pi zie je dat de onderdelen van g_multi geladen worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ dmesg | tail -n 21
[   65.931527] using random self ethernet address
[   65.931548] using random host ethernet address
[   65.969728] Mass Storage Function, version: 2009/09/11
[   65.969751] LUN: removable file: (no medium)
[   65.970047] LUN: file: /usbshare.img
[   65.970062] Number of LUNs=1
[   65.971623] usb0: HOST MAC 9e:24:65:b1:c8:43
[   65.973026] usb0: MAC d2:95:c9:62:75:98
[   65.981082] g_multi gadget: Multifunction Composite Gadget
[   65.981106] g_multi gadget: userspace failed to provide iSerialNumber
[   65.981113] g_multi gadget: g_multi ready
[   65.981131] dwc2 20980000.usb: bound driver g_multi
[   66.045852] dwc2 20980000.usb: new device is high-speed
[   66.114088] dwc2 20980000.usb: new device is high-speed
[   66.336422] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[   66.491877] dwc2 20980000.usb: new device is full-speed
[   66.558093] dwc2 20980000.usb: new device is high-speed
[   66.830857] dwc2 20980000.usb: new device is high-speed
[   66.899169] dwc2 20980000.usb: new address 32
[   66.978538] g_multi gadget: high-speed config #1: Multifunction with RNDIS
[   66.978895] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready

Volgende: Netwerk booten van een Raspberry 4 12-'19 Netwerk booten van een Raspberry 4
Volgende:  Pi Zero als smart USB-stick 2 11-'19 Pi Zero als smart USB-stick 2

Reacties


Door Tweakers user Shamalamadindon, maandag 16 december 2019 14:25

Pracktish vraagje, werkt via vnc verbinden een beetje bij jou? Bij mij kan ik nauwelijks ingelogd komen of de verbinding klapt.

Door Tweakers user synoniem, maandag 16 december 2019 19:11

Ik heb vnc nog niet geprobeerd. Screen en minicom werken goed tot nu toe.
Denk ook dat als je een grafische omgeving wilt dat dat voor een Pi Zero met 512Mb geheugen en 1 processor core iets teveel gevraagd is.

Reageren is niet meer mogelijk