Para algunos proyectos necesitamos pasar información de nuestra raspberry a una usb, para esto vamos a mostrar cómo se monta una usb para luego pasar algún archivo.
lsblk
si queremos usar exfat
sudo apt install exfat-fuse
si queremos usar ntfs
sudo apt install ntfs-3g
Con esto vamos a ver en donde tenemos una usb conectado (estoy probando en raspberry pi zero w)
Montar Usb manual
ahora para este tutorial necesitamos que sea FAT32 para esto vamos a poner
sudo fdisk -l
Vamos a crear una carpeta intermermedia
sudo mkdir /media/pi
ahora vamos a montar manualmente
sudo mount /dev/sda1 /media/pi
Con esto ya tenemos nuestra usb montada y podemos acceder a ella, pero si lo desconectamos tendremos que hacer los pasos anteriores.
para esto vamos a automatizar haciendo lo siguiente, vamos a ver cual es el id de nuestra usb montada.
Montar usb automático al iniciar el sistema
ls -l /dev/disk/by-uuid/*
sudo nano /etc/fstab
también podemos agregar por id y que es lo recomendado
ls -l /dev/disk/by-uuid/*
para cualquier que pongamos ya sea por id o por nombre ponga la siguiente información
UUID=5C24-1453 /mnt/mydisk FSTYPE defaults,auto,users,rw,nofail 0 0
Si no colocamos nofail no iniciara el sistema.
y ahora damos reboot
solo hay que poner sudo mount -a para montar siempre nuestro usb
Montar usb automáticamente con python
sabiendo todo lo anterior usaremos la primera sección pero en vez de hacerlo manual vamos a hacer un script que detecte la conexión y monte en automático.
lsblk -b /dev/sd* -J con esta líneas nos trae la información de los usb conectados, con -J nos trae en formato json y es más fácil manejarlo en python parseando con JSON.
subprocess usando output nos trae en texto las respuestas de la consola, pero en especial con lsblk no se puede leer así que podemos usar el siguiente comando.
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output = process.communicate()
El código completo:
import json import os import subprocess import requests import time url = "https://api.telegram.org/bot" botkey = "812454574:AAFeS5HZ9EW0QvShfcFMYqs3aUaHBwulADP" privado = 245614688 def mensaje(urls, text, chat_id): try: smsn = url+"{}/sendMessage?chat_id={}&text={}".format(botkey,str(chat_id),text) requests.post(smsn) except: pass mensaje(url,'- iniciando automount 🤖 -' , privado) while True: try: command = "lsblk -b /dev/sd* -J" process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True) output = process.communicate() usbx = str(output[0]).replace("b",'', 1).replace("'",'').replace('\\n','') jusb = json.loads(usbx) except: print("error_ listado") try: if len(jusb['blockdevices'][0]['children']) > 0: n = 0 for name in jusb['blockdevices'][0]['children']: # print(name['name']) mnt = subprocess.check_output('mount', shell=True) if str(mnt).find(name['name']) > 0: print('ya esta montado') else: if n == 0: pathusb = 'sudo mount /dev/{} /media/pi'.format(name['name']) # print (pathusb) else: print(jusb['blockdevices'][0]['children'][n - 1]['name']) if (jusb['blockdevices'][0]['children'][n - 1]['name'] != name['name']): pathusb = 'sudo mount /dev/{} /media/pi{}'.format(name['name'],n) else: pathusb = '' if (pathusb != ''): x = subprocess.call(pathusb, shell=True) mensaje(url, 'montado ' + name['name'], privado) n += 1 # print(x) # print('montado ' + name['name']) except: pass time.sleep(30)