在树莓派上部署openwrt

五一放假,不想写代码不想看书也懒得追番,准备搞事情,把旧iPhone和一块旧树莓派(3B)废物重组一下,让iPhone体验一下Tiktok的沙雕。

打算按照mlapp帖子里的固件和方法整,当然,有关树(Li)莓(nu)派(x)的任何东西都不会那么一帆风顺的……

概况

理论目标

无线猫的LAN口接树莓派电口,然后把树莓派的WiFi当做热点用,树莓派写openwrt镜像,配置SSR,用单独的SSID,以实现在不影响现有WiFi和连接设备的情况下,接出一个带有科学功能的上网热点。

现有环境

因为我最近才发现,家里用的TP-LINK的无线猫上已经连了很多设备了,智能音响、扫地机器人、空气净化器、树莓派、手机、电脑、电视等等十几个设备,直接改造TP-LINK影响太大了,而且一时半会上不了网,这个我是不能接受的。那么,只好从主猫上再接出一路WiFi。

目前手里有好几块树莓派(但是我没买4,因为听说type-c有些无伤大雅的设计问题,完美主义者怎么能买这种东西呢?!),3B+、3B、2B我都有,于是选了个3B,因为性能还凑合,而且我只有一个2B舍不得用,要知道2B是不板载无线里性能最NB的了,万一哪天会在比较严格的环境试验这种东西,肯定首选这个没无线功能的了[捂脸]另外,3B+上面有DOA的麦阵列那一套环境,懒得删了,所以选用这个闲置的3B。

iPhone吧是个6S,卡早换新手机上了,你要用Tiktok得骗它。因此,通过某瑞士安全邮箱服务、谷歌地图、一次性手机号服务等AppleID相关操作,再连上有科学功能的树莓派WiFi,它就真以为自己是个硅谷手机了。这个时候,装上Tiktok,就可以绕过字节跳动的分区管理了。

写镜像

使用macOS向SD卡写镜像

失败:用balenaEtcher写镜像直接报错,不管是lean官方的,还是mlapp提供的都说“镜像损坏”。

失败:用macOS的dd强行写,虽然能写进去,但返回值是错误的(unix非0返回值,zsh红箭头),插入树莓派启动失败:

1
2
3
4
5
6
(base) ➜  ~ sudo dd bs=1m if=/Users/zealot/Downloads/openwrt-bcm27xx-bcm2710-rpi-3-squashfs-factory.img of=/dev/rdisk2
Password:
dd: /dev/rdisk2: Invalid argument
247+1 records in
247+0 records out
258998272 bytes transferred in 19.296779 secs (13421839 bytes/sec)

网上搜了一下,推荐用Windows下的分区工具或者Linux下的dd

使用虚拟机向SD卡写镜像

实在是因为手头拿不出Windows电脑或者USB读卡器[捂脸]。

用以前在virtualbox建好的里的win7,不论怎么设置苹果内置的sdcard reader(虚拟机里显示为一个USB设备,不论mount状态、如何重启虚拟机都不行),都报设备busy的错误:

查看sdcard:

1
2
3
4
5
6
7
(base) ➜  ~ df -lh
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s5 465Gi 11Gi 30Gi 26% 487852 4876640268 0% /
/dev/disk1s1 465Gi 420Gi 30Gi 94% 2976908 4874151212 0% /System/Volumes/Data
/dev/disk1s4 465Gi 4.0Gi 30Gi 12% 5 4877128115 0% /private/var/vm
/dev/disk1s3 465Gi 504Mi 30Gi 2% 41 4877128079 0% /Volumes/Recovery
/dev/disk2s1 64Mi 17Mi 47Mi 26% 512 0 100% /Volumes/NO NAME

或是卸载sdcard:

1
diskutil umount /dev/disk2s1

帖子说是因为后来的MBP不把读卡器暴露为USB设备了,按这个帖子做:

  1. 插入SDcard,在终端里用mount查看分区,确定设备名称。在我的电脑上,显示为“NO NAME”的卷就是SD卡,其对应的设备叫做/dev/disk2s1,而这个s1表示/dev/disk2上的第一个分区,因此设备名其实应该叫做/dev/disk2

    1
    2
    3
    4
    5
    6
    7
    8
    (base) ➜  ~ mount
    /dev/disk1s5 on / (apfs, local, read-only, journaled)
    devfs on /dev (devfs, local, nobrowse)
    /dev/disk1s1 on /System/Volumes/Data (apfs, local, journaled, nobrowse)
    /dev/disk1s4 on /private/var/vm (apfs, local, journaled, nobrowse)
    map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse)
    /dev/disk1s3 on /Volumes/Recovery (apfs, local, journaled, nobrowse)
    /dev/disk2s1 on /Volumes/NO NAME (msdos, local, nodev, nosuid, noowners)
  2. 打开电脑上“Disk Utility.app”,也就是“磁盘工具.app”,找到SD卡然后卸载它,要注意是卸载,而不是推出。另外,可能在做完下一步后还需要在卸载一次,因为macOS有可能自动把SD卡装载回来。

  3. 使用下面的命令,要注意的是,-rawdisk后面跟的参数是/dev/disk2,不是/dev/disk2s1。另外,/Users/zealot/VirtualBox\ VMs/WIN7/sdcard.vmdk这个路径写哪都行,图方便我直接放在我的WIN7虚拟机文件夹下了。:

    1
    2
    (base) ➜  ~ sudo VBoxManage internalcommands createrawvmdk -filename /Users/zealot/VirtualBox\ VMs/WIN7/sdcard.vmdk -rawdisk /dev/disk2
    RAW host disk access VMDK file /Users/zealot/VirtualBox VMs/WIN7/sdcard.vmdk created successfully.

    注:若出现类似”…vmdk uuid…does not match /var/root/Library/VirtualBox/VirtualBox.xml”这种报错,可以考虑修改虚拟机配置文件如WIN7.vboxVirtualBox.xml文件中的相应uuid。

  4. 重新配置虚拟机:

  5. 确定虚拟机已关闭;

  6. 打开“设置”->“存储”,点控制器旁边的“添加虚拟磁盘”,并选择“使用现有的虚拟磁盘”;

  7. 点击“注册”,选择上一步中生成的/Users/zealot/VirtualBox\ VMs/WIN7/sdcard.vmdk;此处如果报权限错误,我试了chmodchown.vmdkdisk2s1的权限是没用的,我也试了关掉macOS的SIP同样是没用的,必须命令行管理员权限运行sudo VirtualBox才可以。真的不太懂系统权限问题[捂脸]。

  8. 双击列表中的sdcard.vmdk,然后就会返回“存储”界面并看到这个设备。

  9. 启动虚拟机,看到该设备显示为一个本地磁盘。

  10. 这一套做下来,我们的SD卡在win7里就挂载为了一个ATA设备,也就是硬盘,很不幸的是“Win32 Disk Imager”是不认硬盘的。

  11. 因此,把4.2修改一下:打开“设置”->“存储”,点控下方的“添加存储控制器”,选择菜单项“添加USB控制器”,这时候列表里多出来一个“USB控制器”,然后再按照上一步中2、3操作添加虚拟磁盘,然后选上“热插拔”和“固态驱动器”,这样就真的把SD卡伪装成USB设备了。此时Win7里出现两块硬盘,一个是ATA设备,一个是USB设备。再打开“Win32 Disk Imager”时,就可以选择这个盘了:

配置为USB设备

开机搜索名为“openwrt”的无线SSID,连接,进入http://192.168.1.1,用“root/password”登录配置界面。

配置openwrt

先让自己能上网

我家用的TP-LINK的猫,LAN口接树莓派,而这个TP-LINK默认是在192.168.1.1上的,所以先在openwrt配置界面中“网络”->“接口”里改个IP,默认网关写在192.168.1.1上,然后写上俩TP-LINK里用的DNS(我的西安电信通常是61.134.1.4218.30.19.40,西安移动通常是211.137.130.19)就可以访问互联网了。

配置SS

先把本机的公钥先传到openwrt上,方便ssh登录,然后直接root登录吧,懒得弄用户了。

如果vim时报错遇到"E437: terminal capability "cm" required",需要执行一下export TERM=xterm

继续,在openwrt管理页面中配置“ShadowSocksR Plus+”->“服务器节点”,添加一个类型为“ShadowSocksR”的服务器就可以了,我的情况,主机名、端口、密码、加密方式填上,其他默认就可以直接联通了。

最终测试

github免密push

临时想到的,最近时不时要更新博客,push的时候总是让我输入用户名密码,很烦。因为我的github号是双因子的,push时总要输用户名,然后复制粘贴那个巨长的push key。

github repo的免密push设置也很简单,最关键的是注意仓库的git协议

本机git仓库配置

在仓库中使用git config -e命令修改配置文件,只有使用git时才可以免密,https不行:

1
2
3
4
  [remote "origin"]
- url = https://github.com/your-gh/your-repo.git
+ url = git@github.com:your-gh/your-repo.git
fetch = +refs/heads/*:refs/remotes/origin/*

如果是hexo之类的博客,cli工具自动集成push功能,那么修改其配置文件的repo目标即可,比如我用的hexo,那么修改_config.yml即可:

_confi.yml
1
2
3
4
5
  deploy:
type: git
- repo: https://github.com/your-gh/your-repo.git
+ repo: git@github.com:your-gh/your-repo.git
branch: master

远端github配置

可以在你的某个特定github-repo下的“settings”->“deploy key”里写一个公钥,选上允许写权限。这个方法有个缺点,一个库会占一个key,下一个库就不能再用这个key了。

也可以直接在github账号配置的“settings”->“SSH and GPG keys”里写一个SSH公钥,这个号里所有的repo就都可以push了。其实这个方法更简单,推荐。

后记

工作这么多年,除了自学机器学习,最有用的就是去成都培训了一个月的Linux基础知识,打那时候起,就再也不虚Linux环境了,甚至编译报错都敢直接改源码了。所以说,对程序员来说,什么最重要?是以技术为基础产生的信念,遇到问题时,始终相信只要是计算机上的罗辑问题,都是可解的,就算当下搞不定,时间长了总能搞定。

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×