- 投稿日:2020-07-15T21:24:24+09:00
IT未経験が新卒で常駐型インフラエンジニアとして働きます
初めまして、マイクさんと申します。
本日からのんびりと投稿をしていくので、まずは自己紹介をします。
20卒男
小中高と平凡な人生を歩み、大学では建築を学びにいきました。
しかし、建築つまらん。
サークルのためだけに大学に通いました。
そして就活もサボりました。
結果入社した会社は俗に言う人売りIT。
研修でJavaとLinuxに触れ、Javaの楽しさに気づくも、配属先は常駐型インフラ。
7月にして転職を考えています。
希望はWEB・スマホアプリの自社開発。
今のままでは到底不可能なので、コツコツと勉強をします。
そしてその記録を残す。
- 投稿日:2020-07-15T20:38:29+09:00
nkfコマンド
nkfコマンド
UTF-8の文字コードで書かれたファイルをSHIFT-JISに変換したかったがやり方が分からず。
調べた結果nkfコマンドを使えば良いとの事だったのでここで使い方をまとめてみるnkfコマンド
Network Kanji Filter の略
文字コードと改行コードを変換するためのコマンド基本的な書式
$ nkf[オプション][ファイル] $ nkf[オプション]--overwrite ファイルオプション
オプション Right align -g 変換したいファイルの文字コードを出力 -j JISコードを出力 -s シフトJISコードを出力 -w16 UTFコードを出力 --overwrite ファイルを変換して上書き 例
ファイルの文字コードをチェック
$ nkf -w --overwrite hoge.htmlShift-JISに文字コード変換
nkf -s --overwrite hoge.html
簡単にですがまとめてみました。本日は以上です。
- 投稿日:2020-07-15T19:51:04+09:00
めくるめくLinuxカーネルじゃないLinux実装の世界
EDIT^3: Noah忘れてた!
EDIT^2: Cygwinは 下書き段階で削ってしまった 。。 qemuを移植したとき に互換性がイマイチだったので。。特殊fdやprocfsの充実ぶりとかを考えると "かなりLinux" と言って良いとは思うけど、
mmap
等でLinuxとWindowsの挙動が衝突する場合はWindows側の挙動を採っているので何がなんでもLinuxを目指しているというわけでも無さそう。Win32との共存のためにwchar_t
が16bitsでLLP64だし。。EDIT: Qiitaの関連リンク機能が cyanurus を見つけてきたので追記
LinuxがAPIのLingua francaとなりつつある。Linux以外のPOSIX環境への投資を正当化するのは今後も難しくなりつづけるのではないだろうか。
もちろんエスペラント語のごとく何か中立的な環境を定義してそちらに寄せるというアイデアもある。CloudABI( https://cloudabi.org/ )が正にそれで、これのWebAssembly版としてWASI( https://wasi.dev/ )が出発していることを考えるとまぁ悪くないアイデアではあるのだけど、 https://github.com/WebAssembly/WASI/issues/294 で Ed Schouten (CloudABIの開発者でFreeBSD/LLVMのコントリビュータでもある) が書いているようにCloudABIはあまり関心を引けなかった。
WSL2でWindowsがLinuxカーネルをWindowsコンポーネントの一部として取り込んでしまったことからもわかるように、 LinuxはOSの多様性を駆逐しつつあり 、経済的な合理性からこの流れを変えるのは難しいだろう。逆に、今後もシステムソフトウェアやソフトウェアプラットフォームの研究を継続するならば、実用性の面からはLinuxを意識せざるを得ないのではないだろうか。
というわけで、LinuxカーネルじゃないLinux実装特集。
カーネル/マイクロカーネル/ライブラリOS
もっともよくあるパターンはカーネルにLinuxの各種syscallを実装してLinux向けのアプリケーションを実行しようというもの。要するにLinux互換OSを作ることになる。
互換のレベルは API互換 (ソースコードをリビルドすれば実行できる) と バイナリ互換 (リビルド不要でそのまま動作する) に大別できる。いわゆる互換OSとして通常イメージされるのはWindowsのWSL1のような バイナリ互換 戦略と言える。
API互換
既存のOSに後付けでLinux機能を実装するのではなく、Linux向けのアプリケーションを動作させることを目的としたLinux互換実装。通常の意味でのバイナリ互換を実現しているのはHermiTuxのみで、OSvは中間的な実装、managarmはAPI互換実装となっている。
managarm
managarm は、64bit PCプラットフォームで動作するマイクロカーネルで、Linuxを意識したsyscall実装を提供しアプリケーションの移植性に配慮している。
- https://managarm.org/
- プロジェクト
- https://github.com/managarm/managarm/blob/4c6cfc4406c16c82865a34a9bc90226f2a9a87a2/protocols/posix/posix.bragi#L20
- syscallプロトコルの宣言 -- POSIXとファイル名に入っているが、Timerfdのサポート等Linuxを強く意識しているのがわかる
実装しているsyscallは数十に留まり、完全な互換の実現には距離があるがそれでもCoreutilsやBashのようなアプリケーションが移植されて動作しているのは興味深い。
いわゆるホビーOSの枠でPOSIXを目指すものはSerenityOS( https://github.com/SerenityOS/serenity )などいくつかあるが、明示的にLinuxを目指すのは珍しい気がする。
HermiTux
ヤドカリがペンギンを挟んでいる可愛らしいロゴが印象的なHermiTuxはLinuxバイナリ互換を目指したUnikernelで、HermitCoreの上に構築されている。このHermitCoreがヤドカリをキャラクターにしている。
- https://ssrg-vt.github.io/hermitux/
- ヤドカリとペンギン
- https://hermitcore.org/
- ヤドカリ
- https://github.com/ssrg-vt/hermitux-kernel/blob/e1a0dcaf763403ae7bf7d0c202da74f43cd1d409/arch/x86/kernel/isrs.c#L257
- syscallディスパッチの実装 -- 超でかい
switch
になっている- https://www.ssrg.ece.vt.edu/papers/vee2019.pdf
- VEE2019の論文 -- OSvと比較している
- https://github.com/danchiba/syscall-identification
- 開発者によるLinuxバイナリで使用されるsyscallを抽出するツール
同じUnikernelであるOSvとの違いとして、HermiTuxはバイナリ互換であることを推している。カーネル自体を通常ユーザーランドで使用される下位側のアドレスに配置することで、アプリケーションのメモリ配置を保ったままUnikernel化を行っている。
論文では特化カーネルの構築に言及していて、そのためのバイナリ解析ツール syscall-identification も公開されている。このツールはDyninst( https://www.dyninst.org/ )でバイナリの実行領域とsyscall命令の位置、RAXレジスタの内容を検出してそれを列挙するとしている。
OSv
OSvは部分的にせよLinuxバイナリ互換を目指したUnikernelとしては初期のもので、実行ファイルが動的executableであることを前提に直接.soをロードして実行するデザインとなっている。このデザインを取ることで、OpenJDKのような大きなバイナリも動作させている。
- http://osv.io/
- 公式
- https://www.iij-ii.co.jp/en/activities/seminars/pdf/iijlab-seminar-20141204-0.pdf
- 紹介スライド(日本語)
OSvのLinux互換は相当な完成度で、glibcのsyscall界面やif制御等をそれなりに実装している。しかし、HermiTuxの論文で触れられているように完全なバイナリ互換を提供するものではなく、単にlibcをライブラリOSに置き換えるものと言える。このため、syscallテーブルは存在せず、ダイナミックリンカが直接.soからのAPI呼び出しをOSにリンクすることになる。
個人的にはOSvのようなデザイン(syscallレベルではなくC APIレベルのバイナリ互換)は他にも出てきて良いと思うんだけど、後述のようなアプリケーションレベル実装の方が可能性はありそうかなという気もする。
Cyanurus
UNIX/Linux互換OSをゼロから作った話 で紹介されている Cyanurus はARM32用のLinux互換カーネルのようだ。
- https://github.com/redcap97/cyanurus/blob/233ef4d1f34bc7a1478f228d9aad00b04500e478/src/kernel/syscall.c#L538
- syscall table
実装範囲は非常に限定的なものの、この規模の実装でCoreutils動くのかと感動した。
syscallエミュレーション
WSL1の登場で一躍有名になったカーネルレベルでのLinuxエミュレーションは、もっとも歴史と伝統のあるLinux互換環境の実現方法と言える。
FreeBSD
WSL1の登場以前に最も著名だったのはFreeBSDのLinuxulatorではないかと思うが、最新のLinuxカーネルにはあまり良く追従していない印象がある。
- https://wiki.freebsd.org/action/show/Linuxulator
- FreeBSD wikiのページ
- https://github.com/freebsd/freebsd/blob/7dac5ce5e017abf4e5de33121ac9e1da2158ceaa/sys/amd64/linux/linux_sysent.c#L18
- syscallテーブル
syscall命令によって処理されるカーネル内のサブルーチンを差し替えることでLinuxバイナリ互換を実現している。
NetBSD
NetBSDにもLinux互換インターフェースが存在する。FreeBSDとは独立した実装となっている。
実装方法はFreeBSDと同じくsyscall tableの差し替えによって実装している。
Solaris / SmartOS
OpenSolarisのLinuxエミュレーション環境であるLxはJoyent(node.jsの開発元として知られる)が中心となって近年復活している。
- https://www.slideshare.net/bcantrill/illumos-lx
- 2014年当時の状況スライド -- 復活の経緯等興味深い内容
- https://github.com/joyent/illumos-joyent/blob/87623b574a10b8e5de5a8117193027774557f6e7/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c#L1017
- syscall table(エミュレーション側)
Lxが独特なのは完全なカーネル実装としてLinuxエミュレーションを提供するのではなく、一部のsyscallについてはユーザ側にそのまま引き戻してライブラリレベルでのエミュレーションを行う点と言える。
inotify
やfutex
のような一部機能は相当機能をカーネル側に実装しそれを利用している。Windows(WSL1)
WSL1(Windows Subsystem for Linux)はモバイル向Windowsが一時期Android互換を目指していた時期の副産物で、結局MSはモバイル市場から降りる形で放棄される形となった。
- https://raw.githubusercontent.com/ionescu007/lxss/6a3040fadff5ce43d7bfd638a4e5d7dfe8780143/WSL-BlueHat-Final.pdf
- リリース当時に公開された解析資料 -- https://github.com/ionescu007/lxss/ プロジェクトの一部
- https://github.com/MicrosoftDocs/WSL/blob/8d57a4263fd16c22e790cb8637d5f1c911995fc6/LTP_Results/15014/Syscalls.txt
- テストされているsyscallの資料
現在はVMベースで通常のLinuxカーネルを使用するWSL2が推奨されている。対して、WSL1はFreeBSDやNetBSDの実装のような完全なLinux syscallエミュレータで、これらのカーネルが実現しているsyscall tableの差し替えやABIの適合をPicoProcessと呼んでいる抽象化で実装している。
アプリケーションレベル実装
OSとしてのLinux全体ではなく、既存のLinuxアプリケーションを単発で動作させることを目的としたエミュレータ / API互換実装がいくつかある。
バイナリ互換
amd64なLinuxバイナリをWindowsで動かすというのはあまり自明なことではなく、単にAPIをエミュレーションするだけでなくスタックの使用方法を合わせるなど追加の考察が必要である種のバイナリ変換かWSL1のような特殊プロセスの導入は避けられない。この点がLinux上でWindowsバイナリを動作させるWineとの違いと言える。
Boxedwine
Boxedwine https://t.co/VyW37lx3eT めっちゃ熱い。Wine専用のLinux再実装+x86エミュで、 @abagames 先生の傑作まさしくんハイ!が256色で走るし、テネレッツァ(のベンチ)も走る。まだEmscriptenビルドにはGLが無いけど、以前作った https://t.co/yZzYJuaZIc DOOM専用WASM環境に移植したいな。3DMark! pic.twitter.com/T1jDnqF6rI
— okuoku (@okuoku) May 29, 2020BoxedwineはWine専用のx86 Linuxエミュレータで、WindowsだけではなくLinuxやemscriptenにも移植されている。特にemscripten移植は最近かなりの進捗が見られ、Web上でWindowsゲームが遊べる環境として話題になるのは時間の問題だろう。
- https://github.com/danoon2/Boxedwine
- http://www.boxedwine.org/
- 公式サイト -- 配布バイナリは少々古いのでSourceforgeの方を参照した方が良さそう
- https://github.com/danoon2/Boxedwine/blob/06ccdac707431fb16bff3ceef37d908eea91b0a2/source/kernel/syscall.cpp#L1554
- syscall table
Wineをそれなりに利用可能な形で動作させるために、オーディオやOpenGLのシリアライズ等も実装している。
qemu-user
qemuにはユーザランドバイナリのエミュレーション機能があり、ARM Linuxバイナリをx86 Linuxで動作させるといったことが可能になっている。
- https://github.com/qemu/qemu/blob/28b7d5fd59c158eeaf814f92da385f6986de5c66/linux-user/x86_64/syscall_64.tbl#L11
- syscall table
例えば、Dockerを使ってARM Linuxを動作させるといったテクニックで使用される。qemu-userは基本的にsyscallのプロトコル変換機能なので、LinuxバイナリをLinuxで動作させる方向にしか使用できない。(比較して、ここで挙げているUsercornを除く他のプロジェクトは全てLinuxアプリをWindowsで動作させるのを目指している)
Foreign Linux
Foreign Linuxは(CPUエミュレーションを伴わない)動的バイナリ変換でLinuxバイナリをWindows上で動作させることを目指すもので、残念ながらWSL1の登場以降開発が止まってしまっているようだ。
- https://github.com/wishstudio/flinux
- https://github.com/wishstudio/flinux/wiki/Difference-between-Linux-and-Windows
- Windows上でLinuxバイナリを動作させる際の課題の説明。参考になる。
- https://github.com/wishstudio/flinux/blob/a041253e8706aa5e0543bbadfc0ff7b9f819c6af/src/syscall/syscall_table_x64.h#L1
- syscall table
Usercorn
UsercornはqemuをベースとしたCPUエミュレータフレームワークであるUnicorn( https://www.unicorn-engine.org/ )上に構築されたカーネルエミュレータライブラリで、Linux以外にDarwinやMS-DOS( ! )まで実装している。
- https://github.com/lunixbochs/usercorn
- https://github.com/lunixbochs/ghostrace/blob/eccf95b50fc0983f4a35f99b568764aa05fbc86e/ghost/sys/num/linux_x86_64_sys.go
- 使用しているsyscall番号表は別ライブラリに分離されている。これら全てが実装されているわけではないようだ。
qemu-userと同じく完全なCPUエミュレーションを行うが、qemuとは違い Go でLinuxのAPIを再実装しているため、Linux以外でもLinuxバイナリを動作させることが可能になっている。
実装範囲はかなり限定的に見える。
Atratus
詳細不明。
LBW
InterixをWindows上のPOSIXレイヤとして使用していた。というわけでもう動作しない。
かんそう
LinuxはDockerなりなんなりの形でABIの資産価値が高まってしまっているため、ABIが今後大きく変化することは考えずらい。このため、Linuxある種の安定期を迎えていると考えることができ、Linuxを実装したい向きにはチャンスなのではないかと思う。
もっとも、今後自分が共通I/Fを実装することになるとしたらWASIを選ぶかな。。Linuxアプリをちゃんと動かすためには
/proc
とかioctl
なりなんなりも実装する必要があり、割と面倒なのではないだろうか。Linux自体をアプリケーションにする試みとしては 以前USB/IPのために使ってみた LKL ( https://github.com/lkl/linux ) があるが、これにはsyscall shimもあり既存のバイナリを実行するための考察もある。なのでLKLをLinux互換レイヤのベースにするのは良いかもしれない。
今さらカーネルとか実装してどうすんのというのは有るかもしれないが、プロセスのチェックポイントやマイグレーション、再最適化のような、"Linuxを改造するよりもLinux風OSを作った方が早い" 領域があるかもしれない。Linux風環境の知見を研究することで、real worldアプリケーションと研究の距離を縮められるのではないだろうか。
- 投稿日:2020-07-15T17:45:26+09:00
詳解UNIXプログラミング第三版のサンプルコードを、Macで動かす手順
Kindle本セールで半額になっていたので、詳解UNIXプログラミングという本を購入して読み始めました。
Macでサンプルコードを動かしてみようとしたところ、いろいろとつまずいたので、動作させるまでに行った手順を残しておきます。
Macのバージョン
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.5 BuildVersion: 19F101コンパイラのインストール
$ brew install gccヘッダファイルのダウンロードからmakeまで
$ curl -O http://www.apuebook.com/src.3e.tar.gz $ tar xvfz src.3e.tar.gz $ cd apue.3e/ $ make $ ls DISCLAIMER include Make.defines.freebsd intro Make.defines.linux ipc1 Make.defines.macos ipc2 Make.defines.solaris lib Make.libapue.inc printer Makefile proc README pty advio relation daemons signals datafiles sockets db standards environ stdio exercises systype.sh figlinks termios filedir threadctl fileio threadsライブラリとヘッダの配置
$ cp include/apue.h /usr/local/include/ $ cp lib/libapue.a /usr/local/lib/サンプルコードのコンパイルと、ファイルの実行
$ cd 自分で書いたファイルが置かれているディレクトリのパス # 今回は、myls.cというコードをコンパイルすると想定する # apueライブラリを含めてコンパイルする $ gcc -lapue myls.c # a.outというファイルが生成されるので、実行できることを確認する $ ./a.out
- 投稿日:2020-07-15T16:01:34+09:00
sedで特殊な記号を置換・削除
ディレクトリを変更したのでファイル内の環境変数もすべて変更したい。
test.sh../../${dir}/file1.txt ../../${dir}/file2.txt ../../${dir}/file3.txt ../../${dir}/file4.txt ../../${dir}/file5.txt↓
test.sh../file1.txt ../file2.txt ../file3.txt ../file4.txt ../file5.txtこうしたい
つまり
../${dir}/
の部分を削除したい時。成功したものが以下のコマンド
sed -i s@'../${dir}/'@@g test.sh
解説
検索するとよく出てくるsedの構文は以下の通り
(これがあとあと苦労する原因)sed 's/置換したい文字列/置換後の文字列/g' 入力ファイル名gは入力ファイル中の文字列すべてを置換という意味。
オプションを追加
sed -i 's/置換したい文字列/置換後の文字列/g' 入力ファイル名-iオプションを使うことでパイプ&catをしなくてもファイルを上書きできる。
今回は何度も失敗したので-iオプションの後に".org"を追加。
sed -i".org" 's/置換したい文字列/置換後の文字列/g' 入力ファイル名これでtest.sh.orgが作成され、バックアップが取れる。
さて、本題の特殊記号の置換だ。
とりあえず以下を実行してみた。sed -i".org" 's/../${dir}///g' test.shsed: -e expression #1, char 13: unknown option to `s'
エラーが出る。
スラッシュが問題のようだ。ならば置換したい文字列を''で囲ってみる。
sed -i".org" 's/'../${dir}/'//g' test.shsed: -e expression #1, char 7: unknown option to `s'
調べてみると、文字列中に「/(スラッシュ)」がある場合は
sedのスラッシュを違う記号に変えるとよいらしい。
今回は「@」を使用したが、「:」や「*」、「#」など、
文字列中に使用していない記号なら何でもよいらしい。sed -i".org" 's@'../${dir}/'@@g' test.sh
エラーが出てこなかったのでviで確認するとtest.sh${difile1.txt ${difile2.txt ${difile3.txt ${difile4.txt ${difile5.txtなんじゃこりゃ・・・
test.sh.org../../${dir}/file1.txt ../../${dir}/file2.txt ../../${dir}/file3.txt ../../${dir}/file4.txt ../../${dir}/file5.txtバックアップを取っておいてよかった。
mv test.sh.org test.sh
色々試すも、全部だめ
sed -i".org" "s@'../${dir}/'@@g" test.sh sed -i".org" "s@../${dir}/@@g" test.sh試行錯誤したが、どうやらsedコマンド自体のスラッシュがいらない模様。
sed -i".org" s@../${dir}/@@g test.sh文字列はちゃんと囲めってことか
sed -i".org" s@'../${dir}/'@@g test.sh成功しました。
クォーテーションの意味をちゃんと考えなくてはと思った一件でした。
- 投稿日:2020-07-15T14:09:50+09:00
Network Namespace ルーティング
はじめに
以前のNamespaceの記事の続きを記載します。
前回の投稿:Linux Network Namespace1
今更ですが、netns
って何かと思ったら、NETwork NameSpaceの頭文字でした。
再び気付いたことなども含めてQiita記載していきます。前回のルータがなくても通信ができた理由
本来であれば、IPを使用して構成されたネットワークはルータによる
パケットのバケツリレーによって成り立っている
ただ以前構成したIPは "同じネットワークのセグメントに所属" していたため
ルータがなくても通信ができていたつまり、ルータが必要になる場合というのは
セグメントが異なる相手と通信をしたいときだけ
に限るセグメントとは
一つのものを分割した一部分のこと
コードセグメントやデータセグメントなど複数あるらしいですが
今回は関係ないと思うので割愛します。IPアドレスは2つの部分に分けられている
IPv4
32bit間の2進数の整数
例) XXXXXXXX00000000XXXXXXXX00000000=> これを8bit間隔で区切ってみる
それぞれの区切られた空間をオクテットという
例) XXXXXXXX00000000XXXXXXXX00000000
=> XXXXXXXX.00000000.XXXXXXXX.00000000これを10進数に直してみる
例) XXXXXXXX.00000000.XXXXXXXX.00000000
=> XXX.X.X.0そしてこのIPアドレスはこう見えて2つの部分に分かれている
例) XXX.X.X.1のIPアドレス
前半のXXX.X.Xをネットワーク部
後半の1をホスト部というネットワーク部を
ネットワークアドレス
ホスト部をホストアドレス
とも言われるなぜ分けられているのか
セグメントを識別するためにある
=> つまりネットワークアドレスが同じIPアドレスは同じセグメントに属している
- XXX.X.X.1
- XXX.X.X.0
24bit目で分けてみると
同じXXX.X.Xというネットワークアドレスになるまた前回作成したvethの値は
XXX.X.X.X/24などというものだった
この/24という文字列こそ24bit目までがネットワークアドレス
であることを示している
- XXX.X.X.1/24
- XXX.X.X.2/24
よって上記2つは同じネットワーク内のセグメントに所属しているということになる
ルータを入れてみる
前回のns1とns2というNamespaceの間にルータを介して通信ができるように設置する
ターミナル$ sudo ip netns add ns1 $ sudo ip netns add router $ sudo ip netns add ns2再び1から作ります。
橋渡しをする “ router “ というNamespaceも加えて作成する
続いてそれぞれのNamespace同士を繋ぐvethインターフェースを作成する
3つのNamespaceがあるので計2本のインターフェースが必要になるターミナル$ sudo ip link add ns1-veth0 type veth peer name gw-veth0 $ sudo ip link add ns2-veth0 type veth peer name gw-veth1作成したvethインターフェースにそれぞれのNamespaceを所属させ、upさせる
ターミナル$ sudo ip link set ns1-veth0 netns ns1 $ sudo ip link set gw-veth0 netns routes $ sudo ip link set gw-veth0 netns router $ sudo ip link set ns2-veth0 netns ns2 $ sudo ip netns exec ns1 ip link set ns1-veth0 up $ sudo ip netns exec router ip link set gw-veth0 up $ sudo ip netns exec router ip link set gw-veth0 up $ sudo ip netns exec ns2 ip link set ns2-veth0 upIPアドレスの設定をする
ns1~router間を設定
それぞれのネットワーインターフェースに同じセグメントのIPアドレスを付与する
両者は同じ192.0.2.0/24というセグメントに設定ターミナル$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0 $ sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0ns2 とrouter 間も同じセグメントのIPアドレスを付与する
両者は同じ198.51.100.0/24というセグメントに設定ターミナル$ sudo ip netns exec router ip address add 198.51.100.254/24 dev gw-veth1 $ sudo ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0ルータ越しに通信をする
ルータを介してセグメントを超えた通信ができることを確認する
今の状態でns1からns2のIPアドレスに向けてPingを打ってみるターミナル$ sudo ip netns exec ns1 ping -c 3 198.51.100.1. -I 192.0.2.1 PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) bytes of data. ping : sendmsg : Network is unreachable ping : sendmsg : Network is unreachable ping : sendmsg : Network is unreachable —- 198.51.100.1 ping statisics — 3 packets transmitted, 0 received, 100% packet loss , time 2000ms"Network is unreachable"
ネットワークに到達できないと言われ怒られてしまう。
通信が失敗する原因はNetwork Namespaceにルーティングの設定がないため
通信をするためのリレーに必要な情報はルーティングテーブルに記載されていたので
現在のルーティングテーブルを確認してみるターミナル$ sudo ip netns exec ns1 ip route show 192.0.2.0/24 dev ns1-veth0 proto karnel scope link src 192.0.2.1ns1のルーティングテーブルにはルーティングエントリが1つある
192.0.2.0/24宛はns1-veth0というネットワークインターフェースで通信するという内容しかない
つまりパケット先の送信元である198.51.100.1はどのルーティングエントリにも一致しないので
ns1がパケットを次に誰に渡せばいいのかわからなかったのが原因
解決するにはルーティングテーブルにルーティングエントリを追加する必要がある
ターミナル$ sudo ip netns exec ns1 ip route add default via 192.0.2.254
$ ip route add
にとってルーティングエントリを追加できる
続いてns2にも同じ悩みを抱えているので同様に設定をするターミナル$ sudo ip netns exec ns2 ip route add default via 198.51.100.254改めてns1からns2にPingを打ってみる
ターミナル$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1 PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data. — 198.51.100.1 ping statistics— 3 packets transmitted , 0 received , 100% packet loss, time 2000mserrorは無くなったが、送ったpingに対して返答が戻ってきていない
sysctlというカーネルのパラメータを設置するためのコマンドを打たないといけないらしい
このコマンドによってカーネルのnet.ipv4.ip_forwardを1にする、パラメータを1にして有効にした
Linuxはこのパラメータが有効になっていないとルータとして起動しない
らしいターミナル$ sudo ip netns exec router sysctl net.ipv4.ip_forward=1 net.ipv4.ip_forward=1 $ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1 PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data. 64 bytes from 198.51.100.1 : icmp_seq=1 ttl=63 time=0022ms 64 bytes from 198.51.100.1 : icmp_seq=2 ttl=63 time=0044ms 64 bytes from 198.51.100.1 : icmp_seq=3 ttl=63 time=0066ms —198.51.100.1 ping statistics —終わりに
ns1とns2の間をルータを介して通信が通りました。
ほとんど書籍から引用したというのもあり,,まだまだ致死不足です,,
少しずつ単語などを調べならが学んでいこうと思います。
- 投稿日:2020-07-15T10:57:20+09:00
LinuxからPPTPを用いてKUINS-III(京大VPN)に接続する
京都大学では, 学内限定のwebサービスをKUINS-II, KUINS-IIIと呼ばれるVPNサービスを通じて提供している.
このVPNサービス,WindowsとmacOSには対応しているものの,公式にはLinuxに対応していない.はい,質問したのは私です...
しかし,何事にも抜け穴はあるものだ.この記事を見て驚愕した,どうやらOpenVpnを使用するとLinuxでもKUINS-IIに接続できるようだ.
ということは,PPTPならKUINS−IIIに接続できるんじゃないか?と思い立ち,この記事を書いてみた.(追記) PPTPによるサービスは2020年12月に終了するらしい
KUINS-II, KUINS-IIIの違い
接続方法について説明する前にKUINS-IIとKUINS-IIIの違いについてはっきりしておきたい.
KUINS-IIは全学向けに提供されるVPNサービスで,論文閲覧や専攻webページの内部情報を閲覧するぐらいであればこちらで事足りる.
一方,KUINS-IIIは学内をキャンパス地域別にホストIPを持つVPNサービスであり,所属する研究室のvlanに接続することで研究室内のPCやサーバーを操作することができる.
いずれのサービスも,公式にはIKEv2による接続を推奨している一方で,IKEv2に対応していないクライアント向けにOpenVpnやPPTPによる提供も行われている.(LinuxでもパッケージをインストールすることでIKEv2を使用できるが,どう頑張ってもKUINS-IIIには接続できなかった.)
PPTPはKUINS-II, IIIいずれにも対応しているが,OpenVpnはKUINS-IIのみの対応となっているため,今回はPPTPを用いる.接続の手順
OSはUbuntu 20.04 LTS Desktopを用いた.多分他のLinuxでも接続できると思う.
1. 設定からネットワークマネージャを開く.
2. VPNの項目で+ボタンを押して,PPTPの新しい接続プロファイルを作成すると,このような画面が表示される.
- ゲートウェイを一覧から選択する.
- ユーザー名はECS-ID@vlan番号.
以上で接続の準備は完了で,あとはVPNのトグルをオンにするとVPNに接続できる.
- 投稿日:2020-07-15T09:34:33+09:00
Azure Automation Update Management ってなんやねん
Microsoft のクラウドービス Azure のサービスの1つである Azure Automation Update Management について整理したいと思います。
Azure Automation Update Management とは
Azure Automation Update Management は Azure Log Analytics と Azure Automation を組み合わせたサービスらしく
1. Azure Log Analytics で対象のサーバーの状態監視
2. Azure Automation でアップデートのタイミングを管理
といった感じみたいここで注目ポイントは
- クラウドサービスを使用するので組織ネットワーク外への通信が必要
- アップデート自体は WSUS や Windows Update の力を借りること
- Linux サーバーも守備範囲にはいっていること
です。
ネックになりそうなこと
もちろん Azure 上の VM との連携はできるので、オンプレミスの話に焦点を当てると、
サーバー自体は組織外との通信をしないことが前提のものがほとんどのなか、Azure Automation Update Management はご法度ともいえるそれをする必要があるのがネックだといえるかもしれない。
しかし、そこは対応策が用意されているのでそれで解決できれば便利なサービスだと思われる。対応策① プロキシサーバー
そもそもサーバーが組織の外と通信を行うときに使う常套手段で、これがそのまま使えるならこれに越したことはない。
一方で、社内のファイルサーバーなどで、外との通信を普段からしていないサーバーに関しては Log Analytics ゲートウェイ を用意することで一度そこを経由して Azure と通信をすることができる。対応策② 閉域網
Azure との通信のセキュリティをあげる手段として、Express Route を使用した閉域網の接続方法がある。
これを使えば Azure Automation Update Management でもセキュアな方法で通信をすることができる。
Express Route を使用した通信方法にはPrivate Peering と Microsoft Peering があり、これを使うと通信がインターネットに出ることを防ぐことが可能。
この二つの機能については別記事でまとめる予定。
しかし、Azure Automation Update Management はパブリック IP アドレスを持つサービスなので Private Link などのサービスと組み合わせないとPrivate Peering は使用できず、Azure Automation の Private Link はプレビューなので実用段階ではない。
一方、Microfoft Peering の方はパブリック IP でそのまま使用可能であるので今すぐ使いたい場合はこっちを選択することになるだろう。まとめ
以上が駆け出しのインフラエンジニア的立場から見た Azure Automation Update Management であった。
ネガティブな面をたくさん書いてしまったが、オンプレミスや Linux のサーバーを対象にできるのは相当な強みだといえるだろう。
- 投稿日:2020-07-15T03:10:30+09:00
for文を使って何度もsedコマンドを実行する方法
概要
Linuxで、sedコマンドを使って行内の色々な箇所に文字を挿入する、ということをfor文を使って行う方法です。
他のコマンドにも応用できるかと思います。(もっとシンプルな方法がありそうですが...)
insert.sh(シェルスクリプトではなく、コマンドライン上にコピペでも実行できます)#!/bin/bash cat sequence.txt > sequence2.txt for int in 15 12 9 6 3 do echo "$(sed -E "s/(^.{$int})/\1-/g" sequence2.txt)" > sequence2.txt done ## 3文字おきに "-" を挿入する ## sequence.txt -> ("-"挿入) -> sequence2.txt実行結果$ cat sequence.txt xxxx5xxx10xxx15 xx3xx6xx9x12x15 xxxxAxxxxAxxxxA xxAxxAxxAxxAxxA $ ./insert.sh ; cat sequence2.txt xxx-x5x-xx1-0xx-x15- xx3-xx6-xx9-x12-x15- xxx-xAx-xxx-Axx-xxA- xxA-xxA-xxA-xxA-xxA-解説
- 同じファイル名を利用して
sed -E "s/(^.{$int})/\1-/g" sequence2.txt > sequence2.txt
のようにすると普通、sequence2.txtの中身は空っぽになってしまいますが
echo "$(コマンド)" > sequence2.txt
とすることで、sequence2.txtが空っぽで出力されることなく、うまく上書きすることができます。
(そもそも空のデータが出力されるのは、> sequence2.txt
実行時、sed
より先にまずsequence2.txtの中身を空にするという操作が行われているため(その結果、空のデータに対してsed
している)。echo "$(コマンド)"
の中身は> sequence2.txt
よりも先に実行されるので、これによりsequence2.txtがうまく上書きされます)
sed
コマンドの中でfor文の変数$int
を利用できるようにするためには""
を利用する必要があります(''
を使うと変数ではなく、ただの文字列として認識されるため)なお、同名ファイルへの出力に関しては他にもいろいろな方法があるようなので、興味あれば以下のリンクを参照ください。(1つ目のリンク)
- 投稿日:2020-07-15T02:29:31+09:00
ROS勉強#1
ubuntuのバージョンを20.04にしたのでrosをインストールし直した
感想は沼of沼だった
まず、以前使っていたros-melodicは20.04LTSでは動作しないみたい
20.04LTSではnoeticという新たなバージョンが発表されてたのでそれをインストールしたとその前に
melodic関連の依存関係が邪魔してるっぽかったのでros関連を全消去した
sudo apt-get remove ros-* sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgradeこれでまっさらになったはず(あとでわかるがなってなかった)
いよいよnoeticさんを迎える
まずnoetic repoを加える。
echo "deb http://packages.ros.org/ros/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros-focal.list次になんとか鍵を登録
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654いつものやって、
sudo apt updateいよいよインストール
sudo apt install ros-noetic-desktop-fullふつうにdesktop-fullにした。他にもいろいろあるみたい。
参考記事
https://varhowto.com/install-ros-noetic-ubuntu-20-04/rosdepのインストール
これも沼だったなあ
sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstool build-essential sudo rosdep init rosdep updateここで、以前に残ってたrosdepを消去しなきゃいけなかった。
参考記事
http://wiki.ros.org/noetic/Installation/Sourcerosinstallのインストール
どこにも書いてなかったわ、、
sudo apt-get install python3-rosinstallあとは公式wiki通り
$ mkdir ~/ros_catkin_ws $ cd ~/ros_catkin_ws$ rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall $ mkdir ./src $ vcs import --input noetic-desktop.rosinstall ./src$ rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release一番最後がものすごい時間かかった。melodicとかなり違うので不安。
- 投稿日:2020-07-15T02:29:31+09:00
ROS勉強#1ubuntu20.04へのros-noeticのインストール
ubuntuのバージョンを20.04にしたのでrosをインストールし直した
感想は沼of沼だった
まず、以前使っていたros-melodicは20.04LTSでは動作しないみたい
20.04LTSではnoeticという新たなバージョンが発表されてたのでそれをインストールしたとその前に
melodic関連の依存関係が邪魔してるっぽかったのでros関連を全消去した
sudo apt-get remove ros-* sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgradeこれでまっさらになったはず(あとでわかるがなってなかった)
いよいよnoeticさんを迎える
まずnoetic repoを加える。
echo "deb http://packages.ros.org/ros/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros-focal.list次になんとか鍵を登録
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654いつものやって、
sudo apt updateいよいよインストール
sudo apt install ros-noetic-desktop-fullふつうにdesktop-fullにした。他にもいろいろあるみたい。
参考記事
https://varhowto.com/install-ros-noetic-ubuntu-20-04/rosdepのインストール
これも沼だったなあ
sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstool build-essential sudo rosdep init rosdep updateここで、以前に残ってたrosdepを消去しなきゃいけなかった。
参考記事
http://wiki.ros.org/noetic/Installation/Sourcerosinstallのインストール
どこにも書いてなかったわ、、
sudo apt-get install python3-rosinstallあとは公式wiki通り
$ mkdir ~/ros_catkin_ws $ cd ~/ros_catkin_ws$ rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall $ mkdir ./src $ vcs import --input noetic-desktop.rosinstall ./src$ rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release一番最後がものすごい時間かかった。melodicとかなり違うので不安。