Skip to content

Commit

Permalink
Add: Post about mr42
Browse files Browse the repository at this point in the history
  • Loading branch information
Hayao0819 committed Dec 6, 2024
1 parent a309717 commit f64ed27
Show file tree
Hide file tree
Showing 12 changed files with 199 additions and 14 deletions.
190 changes: 190 additions & 0 deletions posts/20241123/mr42-openwrt/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
---
title: Meraki MR42を三枚おろしにしてOpenWRTを焼く方法
description: ""
date: 2024-11-23T15:51:20.665965+09:00
categories:
- 技術系
draft: false
publish: true
---

ヤフオクでMeraki MR42が大量に流されていたので10台落札した。1台2000円程度で落札できたので非常に良いお買い物。

しかしこのMR42はクラウド管理型という仕組みになっており、利用するにはかなりお高い管理費用を貝付き支払う必要がある。

MR42をはじめとした一部の製品では、OpenWRTを書き込むことでデバイスを資本の束縛から開放することができる。

この機種でOpenWRTを焼く情報は既に大量にあるのだが、数か所詰まった場所があるのでその部分を説明する。

## 注意

既にMR42にOpenWRTを焼く作業は多くの先人が記事にしているので、基本的にはそちらを参照されたい。

ここでは掲載されていない写真の補足や、個人的に作業に詰まった箇所を重点的に説明していく。

そのためシリアルコンソールの出力を閲覧する方法やTFTPサーバーの構築方法、ネットワークの基本的な知識については説明を行わない。

以下が私が実際に参考にした先人たちの記事である。

- [\[OpenWrt Wiki\] Meraki MR42](https://openwrt.org/toh/meraki/mr42#standard_installation_via_uart)
- [Meraki MR42にOpenWrtをインストールする手順のメモ \- 溜池の南側](https://nanotech.hatenablog.jp/entry/2023/11/14/101033)
- [cisco Meraki MR42のOpenWrt化の手順 \#Cisco \- Qiita](https://qiita.com/2hobata/items/bb066425deee89ea4acc)
- [Cisco Meraki MR42 OpenWrt化 : 天魔の館](https://dengel.exblog.jp/33301442/)

## 必要な道具

- スマホ・ノートPC分解工具
- (MR42以外の)適当なルーター
- 適当なLinuxでホストされたTFTPサーバー
- UART接続用アダプタ
- シリアル通信できる適当なソフトウェア(minicom等)
- ジャンプワイヤ
- RJ45ケーブル
- RJ45ポートのあるPC(もしくはTypeCのアダプタ)
- 付箋
- [MR42用のSysupgrade](https://firmware-selector.openwrt.org/?target=ipq806x%2Fgeneric&id=meraki_mr42)
- [clayface/openwrt-cryptid](https://github.com/clayface/openwrt-cryptid)にある以下のファイル
- mr42_u-boot.bin
- openwrt-ipq806x-generic-meraki_mr42-initramfs-fit-uImage.itb
- ubootwrite.py

私はRJ45のPCが手元になく、仕方なくRaspberry Pi 5を用いてセットアップを行った。

Sysupgradeは適当なバージョンでいいのだが、ビルド済みなSnapshotにはLuci(ウェブGUI)が無いので初期セットアップをCLIで行わなければならず苦しい。

どうしてもSnapshotが欲しい場合はLuciを含めたビルドを自分で行うことをおすすめする。

## TFTPサーバー作業用LANを構築する

用意したルーターをデフォルトゲートウェイ192.168.1.1、サブネットマスク255.255.255.0としてLANを構築する。

適当なTFTPサーバーを用意し、IPアドレスを192.168.1.250として静的にIPv4を割り当てておく。

TFTPサーバーのルートディレクトリに`openwrt-ipq806x-generic-meraki_mr42-initramfs-fit-uImage.itb`を配置しておく。

この部分が私が最も苦労した部分だ。他の参考サイトではTFTPサーバーとMR42を直に接続していたが、何度やってもファームウェアの転送が上手くできなかった。

仕方なくルーターを経由して小さなLANを構築したところうまくいったので、こちらのほうが確実であると思われる。

またmacOS標準のTFTPサーバーでは転送できなかったため、Linux環境でサーバーを立ち上げてほしい。環境がないときは適当なLinuxをLive起動して行うと良いかもしれない。私はManjaroとUbuntuで実際に作業を完了できた。

## 三枚おろしにする

![ゴム足](image.png)

ゴム足を細長いプラスチックの棒等でグイグイっと外し、隠れているネジを外す。

![ゴム足を外す](image-1.png)

上下に見える爪に薄い金属板を挿入し、そこから横にずらすようにして爪をあけていく。

![分解開始](image-2.png)

白い蓋を外すと裏蓋と内臓(金属塊)がくっついて外れる。

![裏蓋を取り外す](image-4.png)

![](image-5.png)

この円形の部分で爪がひっかかっているので、ここを外してあげるとグレーの裏蓋も外れる。

白い板、グレーの板、金属塊の三枚おろしになれば成功。

### 補足

爪を外すときに端にあるプラスチック片の足を折ってしまった。LEDの光を伝えるためのもののようで、グルーガンで接着して解決した。

![グルーガンで接着](image-3.png)

グルーガンをもりもりにしてしまうと、蓋をしたときに少し浮いてしまって沈痛な感じになってしまうので少なめなほうがおすすめ。

接着剤でつければスマートな感じになると思うが未検証。

## 内蔵を細かく分類する(マザボをあらわにする)

![金属板](image-6.png)

金属板を取り出せたら、側面のネジを外していく。長辺側に3つ、短辺側に2つで計10個のネジを外す。

![マザーボード](image-7.png)

アンテナ側を傷つけないように慎重にやっていくのがポイント。

## UARTを配線しシリアルコンソールに接続する

ジャンプワイヤのピンが金属板に触れてショートしてしまうと正常にシリアル通信ができないので、付箋を差し込んでおく。

この付箋に各ピンアサインを書いておくと後々に作業がしやすい。

四角いマークの付いているものがVCCで、園となりから順番にTX、RX、GNDとなっている。

VCCには接続せず、以下のように接続する。

- MR42のTXとUARTアダプタのRX
- MR42のRXとUARTアダプタのTX
- MR42のGNDとUARTアダプタのGND

![シリアルコンソール接続](image-8.png)

この状態でMR42の電源を入れ、UARTアダプタに該当するシリアルの出力を適当なツールで覗いてあげるとMerakiのブートログが流れてくるはずである。

ブートログが見えない場合はMR42が死んでいるか接続が間違っているかなので、再確認を行う。

## U-Bootを流し込みOpenWRTでブートする

シリアルコンソールの出力を確認できたら、一旦MR42のアダプタを外して電源を遮断し、シャットダウンする。

```sh
sudo python3 -m venv venv
source ./venv/bin/avtivate
sudo pip3 install pyserial
sudo python3 ubootwrite.py --write=mr42_u-boot.bin --serial=/dev/ttyUSB0
```

のコマンドで書き込みツールを立ち上げ`Waiting for device...`の出力が表示されたらMR42の電源をいれる。

すると勝手に書き込みが開始されるので20分程度待つ。このときにMR42を動かしてしまうとシリアル通信が切断されてしまうので注意する。

私は何度か転送途中で通信を遮断したり電源を切断してしまったりしたのだが、問題なく通常のMerakiが起動できた。

U-Bootの流し込みに成功すると、そのままTFTPサーバーにOpenWRTを取りにいくのでダウンロードを待つ。

TFTPサーバーのセットアップがうまくできていないと、シリアルコンソールに永遠にTの文字を出力し続ける。

LEDが白点滅し始めたらOpenWRTが起動し始めている証拠。

## U-Bootを書き込む

正常にOpenWRTが起動したら再びシリアルコンソールに入って以下のコマンドを入力する。

この段階で起動しているOpenWRTはライブ起動のようなものらしく、このコマンドで本格的にOSを書き換えていくらしい。

```sh
insmod mtd-rw i_want_a_brick=1
mtd erase /dev/mtd8
nandwrite -pam /dev/mtd8 /root/mr42_u-boot.mbn
```

このコマンドを入力して以降は完全に作業が終わるまではシャットダウンしてはいけないらしい。自分は怖くて実験できなかった。

## OpenWRTを書き込む

192.168.1.1にアクセスするとMR42の上でOpenWRTが起動している。ここで最新のSysupgradeでMR42にOpenWRTを書き込む。

Sysupgradeの書き込みが完了すると勝手に再起動される。これで晴れて完全なOpenWRT書き込み完了である。

## 組み直す

三枚おろしにされたOpenWRTを再びもとに戻す。特に躓くことはなく、落ち着いて分解の逆をやれば問題ない。

## 終わり

やはりエンタープライズで高級なハードウェアなだけあって、適当なバッファローやエレコムのルーターとは圧倒的に作り込みが違った。

アンテナがしっかりと固定されておりサイズも非常に大きい。クラウド管理型という特性上、契約なしではこの素晴らしいハードウェアが無用の長物になってしまうのは非常にもったいないと感じた。

RJ45ポートが1つしかないが、スイッチングハブとTagged VLANを用いればルーターを構築することもできるんだろうか…と思案してみるが試してはいない。

USBポートがあればNASのような用途にもできるのだが、MR42は本来APなので残念ながらそのような装備はない。

実運用としてはやはり中継機やAPとしての用途に限られてしまうのだろうが、格安で入手できてOpenWRTで遊べる非常に実用的なおもちゃとして有用だと感じた。
Binary file added public/posts/20241123/mr42-openwrt/image-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image-8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/20241123/mr42-openwrt/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/components/elements/Markdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export default async function Markdown({ content, basepath }: { content: string;
}
props = { ...props, src };

return <img {...props} className="py-4" />;
return <img {...props} className="mx-auto w-1/2 py-4" />;
},
//code: ({ children }) => <code className="text-sky-600">{children}</code>,

Expand Down
21 changes: 8 additions & 13 deletions tools/cmd/moveimg/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ func Cmd() *cobra.Command {
continue
}

if strings.HasPrefix(tp, "image") {
isImage := strings.HasPrefix(tp, "image")

// if !isImage {
// slog.Info("not image", "file", file, "type", tp)
// }

if isImage {
// 移動先
dist := strings.Replace(file, postsDir, publicDir, 1)

Expand All @@ -80,18 +86,7 @@ func Cmd() *cobra.Command {
cmd.PrintErrln(err)
errs = append(errs, err)
}
} //else if strings.HasPrefix(tp, "text") {

// data, err := os.ReadFile(file)
// if err != nil {
// cmd.PrintErrln(err)
// errs = append(errs, err)
// continue
// }

// // 画像のパスを変更
// data = []byte(strings.ReplaceAll(string(data), "![", "!["+path.Base(postsDir)+"/"))
// }
}

}
if len(errs) > 0 {
Expand Down

0 comments on commit f64ed27

Please sign in to comment.