背景
基于 Linux 设计了一个 LoRaWAN 网关(物联网设备),原本是安装在 8GB 的 SD 卡中,为此,生成了一个 8GB 的 Image 文件。
这样,就可以使用 Win32DiskImager 快速复制到其他 SD 卡之中。
问题
最近采购的一批 SD 卡无法复制,Win32DiskImager 提示:Image 文件大于目标存储器空间!
使用 DiskGenius 工具发现,原来的 8GB SD 卡有 15,728,640 扇区,新购的 SD 卡仅有 15,601664 扇区。
原来,新购的 SD 卡被“偷工减料”了,没有 8GB
解决
老办法代价很大:将 Linux 烧录到 SD 卡中,安装环境,编译 LoRaWAN 网关软件,增加账户,添加 Service,至少需要 4 小时,还可能引入错误。
一个创新的办法是 --- 缩小原来的 Image 文件,从 15,728,640 -> 15,601664 扇区,毕竟 Image 尾部有大量的“空白”扇区。
dd if=/dev/sdb1/LoRaWAN.img of=/dev/sdb1/LoRaWAN_less.img bs=512 count=15601664 conv=noerror,sync status=progress
按上面的命令,大约 30 多分钟就完成了“缩小” Image(这个期间,无需人工参与,好好休息或干点别的)。
经测试,缩小后的 Image 可以复制到“足量”和“减量”的 SD 卡中,成功解决问题。
一些公认优质 SD 卡采购链接
¥26.9 闪迪 16GB Class10 A1
¥59.9 三星 32GB Class10 U1
限制guest方法与利弊
方法1:使用目录与文件权限
|- 建立 guest 用户:useradd -d home_dir -g group -G grouplist guest
|- 明确文件权限 :chown -R rime:rime /dir
|- 限制目录访问 :chmod 770 /dir
|- 允许目录访问 :chmod o+wx /dir
- 允许编辑文件 :chmod o+w ./file
参考:《Linux Bible》page-83~86 了解文件权限和所有权;page-205~213 获取用户帐户
优点:以极低的代价,实现权限控制;
缺点:可以使用shell命令和部分性“非期望”地操作Linux。
方法2:限制SSH用户访问Linux指定目录
|- 创建 root jail,以 /home/test 为例:
|- |- /dev : null, tty, zero, random
|- |- /bin : copy /bin/bash
|- |- /lib64: bash 命令所依赖的共享库文件
|- - /etc : passwd, group
- 配置 /etc/ssh/sshd.config 启动 SSH 进入 root jail
|- Match User test_user
- ChrootDirectory /home/test
参考:《如何限制 SSH 用户访问 Linux 中指定的目录》
优点:实现了“绝对”的控制;
缺点:1 代价大:操作步骤多,每添加一个命令,必须添加依赖库;
2 仅对限制访问目录,该用户无法访问其他目录和文件;
3 无法使用Linux工具(如:vi)来编辑文件和(如:ps)操作系统。