如何在BeagleBone Black开发板上优先将文件保存至SD卡?
嘿,我给你整理了一套完整的实现方案,刚好匹配你在BeagleBone Black上的需求——有SD卡就把数据存到卡上,没卡就存当前目录:
实现步骤详解
1. 写个自动检测+挂载的Shell脚本
咱们先搞个shell脚本,自动完成SD卡检测、挂载(如果需要),然后确定数据保存路径。直接复制下面的代码存成save_data.sh就行:
#!/bin/bash # 定义SD卡分区和挂载点,BBB的SD卡一般就是mmcblk0p1 SD_PART="/dev/mmcblk0p1" SD_MOUNT="/mnt/sdcard" CURRENT_DIR=$(pwd) # 检测SD卡是否存在 if fdisk -l | grep -q "$SD_PART"; then # 先检查挂载点文件夹有没有,没有就创建 if [ ! -d "$SD_MOUNT" ]; then sudo mkdir -p "$SD_MOUNT" fi # 再检查SD卡是不是已经挂载了 if ! mount | grep -q "$SD_MOUNT"; then sudo mount "$SD_PART" "$SD_MOUNT" # 怕挂载失败,加个降级方案:挂不上就用当前目录 if [ $? -ne 0 ]; then SAVE_DIR="$CURRENT_DIR" else SAVE_DIR="$SD_MOUNT" fi else SAVE_DIR="$SD_MOUNT" fi else # 没检测到SD卡,直接用当前目录 SAVE_DIR="$CURRENT_DIR" fi # 这里替换成你实际要写入的数据,比如从传感器读来的内容 echo "`date`: 采集到的样本数据" >> "$SAVE_DIR/data_log.txt" # 要是你写完数据想立刻卸载SD卡,可以解开下面这行注释,不过一般保持挂载更方便 # sudo umount "$SD_MOUNT"
2. 给脚本设置权限,避免每次输密码
因为脚本里用到了sudo,总输密码太麻烦,咱们搞定权限问题:
- 先给脚本加执行权限:
chmod +x save_data.sh - 要是想彻底不用输密码,编辑sudoers文件:
sudo visudo,然后加一行(把debian换成你的BBB用户名):debian ALL=(ALL) NOPASSWD: /bin/mount, /bin/umount, /bin/mkdir
3. 集成到你的应用里(可选)
要是你的数据采集是用Python写的,也可以直接在代码里实现这个逻辑,不用单独跑脚本:
import os import subprocess def get_save_path(): sd_part = "/dev/mmcblk0p1" sd_mount = "/mnt/sdcard" current_dir = os.getcwd() # 检测SD卡是否存在 fdisk_output = subprocess.run(["fdisk", "-l"], capture_output=True, text=True).stdout if sd_part in fdisk_output: # 创建挂载点(如果需要) if not os.path.exists(sd_mount): subprocess.run(["sudo", "mkdir", "-p", sd_mount], check=True) # 检查是否已挂载 mount_output = subprocess.run(["mount"], capture_output=True, text=True).stdout if sd_mount not in mount_output: try: subprocess.run(["sudo", "mount", sd_part, sd_mount], check=True) return sd_mount except subprocess.CalledProcessError: # 挂载失败,退回到当前目录 return current_dir else: return sd_mount else: return current_dir # 调用示例:写入数据到日志文件 save_dir = get_save_path() with open(os.path.join(save_dir, "sensor_data.txt"), "a") as log_file: log_file.write(f"{os.popen('date').read().strip()}: 新增数据\n")
几个关键注意点
- SD卡格式:确保你的SD卡是BBB支持的格式,比如FAT32或者ext4,不然挂载会失败。如果是FAT32,挂载时可以加权限参数让普通用户能读写:
sudo mount -o uid=debian,gid=debian "$SD_PART" "$SD_MOUNT" - 开机自动挂载(可选):要是想开机就自动挂载SD卡,编辑
/etc/fstab加一行,但要加noauto避免没卡时开机报错:/dev/mmcblk0p1 /mnt/sdcard auto noauto,user,rw 0 0
内容的提问来源于stack exchange,提问作者Salahuddin
相关产品推荐
相关产品推荐

