monolog

monora log #=> ものろーぐ

Cisco IOS で tftp を使ったアップロードが Permission denied で怒られる件

Infrastructure

家の回線をv6プラスにしたところ、外側から特定のポートへアクセスさせたいような用途、つまりこのブログを自宅サーバーから提供することができないことに変更してから気が付いた。
しばらくは FreeBSD で PPPoE を終端して遊んでいたが、うっかりご家庭用のルータであるところの Cisco C891FJを買ってしまった。

とりあえずIOSのバックアップをすべく copy コマンドで自宅のサーバへ IOS をアップロードしようとした。しかし、Permission denied と怒られてアップロードに成功しなかった。

tftp (具体的には tftpd-hpa) サーバでの tftp 127.0.0.1 によるアップロード/ダウンロードはできる。何かがおかしい……

状況を整理

tftpd は 0.0.0.0:69/udp で listen している。 (systemctl start で動かない問題もあったが、それはまた別の問題)

# sudo lsof -i:69
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
in.tftpd 29780 root    4u  IPv4 xxxxxxx      0t0  UDP *:tftp
in.tftpd 29780 root    5u  IPv6 xxxxxxx      0t0  UDP *:tftp

tftpd root は /srv/tftpboot。こういう挙動をする。

# tftp 127.0.0.1
tftp> get something
Error code 2: Only absolute filenames allowed
tftp> get /something
Error code 2: Forbidden directory
tftp> get /srv/tftpboot/something
Received 7 bytes in 0.0 seconds

IOSでのエラーメッセージはこんな感じ。tftpd は verbose フラグを付けてもだんまり。

#copy flash:c800-universalk9-mz.SPA.153-3.M3.bin tftp://10.0.0.1/srv/tftpboot/ios/
Address or name of remote host [10.0.0.1]?
Destination filename [srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin]?
%Error opening tftp://10.0.0.1/srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin (Permission denied)

なるほど……?

解決方法

ホスト名とパスの間にもう1つ / を足せばよい。つまり tftp://[ホスト名]//パス とすればよい。

#copy flash:c800-universalk9-mz.SPA.153-3.M3.bin tftp://10.0.0.1//srv/tftpboot/ios/
Address or name of remote host [10.0.0.1]?
Destination filename [/srv/tftpboot/ios/c800-universalk9-mz.SPA.153-3.M3.bin]?
!!!!!!!!!!!!!!(snip)!!
68176296 bytes copied in 129.832 secs (525112 bytes/sec)

気付いたきっかけは Destination filename の確認プロンプトだが、まさかこんなところでハマるとは思わなかった。
自宅インフラはトラブルシューティングが99%


最近はご家庭用の Wi-Fi AP であるところの Meraki Go も導入したが、こちらはコンソールに入る必要がないどころかそもそもコンソールポートが存在しない。
なんならインターネットに接続しないと初期セットアップすらできないし、Web設定画面はおまけでメインの設定は iOS / Android アプリから行うハイテク仕様。これがクラウドネイティブアクセスポイントってやつか〜

必要十分に高速で、かつ最高に安定している。おすすめです。

 

家の回線をv6プラスにしたところ、外側から特定のポートへアクセスさせたいような用途、つまりこのブログを自宅サーバーから提供することができないことに変更してから気が付いた。 しばらくは FreeBSD で PPPoE を終 […]

macOS で Windows 10 のインストーラをUSBメモリに作る

Software 雑記

2020年にもなってこんなことで微妙に苦しんだので備忘録。

EFIなら何も考えなくてもいいのかもしれないが、レガシーPC向けにMBRでやろうとすると微妙にはまった。

  1. Windows 10 の ISO をダウンロードしてくる
  2. これに従う
  3. ブートローダーを書く

ざっくりコマンドの流れを書くとこんな感じ。ディスクは /dev/disk2 とします。ツール等のリンクは参照した記事ママなので、リンク切れしていたら別のところから探してきてください。

$ brew install wimlib
$ hdiutil mount Win10_1909_Japanese_x64.iso
$ sudo diskutil eraseDisk MS-DOS "WIN10" MBR /dev/disk2

$ rsync -vha --exclude=sources/install.wim /Volumes/[isoのマウント先]/ /Volumes/WIN10
$ wimlib-imagex split /Volumes/[isoのマウント先]/sources/install.wim /Volumes/WIN10/sources/install.swm 4000

$ curl https://www.oueta.com/wp-content/uploads/2018/10/syslinux-4.03.tar.gz -o syslinux-4.03.tar.gz
$ tar -zxvf syslinux-4.03.tar.gz

$ curl https://www.oueta.com/wp-content/uploads/2018/10/syslinux-mac.tar.gz -o syslinux-mac.tar.gz
$ tar -zxvf syslinux-mac.tar.gz

$ sudo dd if=syslinux-4.03/mbr/mbr.bin of=/dev/disk2 bs=440 count=1
$ sudo ./syslinux -i /dev/disk2s1

$ mkdir /Volumes/WIN10/syslinux
$ cp syslinux-4.03/com32/modules/*.c32 /Volumes/WIN10/syslinux
$ $EDITOR /Volumes/WIN10/syslinux/syslinux.cfg

$ sudo diskutil unmountDisk disk2

$ sudo fdisk -e /dev/disk2
fdisk: 1> flag 1
Partition 1 marked active.
fdisk:*1> write
Writing MBR at offset 0.
fdisk: 1> exit
$ diskutil eject disk2

2020年にもなってこんなことで微妙に苦しんだので備忘録。 EFIなら何も考えなくてもいいのかもしれないが、レガシーPC向けにMBRでやろうとすると微妙にはまった。 Windows 10 の ISO をダウンロードしてく […]

朝起きられなくても就職がしたい!

雑記

こんばんは。この記事は whywaita Advent Calendar 2019 の21日目の記事、になる予定です!!! タイトルの通りのことを数日内をめどに書きます!! 遅刻してしまい申し訳ございません……

20日目は nersonu さんによる「剣盾新ポケモンの受けループ/サイクルへの導入を考える – そぬばこ」でした。ポケモン久しくやってない。

何を書くかアジェンダ

  • 就活の話を書きます
  • 2019年新卒 (学部卒) と 2021年新卒 (修士卒) それぞれの就活メモから面白そうな文章を適当に持ってきます
    • 最強の ガクチカ を持ってバトル
    • 「ぜひ来てほしいって言われて行ったら落とされた」
    • 「うちはインターンの方が倍率高いから、インターンで落ちても本選考はぜひ受けてほしくて」
    • 「このオファー額に見込み残業って入ってますか?」「ん〜〜いい質問ですね!」
    • 「ごりごりにコードがかけなくても大丈夫です!!研究成果が思わしくなくても大丈夫です!!大切なのはxx様の熱意とやる気☆」
    • 「再来年入社でもこの時期にエントリーして大丈夫ですか?」「うちは通年採用なので大丈夫です」
    • 「飯を食っても弊社の志望度変わらないでしょ」
    • 「XXXはあなたにとって良い職場ではないかもしれません」
    • 「社会人になったら朝早く起きられるもんだよ」
      • 「執行役員としての発言としては絶対にあってはならないことであり」
  • 逆求人サービスの完全主観レビューをします
  • 面白そうな会社を紹介してください
    • あ、いや、決め方を教えてほしい気がしてきた……

こんばんは。この記事は whywaita Advent Calendar 2019 の21日目の記事、になる予定です!!! タイトルの通りのことを数日内をめどに書きます!! 遅刻してしまい申し訳ございません…… 20日目 […]

ISUCON9 予選の参加ログ (チーム: 再起動非対応)

Infrastructure Programming

こんばんは、kyontanです。

前回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは4410点でした。再起動試験までたどり着けなかった……悔しい……

チーム「再起動非対応」は同期3人 (自分 @kyontan, @hogashi, @h-otter) での参加でした。学生は2人いたはずですがエントリーをミスったので学生は1人ということになっています。

使用した言語

私はRubyが一番得意だと思っていますが、非同期処理が書きやすいとか型が着いていると嬉しい、みたいなことはあり今回もGo言語です。
でも今回はN+1潰すときの型マッピングで無駄に時間を溶かしてしまったので、Rubyの方が良かったかもしれない……つらい……

開始前の準備

Prometheus/Grafana等のサーバの設定を @h-otter にお願いしました。前回のコードを読み返しつつ、何をしたかを思い出すなどした。

時間がなくて完全に忘れてしまいましたが、せめて練習はやっておくべきでしたね…

あと、 Alibaba Cloud の UI が色々不思議な感じで良かったですね。

本番

完全に正解していますが、今回はマイクロサービス問だということに気が付いたのは開始してからだいぶ経ってからでした。

今回できたことが異常に少ない気がする。kataribeのログを眺めつつ、チームでやったことは以下のことです。比較的時系列だけどそうでない部分もあるかも。

  • 開始スコアは 2310
  • 10:30 メモリ多いな〜って思っていたら2, 3台目のインスタンスタイプを間違えていたことに気がつく。インスタンス立て直し
    • コードは既にリポジトリへ追加していたのでチームメイトはルール/コードリーディングを進める
  • 10:50ごろ: 作業開始
  • 11:30ごろ?: MySQL 5.7 を 8.0 へ (@h-otter)
    • スコア変化なし
  • 11:45 DBにインデックスを張る(@kyontan)
    • 多分間違えていて、これらにインデックスを貼りましたがあまり効いていなかったようにみえました
    • BigQuery の触りすぎでRDBのインデックスの挙動をほぼ忘れたのも敗北ポイント
config (name)
items (created_at, id)
items (id)
items (buyer_id)
items (seller_id)
shippings (transaction_evidence_id)
transaction_evidences (id)
transaction_evidences (item_id)
users (account_name)
users (id)
  • 12:20: カテゴリをオンメモリへ (@hogas, @h-otter)
    • 2510点ぐらい
  • 12:30: http2 対応, 静的ファイルをキャッシュ, アップロードされた画像を nginx で返すなど
    • スコア変化なし
  • 13:30: config もキャッシュするように
  • 14:00: 新着商品には発売中の商品だけを返すようにする (@hogas)
  • 14:45  – 16:00: GET /users/transactions.json の N+1 を潰す (@kyontan)
    • 3500点ぐらい
    • なぜか色々ハマって2時間半ぐらい溶かしていた。これは敗北ポイント
    • 多分ここらへんでMySQLがサチらなくなっていた気がする
      • CPUがサチっていたことに気が付いていたが原因が分からず (pprofをなぜ見なかったのか……)
  • 15:30: UserSimple が持つ情報は全てオンメモリでキャッシュする
    • ユーザの存在チェックだけするような部分 (権限チェック) も基本的にこれで対応できるのでそうした
    • 4210点
      • ここからスコア上がらず……
  • 16:00: 同じクエリを何度か叩いているエンドポイントがあったので潰す (@hogas, @kyontan)
  • 16:00ごろ: transactions 以外詰まってないしCPUに余裕があるので campaign (負荷レベル)を弄ったところ外部APIで 403エラー  {“error”:”IP address is not allowed”} が連発しだす
    • 主にGET /users/transactions.json での外部 shipment  サービスへのリクエストで連発
    • 外部APIへの403はアプリケーション的には500を返す仕様だったので、これが連発してベンチマーカが途中終了し完走しない
    • ここらへんで手詰まりに
  • 17:00: 明らかに不要な SELECT FOR UPDATE を削除 (4箇所+ぐらい)
    • これかこれの次辺りで4410点。これがベストスコア
  • 17:10: 外部APIを叩く部分で exponential backoff を実装 (@h-otter)
    • 変化なし / 403 が連発する
  • 17:30: 外部APIをリクエストするエンドポイントだけ2台へ分散する
    • 403 の連発は解決せず、なぜ……
  • 18:10: 最終スコア0点 (failed) で終了

色々施策を打つもスコアの変化要因が今ひとつ分からず頭が回っていなかったですね。
特に外部API が undocumented な 403 を返す (しかもメッセージは 「許可されていないIPアドレス」) というのは全然分かりませんでした。
マイクロサービス問題なら単一IPから連続でアクセスすると弾くようになっているのかな、などと思い、後半で外部APIへリクエストをするエンドポイントだけ複数台へ分散するなどしていましたが全く解決せず泥沼へ。

これベンチマーカと外部API側に問題あるのでは? みたいな気持ちになりつつ、マイクロサービス問だしちゃんとbackoffとか実行すればいけるでしょ! と思っていましたが、意図したエラーだったのかは未だに分からず……

他の方の感想を見た限りでは、ポータルサイトへ登録されていないIPからのアクセスは弾かれるみたいですが、これについてはUI上で正しく登録されていることを確認したので問題なさそうでした。
11:00 ごろにインスタンスを立ち上げ直してIPを再登録したのがポータルサイトの何らかのエッジケースを踏んだのでは? などと勝手に邪推しています。謎ですね。

そのほか、 campaign の値を変えると何が変わるのか (POST系アクセスが増える?)、みたいなことも終了後にログを分析してようやくなんとなく傾向がわかり悔しい気持ちに。

感想

終わってみれば途中重大な気付き (「外部APIのレスポンスキャッシュできるじゃん」「ユーザの嗜好に合わせて商品出し分けたら?」など) があり、見逃しの多い回でした。
bcrypt の件は全く気づいておらず。前回は初手でやった(があまり意味がなかった) pprof を今回なぜ見なかったのか……

短い時間で追い詰められている環境の中でどれだけ集中できる / 気付けるか、というのが重要になると改めて感じました。

コンテストとしては今回も設定が面白く、運営の手の込みようが分かり、かつ短期間で取り組みがいのあるとても良い問題でした。
運営の皆様、大変お疲れさまでした。

こんばんは、kyontanです。 前回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは4410点でした。再起動試験までたどり着けなかった……悔しい…… チーム「再起動非対応」は同期3人 (自分 […]

コストを掛けずにBigQueryを使い倒す会

Software

BigQueryを使い倒す会代表のkyontanです.今回は実用性低めな分野で BigQuery を1万倍有効活用する方法……ではなく延々とBigQueryがお得だという話をします.

今回ご紹介するテクニックを意味不明に活用することで,18.2GBのスキャン(10円程度)で2301億行の一時テーブルを作って集計することが可能です.便利ですね.ちなみに私は12桁の数字を突然見て混乱しました.COUNT(*)の結果が2301億ちなみに上のクエリは37.5秒で帰ってきましたが,内部では4時間52分のCPU時間を使用したようです.つまり,単純に計算すると約500スレッドが並列して走っていたようです.すごいですね……

(注: この記事は実用性皆無です.ごく一部を除き,一般の分析用途でBigQueryを使用するユーザにはなんの利もありません)

 

read more »

BigQueryを使い倒す会代表のkyontanです.今回は実用性低めな分野で BigQuery を1万倍有効活用する方法……ではなく延々とBigQueryがお得だという話をします. 今回ご紹介するテクニックを意味不明に […]