20200715のLinuxに関する記事は11件です。

IT未経験が新卒で常駐型インフラエンジニアとして働きます

初めまして、マイクさんと申します。

本日からのんびりと投稿をしていくので、まずは自己紹介をします。

20卒男

小中高と平凡な人生を歩み、大学では建築を学びにいきました。

しかし、建築つまらん。

サークルのためだけに大学に通いました。

そして就活もサボりました。

結果入社した会社は俗に言う人売りIT。

研修でJavaとLinuxに触れ、Javaの楽しさに気づくも、配属先は常駐型インフラ。

7月にして転職を考えています。

希望はWEB・スマホアプリの自社開発。

今のままでは到底不可能なので、コツコツと勉強をします。

そしてその記録を残す。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.html

Shift-JISに文字コード変換

nkf -s --overwrite hoge.html

簡単にですがまとめてみました。本日は以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

めくるめく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実装を提供しアプリケーションの移植性に配慮している。

実装しているsyscallは数十に留まり、完全な互換の実現には距離があるがそれでもCoreutilsやBashのようなアプリケーションが移植されて動作しているのは興味深い。

いわゆるホビーOSの枠でPOSIXを目指すものはSerenityOS( https://github.com/SerenityOS/serenity )などいくつかあるが、明示的にLinuxを目指すのは珍しい気がする。

HermiTux

ヤドカリがペンギンを挟んでいる可愛らしいロゴが印象的なHermiTuxはLinuxバイナリ互換を目指したUnikernelで、HermitCoreの上に構築されている。このHermitCoreがヤドカリをキャラクターにしている。

同じUnikernelであるOSvとの違いとして、HermiTuxはバイナリ互換であることを推している。カーネル自体を通常ユーザーランドで使用される下位側のアドレスに配置することで、アプリケーションのメモリ配置を保ったままUnikernel化を行っている。

論文では特化カーネルの構築に言及していて、そのためのバイナリ解析ツール syscall-identification も公開されている。このツールはDyninst( https://www.dyninst.org/ )でバイナリの実行領域とsyscall命令の位置、RAXレジスタの内容を検出してそれを列挙するとしている。

OSv

OSvは部分的にせよLinuxバイナリ互換を目指したUnikernelとしては初期のもので、実行ファイルが動的executableであることを前提に直接.soをロードして実行するデザインとなっている。このデザインを取ることで、OpenJDKのような大きなバイナリも動作させている。

OSvのLinux互換は相当な完成度で、glibcのsyscall界面やif制御等をそれなりに実装している。しかし、HermiTuxの論文で触れられているように完全なバイナリ互換を提供するものではなく、単にlibcをライブラリOSに置き換えるものと言える。このため、syscallテーブルは存在せず、ダイナミックリンカが直接.soからのAPI呼び出しをOSにリンクすることになる。

個人的にはOSvのようなデザイン(syscallレベルではなくC APIレベルのバイナリ互換)は他にも出てきて良いと思うんだけど、後述のようなアプリケーションレベル実装の方が可能性はありそうかなという気もする。

Cyanurus

UNIX/Linux互換OSをゼロから作った話 で紹介されている Cyanurus はARM32用のLinux互換カーネルのようだ。

実装範囲は非常に限定的なものの、この規模の実装でCoreutils動くのかと感動した。

syscallエミュレーション

WSL1の登場で一躍有名になったカーネルレベルでのLinuxエミュレーションは、もっとも歴史と伝統のあるLinux互換環境の実現方法と言える。

FreeBSD

WSL1の登場以前に最も著名だったのはFreeBSDのLinuxulatorではないかと思うが、最新のLinuxカーネルにはあまり良く追従していない印象がある。

syscall命令によって処理されるカーネル内のサブルーチンを差し替えることでLinuxバイナリ互換を実現している。

NetBSD

NetBSDにもLinux互換インターフェースが存在する。FreeBSDとは独立した実装となっている。

実装方法はFreeBSDと同じくsyscall tableの差し替えによって実装している。

Solaris / SmartOS

OpenSolarisのLinuxエミュレーション環境であるLxはJoyent(node.jsの開発元として知られる)が中心となって近年復活している。

Lxが独特なのは完全なカーネル実装としてLinuxエミュレーションを提供するのではなく、一部のsyscallについてはユーザ側にそのまま引き戻してライブラリレベルでのエミュレーションを行う点と言える。 inotifyfutex のような一部機能は相当機能をカーネル側に実装しそれを利用している。

Windows(WSL1)

WSL1(Windows Subsystem for Linux)はモバイル向Windowsが一時期Android互換を目指していた時期の副産物で、結局MSはモバイル市場から降りる形で放棄される形となった。

現在は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はWine専用のx86 Linuxエミュレータで、WindowsだけではなくLinuxやemscriptenにも移植されている。特にemscripten移植は最近かなりの進捗が見られ、Web上でWindowsゲームが遊べる環境として話題になるのは時間の問題だろう。

Wineをそれなりに利用可能な形で動作させるために、オーディオやOpenGLのシリアライズ等も実装している。

qemu-user

qemuにはユーザランドバイナリのエミュレーション機能があり、ARM Linuxバイナリをx86 Linuxで動作させるといったことが可能になっている。

例えば、Dockerを使ってARM Linuxを動作させるといったテクニックで使用される。qemu-userは基本的にsyscallのプロトコル変換機能なので、LinuxバイナリをLinuxで動作させる方向にしか使用できない。(比較して、ここで挙げているUsercornを除く他のプロジェクトは全てLinuxアプリをWindowsで動作させるのを目指している)

Foreign Linux

Foreign Linuxは(CPUエミュレーションを伴わない)動的バイナリ変換でLinuxバイナリをWindows上で動作させることを目指すもので、残念ながらWSL1の登場以降開発が止まってしまっているようだ。

Usercorn

UsercornはqemuをベースとしたCPUエミュレータフレームワークであるUnicorn( https://www.unicorn-engine.org/ )上に構築されたカーネルエミュレータライブラリで、Linux以外にDarwinやMS-DOS( ! )まで実装している。

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アプリケーションと研究の距離を縮められるのではないだろうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

詳解UNIXプログラミング第三版のサンプルコードを、Macで動かす手順

Kindle本セールで半額になっていたので、詳解UNIXプログラミングという本を購入して読み始めました。

51L6CwNG11L._SY346_.jpg

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.sh

sed: -e expression #1, char 13: unknown option to `s'

エラーが出る。
スラッシュが問題のようだ。

ならば置換したい文字列を''で囲ってみる。

sed -i".org" 's/'../${dir}/'//g' test.sh

sed: -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

成功しました。


クォーテーションの意味をちゃんと考えなくてはと思った一件でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 up

IPアドレスの設定をする

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-veth0

ns2 と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

図のような設定ができる
netns3.png

ルータ越しに通信をする

ルータを介してセグメントを超えた通信ができることを確認する
今の状態で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.1

ns1のルーティングテーブルにはルーティングエントリが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 2000ms

errorは無くなったが、送った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の間をルータを介して通信が通りました。
ほとんど書籍から引用したというのもあり,,まだまだ致死不足です,,
少しずつ単語などを調べならが学んでいこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の新しい接続プロファイルを作成すると,このような画面が表示される.
  Screenshot from 2020-07-15 10-50-16.png

  • ゲートウェイを一覧から選択する.
  • ユーザー名はECS-ID@vlan番号.

以上で接続の準備は完了で,あとはVPNのトグルをオンにするとVPNに接続できる.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 のサーバーを対象にできるのは相当な強みだといえるだろう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-

解説

  1. 同じファイル名を利用して
     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がうまく上書きされます)


  2. sedコマンドの中でfor文の変数$intを利用できるようにするためには""を利用する必要があります(''を使うと変数ではなく、ただの文字列として認識されるため)

なお、同名ファイルへの出力に関しては他にもいろいろな方法があるようなので、興味あれば以下のリンクを参照ください。(1つ目のリンク)

  1. に関して
    bashでファイルを処理して結果を同じファイルに上書きする
    同じ名前のファイルにリダイレクト

  2. に関して
    【bash】 「\"」、「\'」、「`」の違い - どちらかというとごはん派
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/Source

rosinstallのインストール

どこにも書いてなかったわ、、

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とかなり違うので不安。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/Source

rosinstallのインストール

どこにも書いてなかったわ、、

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とかなり違うので不安。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む