リモートデスクトップ(RDP)、VNCで外部から安全に接続 sshポートフォワーディング
- 男のロマン 外出先から自PCの操作
- SSHポートフォワーディングの概要と目的
- SSHポートフォワーディングの構成と設定
- SSHサーバの設定
- SSHクライアントの設定(Teratermの設定)
- 余談 チャットツール
男のロマン 外出先から自PCの操作
PCをある程度操作できるようになり、あー便利な道具だなぁ、と思い出す頃に誰しも考えるのがPCのリモート操作ではないだろうか。
最初は漠然と誰かのPCを操作したり、外部から自分の端末を操作することを考えるだろう。
全く知らない誰かの端末を操作することは法的にも技術的にも困難なのだが、外部から自宅のPCや、全く異なる場所に配置されたサーバなどを操作することで、不可能であった仕事を可能にしたり、移動にかかるコストを完全に無くすことができる。
そして何より「オレITやってるー、うわぁいw」と自己陶酔したい。
そう、そこには男のロマンがある。
ネットワークを介して自宅のPCを操作して、仕事中にあれをしたりこれをしたりグフグフするわけである。
しかし、その男のロマンのためにセキリュティを犠牲にすることは以ての外である!!
…いやすまない、少し熱くなりすぎたようだ。
仕事中に遊ぶなど品行方正な我が社では許されることではないのだが、やってしまったものは仕方がない。
ボク以外のそういったユーモアのある諸君のためにも、安全に快適にリモート操作ができるように、その方法を提示しておきたい。
SSHポートフォワーディングの概要と目的
下記リンクページから抜粋させていただく。
sshポート転送(フォワーディング)とは他マシンにあるIPポートを、自マシンのポートとして扱うための技のひとつ
上記リンクもすごくわかりやすいのだが、あえて初学者向けに図に描いてみると下記のようになる。
SSHポートフォワーディングのイメージ
よく聞いて欲しい、この図はボクがワードを使って2時間くらいかけて描いた。
すごいと褒めてくれ。
つまり、sshポートフォワーディングとは、ローカルのポートを別のポートに転送すること。 図にあるように、サーバ側のLAN内の別のサーバのポートに転送することも可能なのだ。
目的は、インターネットを介した安全な通信
SSHサーバを立てる際、公開鍵方式で通信するのが一般的であり、またそうすべきである。
SSHの設定や運用については他にたくさん資料があるのでそちらを検索して調べてみよう。
SSH通信では、通信の際にやりとりするデータが暗号化されているので、途中でデータを改ざんされたり、不正に見られることはほぼ無い。
SSHポートフォワーディングでは、その通信方法、通信経路を利用して他のプロトコルを安全に使用することができる。
RDPやVNCは、デフォルトでは暗号化などのセキュリティ対策が多分全く施されていないので、インターネットを介した利用は絶対に避けるべきである。
したがってほとんどのsshポートフォワーディングの目的は、単純なポート転送でなく、安全な通信、安全なRDPやVNC通信、その他の通信プロトコルを実現することである、と言ってもいいだろう。
外部から自宅のサーバへアクセスする方法について
自宅に回線を引く場合、プロバイダから提供されるルータを使用することになると思う。
多分、普通にLANをつないだりWifiアクセスポイントとして使っている場合、デフォルトゲートウェイは[192.168.0.1]に設定されているはずだ。
その場合は、ブラウザのアドレスバーに[192.168.0.1]と入力すれば、デフォルトゲートウェイであるルータにアクセスできる。
ルータのIPアドレスが上記と違うときは、自端末のネットワーク設定を確認してみよう。「デフォルトゲートウェイ」あるいは「ゲートウェイ」に設定されているIPアドレスがそれに当たる。
ブラウザからルータに接続する際、ユーザ名とパスワードの入力を求められると思うが、機器によってデフォルトのユーザ名とパスワードが異なるため、説明書を読むか、プロバイダに問い合わせして確認しよう。
プロバイダによってルータは様々だと思うが、ボクの家のルータはポート転送機能が付いている。
ルータのポート転送のイメージ
よく聞いて欲しい、この図はボクの適当な手描きの絵を、知人がイラストレータで一生懸命描いた。
すごい綺麗に描けてるし、その完成度にビックリ。サーバの図とか見て。やばい。
どんだけー。
プロバイダから提供される各ルータには、そのプロバイダからグローバルIPアドレスが割り振られる。
このグローバルIPアドレスは、上記で説明したように、LAN内の端末のブラウザから確認したりすることができる。
外部からそのグローバルIPアドレスのポート22番にアクセスすると、普通はルータのファイアウォールに接続を拒否される。
そこでルータに実装されたポート転送機能を使用してLAN内の特定のポートを、例えば192.168.0.100の22番とか、192.168.0.111の3000番という風に、任意に設定したポートに転送する。
この機能を利用することによって、外部から自宅へアクセスできるのだが、例えば単純にRDP用3389番ポートを、普通にローカルのリモート接続可能なWindowsへ転送することは、あまりに危険であることは想像に難くないだろう。
そこで、sshポートフォワーディングを利用するわけだ。
したがって、上記の図のように、63000を3389へ転送する設定などはしないようにしよう。
更に突っ込んだ注意点
もうひとつ大きな注意点として、sshポートフォワーディングをする際、クライアント端末にファイアウォール設定などが適切に設定されておらず、ローカルネットワーク内のどんな端末からも接続可能な場合だ。
例えばその設定で公共の場で使用し、そのクライアント端末から自宅へ接続しているとき、そのクライアント端末を踏み台にしてアクセスされることが考えられる。
ちゃんとファイアウォールの設定や使用する場所に配慮して利用するようにしよう。
SSHポートフォワーディングの構成と設定
クライアント-サーバ間の構成(例)
まず、sshポートフォワーディングをするためには、sshサーバが必要になる。
またsshサーバと別にリモートデスクトップができるWindowsや、その他のVNCサーバも必要だ。
今回は上記にある図を元に設定するとする。
また、sshクライアントのTeratermの設定と、sshサーバのポートフォワーディングに関する設定を主として説明し、その他のRDPサーバ、VNCサーバの設定の詳細は説明しない。
LinuxのVNCデーモンであるtightvncなどの設定は、いずれ別記事でまとめたい。
クライアント端末(例)
項目 | 値 |
---|---|
OS | Windows 10 |
sshクライアント | Teraterm |
RDPクライアント | 標準リモートデスクトップクライアント |
vncクライアント | RealVNC |
ルータ(例)
項目 | 値 |
---|---|
グローバルIPアドレス | 123.234.111.100 |
ローカルIPアドレス | 192.168.0.1 |
ポート転送 | ポート22 → 192.168.0.100のポート22 |
sshサーバ(sshポートフォワーディングサーバ)(例)
項目 | 値 |
---|---|
OS | CentOS 7 |
IPアドレス | 192.168.0.100 |
sshデーモン | openssh[:22] (ココがルータのポート転送の転送先) |
vncデーモン | tightvnc or x11vnc[:5900] |
Windowサーバ(例)
項目 | 値 |
---|---|
OS | Window 10 |
IPアドレス | 192.168.0.10 |
RDPサービス | リモートデスクトップ[:3389] |
vncデーモン | RealVNC[:5900] |
Linuxサーバ(例)
項目 | 値 |
---|---|
OS | Ubuntu 14.04 |
IPアドレス | 192.168.0.50 |
sshデーモン | openssh[:2222] |
vncデーモン | tightvnc or x11vnc[:5900] |
SSHサーバの設定
SSHサーバの設定は特に無い。
/etc/ssh/sshd_configをいじる必要もない。
普通にsshサーバとして稼働させておけば良いだけだ。
sshサーバの設定は、OSとマシンは違うのだが、ボクの過去記事を参考にしてもらいたい。
が、下記の記事は実際、余計な説明にかなり多くを割いているので、他の人が書いたページを参考にした方がいいと思う。
と、言いつつ一応リンクを貼っておく。
Raspberry Piでサーバ構築①(ssh編 公開鍵未設定)
Raspberry Piでサーバ構築②(Samba編)
Raspberry Piでサーバ構築③(ssh公開鍵編)
新しく発売されたRasbperry Pi 3を買って、sshポートフォワーディングサーバにしてもいいなと思った今日このごろ。
SSHクライアントの設定(Teratermの設定)
まず上記のSSHポートフォワーディングの構成と設定の設定値に合わせて、RDPを例にとって手順を簡単に説明すると、
- Teratermで事前にクライアント端末のlocalhost:3389を、サーバ側の192.168.0.10:3389へ転送するよう、ルールを設定しておく。
- Teratermで123.234.111.100:22のsshサーバに接続する。
- Teratermで接続したまま、RDPクライアントを起動する。
- 転送ルールにしたがって、RDPクライアントよりlocalhost:3389にアクセスする。
最重要なのは、1.Teratermで事前に転送ルールを設定の部分だ。
Teratermでポートフォワーディングの設定
ここがsshポートフォワーディングで一番肝心な部分となる。
この説明でもRDPを例にとって手順を説明する。
Teraterm [設定]メニュー
sshポート転送画面
[追加]ボタンをクリック
sshポート転送設定画面
この画像の[ローカルのポート]がクライアントマシンのポート番号を指す。
そして、[リモート側ホスト]の方で、sshで接続しているサーバ側の、サーバを含むLAN内のいずれかのIPアドレスとポート番号を指定する。
設定が終わったら[OK]をクリック
設定を保存
上記の設定が終わったら、[設定]メニューから[設定の保存]をしておくと、次回から毎回設定する必要がなくなる。
リモートデスクトップで接続
Teratermで普通にサーバに接続した状態にしておく。
接続したままの状態で、この画像のようにリモートデスクトップでlocalhostの3389へアクセスすれば、サーバ側のリモートデスクトップサーバにアクセスできるはず。
もちろん切断する場合は、RDPを切断してからsshを切断するようにしよう。
その他のVNCや他のsshサーバへの接続も、この設定と同様に設定していけばよい。 これにて、sshポートフォワーディングの設定方法の説明はサラッと終わらせてもらう。
余談 チャットツール
皆さんは、普段どういった方法で友人と連絡を取り合うのだろうか。
ボクは普段はもちろんLINEを使用しているのだが、どうしても好きになれない。
スタンプの機能も今ではほとんど使わなくなった。
あのさぁ、できればみんなSkypeかGoogle hangouts使おうよー。
SkypeかGoogle hangouts布教していこうよー。
というわけで、Skypeかhangouts、どちらがいいかコメントお待ちしている。
Raspberry PiのRAM化(SDカード延命対策)
近況2016-03-06
新入社員として働き出して2ヶ月が経つ。
仕事の内容も興味のある分野を多く取り扱っているし、話が合うあるいは話が面白い上司や同僚がいて、非常に楽しい。
こんなに楽しいならもっと早くに転職しておけば良かったと本当に思った。
まぁトラブルが多く続くとコンニャロと思うこともあるのだが、それでも定時には帰れるし、しなければならない作業も前倒しでできるくらいの余裕もある。
文句なしです。
今後はもう少し技術的にも難しいことを任されることになるし、逆に面倒なだけの作業や、突発的な事に関しても動かなければならなくなると思うので、できる限り上司の足を引っ張らないように進めていきたい。
加えて、今までボクが働いてきた職場には全く女性がいなかった。
現在の職場ではほぼ半数が女性である。
素晴らしいのである。
眼前を 過ぎる女性の 美しさ 香る艶美と 春の訪れ
セクハラ逮捕だけは勘弁してください。
Raspberry PiのSDカード延命
前回まで書いていた記事の番外編的な位置付けで書こうと思う。
tokixy56.hatenablog.com
これの①〜③ね。
SDカードはフラッシュメモリの一種で、書き込み回数に上限がある。
おそらく同じ箇所に対して数万回くらいの書き込みは可能なのだと思うが、例えばRPiを何かのサーバ代わりに使用するとしたら、結構早い段階で寿命が来てしまう可能性がある。
特に、サーバとして使用する場合には、サーバデーモンがアクセスログやデバッグログ、その他のシステムログをずっと書き込んでいる。
前回までに紹介した方法では、例えば8GBあるSDカードの領域のうち、前方の1GBしか利用しないわけだから、全体を使うのと比べて同じ領域にたくさん書き込みをしてしまうだろう。
そこで、できる限りSDカードへの書き込みを抑えるため、RAM上にファイルを配置するという方法をとって、不要な書き込みを防いでSDカードの寿命を伸ばしてみよう。
本記事では、下記のページを抜粋させて頂いてる。
www.pc-links.com
ほぼ丸写しサーセン。
fstabでマウントする場所を指定
/etc/fstabファイルで、各ディレクトリをマウントする場所を決める。
tmpfsにマウントすることによってRAM化することができるようだ。
Linuxにおけるtmpfsの技術的な仕様についてはwikipediaを参照しよう。
/etc/fstabの修正
# tmpファイルはRAMディスク上に保管する(追記) tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0 # /var/logディレクトリはRAMディスク上に配置する tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0
rsyslogの不要なログを停止
上記のtmpfsに加え、不要なログを残さないようにすることで、SDカードへのアクセスを減らす。
www.atmarkit.co.jp
rsyslogってよくわかってなかったけど、次世代のログシステム、ログデーモンなんですって。 reliableシスログってことだな。
/etc/rsyslog.confの修正
[root@ms03 ~]# vi /etc/rsyslog.conf ... ############### #### RULES #### ############### ... #下記をコメントアウト # daemon.* -/var/log/daemon.log # kern.* -/var/log/kern.log # lpr.* -/var/log/lpr.log # mail.* -/var/log/mail.log # user.* -/var/log/user.log ... #下記をコメントアウト # mail.info -/var/log/mail.info # mail.warn -/var/log/mail.warn # mail.err /var/log/mail.err ... #下記をコメントアウト # news.crit /var/log/news/news.crit # news.err /var/log/news/news.err # news.notice -/var/log/news/news.notice ... #下記をコメントアウト # *.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug
ボクの環境ではこれで特に問題なく動作している。 あとは実際ずっと稼働させてどれくらい持つのかが問題だけど、そこまでRPiを酷使する予定は今のところない。
余談 新しくなるコマンドたち
先日CentOS7をインストールしてサーバを構築したのだが、その際ネットワーク設定でハマりかけた。
まずipconfigがない。
ここでいきなり躓いたもんだから、ヤッパヤメタしようかなと思ったけど、仕事で使う予定だったのでどっちみち逃げることができないと悟り、頑張って設定した。
ipconfigがレガシーなツールになるなんて夢にも思わなかったなぁ。
あとはSELinuxやfirewalldも設定することになったし、散々な目にあった。
しかし、こういう新しい技術もたくさん情報があることがわかったし、しっかり理解すればかなり確実にセキュアなシステムを構築できる。
仕事上Windowsを利用することが多く、セキュリティソフトもファイアウォールも多額の費用を費やして利用しているのだが、今後費用の面などでこういうOSも使うことになると思う。
すべてを置き換えることはできないとしても、使える使えないでSEとしての柔軟さが大きく変わってくると思うので、しっかり勉強していこうと思う。
MINIBIAN 最小構成のRASPBIAN (Raspberry Pi) ③
- 全然覚えられないIT業界用語シリーズ
- 続 Raspberry Piで遊ぶ
- GPartedでSDカードの操作
- MINIBIANディスクイメージをLinuxBean上にマウント
- ここで一度起動確認
- SDカードからディスクイメージを書き出す
- 今後
全然覚えられないIT業界用語シリーズ
IT業界の専門用語が全然覚えられない。
「IT」からいきなり略称だ。
これはInformation Technorogyの略だけれども、このように頭文字を並べた略称や覚えにくい用語がIT業界には大量に存在する。
しかもかぶっているものもあったりする。
このIT業界の用語が僕は好きになれないというか覚えられないんですすみません。
とりあえず最近覚えた、覚えたい、難しいと感じる略称・用語を挙げてみたい。
- ARP
Address Resolution Protocol
IPアドレスからEthernetのMACアドレスの情報を得られるプロトコル。 - ARM
ARMホールディングス(旧:Advanced RISC Machines社)で開発されているCPUのアーキテクチャの名称。 - LDAP
Lightweight Directory Access Protocol
軽量ディレクトリアクセスプロトコル。 - DHCP
Dynamic Host Configuration Protocol
動的ホスト設定プロトコル。 - RAID
Redundant Arrays of Inexpensive Disks または
Redundant Arrays of Independent Disks
複数台のハードディスクを組み合わせることで仮想的な1台のハードディスクとして運用し冗長性を向上させる技術(Wikipediaより抜粋)。 - クエリ
query。問い合わせ。 - クーリエ
courier。添乗員、案内人、ガイド。 - SQL
Structured English Query Languageが由来のデータベース言語。 - リゾルバ
resolver。解決者。ドメイン名を解決するもの。
パッと浮かんだものだけでもこれくらいある。 えらい偏ってる。 なんかややこしく聞こえるものがたくさんあるなぁ。 名称はあまり略さずに使用していただきたい。 イニシャル三文字シリーズがもう嫌で嫌で…。 VPNとかVPSとかVLANとかあああああぁぁぁぁ。
続 Raspberry Piで遊ぶ
RPiで引き続き遊んでみよう。
今回は以下の順番で、オリジナルのディスクイメージを作成してみたい。
- GPartedでSDカードにパーティションを作る。
64MBのFAT32領域と960MBのext4領域の起動用SDカードを作成する。 - MINIBIANのディスクイメージをLinuxBean上にマウントし、中身だけをSDカードの各領域にコピーする。
- その状態で起動できるか試す。
- 起動することが確認できたら、SDカードのその起動イメージを書き出す。
こうすることによって、RPiのイメージをPC上でいじったり、丸ごとバックアップすることができる。
GPartedでSDカードの操作
LinuxBeanでは標準でインストールされている、パーティション操作ツールだ。
GPartedイメージ
GPartedでSDカードのすべての領域を削除
まずは一度すべての領域を削除する。
間違ってもPCのパーティションを削除しないように!!
マウント状態だと削除できないので、各パーティションをアンマウントした状態で削除。
GPartedでFAT32領域を作成
次はFAT32領域を作成。なぜかわからないが、前方に1MBの空き領域を作成しなければならないようなので、実際には63MBのFAT32領域となる。
GPartedでext4領域を作成
追加ボタンをクリックして完了。
GPartedでのパーティショニング完了
これで「↵」ボタンを押して適用すれば、パーティショニングが完了する。
MINIBIANディスクイメージをLinuxBean上にマウント
まずは下記のように、カレントディレクトリを整理しよう。
% ls -l drwxrwxr-x 5 tokixy56 tokixy56 4096 Jan 31 17:10 . drwxrwxr-x 6 tokixy56 tokixy56 4096 Jan 19 23:04 .. ... -rwxrwxr-x 1 tokixy56 tokixy56 832569344 Jan 20 23:55 2015-11-12-jessie-minibian.img drwxrwxr-x 2 tokixy56 tokixy56 4096 Jan 19 22:05 mnt
2015-11-12-jessie-minibian.imgがMINIBIANのディスクイメージである。 カレントディレクトリにmntディレクトリを作成しておき、ここにマウントするようにしたい。
MINIBIANディスクイメージのFAT領域をマウント
まずは、fdiskコマンドでディスクイメージの情報を確認する。
% fdisk -l 2015-11-12-jessie-minibian.img Disk 2015-11-12-jessie-minibian.img: 832 MB, 832569344 bytes 255 heads, 63 sectors/track, 101 cylinders, total 1626112 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System 2015-11-12-jessie-minibian.img1 16 125055 62520 b W95 FAT32 2015-11-12-jessie-minibian.img2 125056 1626112 750528+ 83 Linux
次に、ディスクイメージの情報をみて、オフセットを調べる。 上記の情報ではStart位置は16、これはブロックサイズ、つまりセクタサイズだ。 コマンドの下に表示されている「Units = sectors...」にあるように、1セクタは512バイト。 よって、512byte×16=8192バイトずらしたところがマウントする先頭位置となる。
% sudo mount -t vfat -o loop,offset=8192 2015-11-12-jessie-minibian.img mnt
これでmntディレクトリにFAT領域がマウントされる。
この中身をすべてSDカードのFAT32領域にコピーする。
GUIのファイルマネージャ(PCManFM)ではコピーできなかったので、僕はこのコマンドを使用した。
% sudo cp -r mnt/* /media/tokixy56/[FAT32のディレクトリ]
コピーが完了したら、アンマウントを忘れないように。
% sudo umount mnt
MINIBIANディスクイメージのext4領域をマウント
次はext4領域をマウントする。
sudo mount -t ext4 -o loop,offset=64028672 2015-11-12-jessie-minibian.img mnt
これもFAT32の時と同じように512byte×先頭位置で計算した値をoffset値としてセットする。
RPiのrootディレクトリがmntにマウントされていることがわかる。
これもSDカードのext4領域にコピーする。
% sudo cp -r mnt/* /media/tokixy56/[ext4のディレクトリ]
コピーが完了したら忘れずにumount。
ここで一度起動確認
何事もなければ起動するはず。
起動しない場合はもう一度手順を確認してみよう。
SDカードからディスクイメージを書き出す
ddコマンドを利用して、先ほど作成したSDカードのディスクイメージをPCへ書き出す。
ddコマンドでSDカードから書き出し
sudo dd if=/dev/sd[SDカード] of=minibian.img bs=512 count=2097152
僕の場合は/dev/sdgがSDカードデバイスだった。
出来上がったファイルをfdisk -lコマンドでみてみる。
% fdisk -l minibian.img ... Device Boot Start End Blocks Id System minibian.img1 2048 131071 64512 b W95 FAT32 minibian.img2 131072 2097151 983040 83 Linux % fdisk -l 2015-11-12-jessie-minibian.img ... Device Boot Start End Blocks Id System 2015-11-12-jessie-minibian.img1 16 125055 62520 b W95 FAT32 2015-11-12-jessie-minibian.img2 125056 1626112 750528+ 83 Linux
元々のMINIBIANのディスクイメージとは、Startセクタやブロックサイズが異なることがわかる。
このようにすれば、自分が作成したSDカードの状態をそのままバックアップとして保存できるため便利だ。
また、前述のマウントの手順を踏めば、自分が作成したディスクイメージも同じようにマウントできる。
自分が作成したプログラムを、マウントしたディスクイメージにコピーし、SDカードにddで書き込むということも可能になるわけだ。
ddによるSDへの書き込みは下記のコマンドを実行。
ddコマンドでSDカードへ書き込み
sudo dd if=minibian.img of=/dev/sd[SDカード] bs=512 count=2097152
書き出しコマンドのifとofの値を入れ替えただけ。
これでネットワーク越しやUSBメモリをさしてファイルをコピーする必要もなくなるわけだ。
SDカードをPCに挿せば普通にマウントしてくれるからここまでする必要はないのだけども…。
まぁ遊びの一貫ということで。
今後
この状態だと、SDカードの一部だけが使用されることになり、局所的に寿命を早めてしまう。
仕方ないことではあるのだが、ちょっとでも寿命を伸ばすために、/tmpディレクトリや/var及び/var/logをRAM上に配置するようにしたい。
この設定をすると、電源を落とすたびにログファイルなどが消滅してしまうが、遊びで使っているので全く必要ない。
デバッグなどで残す必要がある場合にはその都度ROM領域にコピーするようにすればいいだろう。
MINIBIAN 最小構成のRASPBIAN (Raspberry Pi) ②
ちょっとページ長いっぽいので目次を入れてみた。
正式に正社員、スーツを卒業
僕は今年からITインフラ管理の仕事に転職したのだが、2月から正式に正社員として採用していただけた。
上司からの評価も(本当かどうかはわからないが採用担当の話では)良いらしく、すこぶる嬉しい。
逆に、僕はいい上司に出会えて喜んでいたところだったし。
しかしそんな中些細ではあるが、一つ悩みができた。
スーツでなく私服で出勤するということだ。
僕は正直それほど私服のセンスもなく、UNIQLOがなければ今頃田舎の中学2年生のような格好をしていただろう。
今はなんとか中学3年生くらいの格好はできているはず。
また、「あまり派手でなく、一般的なオフィスカジュアルで」という事を言われたのだが、一般的なオフィスカジュアルがどういった服装なのか全くわからない。
とりあえず、月曜日はスーツで行ってもう一度、良い服装、ダメな服装を聞いておこうと思う。
加えて、それに回答できる読者の方、コメントしていただくようよろしくお願いします。
最近、僕の応援していたブロガーの方も異国の地で就職を勝ち取れたようだ。2016年、僕に加えて彼までも迎え入れたIT業界は、きっと良い風が吹くのではないかなぁ…(この超絶上から目線はジョークです、御了承お願い致します)。
Raspberry Piで遊ぶ
前回の予告したが、とりあえず今回は以下のうち最初の1つを記したい。
raspi-configなしでディスクを拡張。
MINIBIANにはraspi-configがないので、知っておくと便利。RPiのイメージを1GBキッチリにしたい。
いくつか方法があるが、SDカードにGPartedでパーティションを作りたい。 FAT32を64MB、ext4を960の合計キッチリ1GBの領域を確保する。 そこに必要なファイルをコピーし、イメージの作成、読み出しなどをする。- イメージファイルをPC上にマウントして中身を書き換えたい。
イメージファイルはPC上にマウントすることができる。なんか面白いのでやってみたい。
[raspi-config]なしでディスクパーティションを拡張
こちらのページが非常にわかりやすい。
wordpress.ideacompo.com
tomoyukim.hatenablog.com
僕が利用しているOS、MINIBIANにはraspi-configがインストールされていない。よって、このような作業が必要になる。
ほぼ転載にはなるが、自分でもう一度手順を記しておきたい。
df -hでデバイスを確認
% df -h Filesystem Size Used Avail Use% Mounted on /dev/root 705M 431M 223M 66% / ... /dev/mmcblk0p1 61M 20M 42M 32% /boot % ls -l /dev ... brw-rw---- 1 root disk 179, 0 Nov 10 00:32 mmcblk0 brw-rw---- 1 root disk 179, 1 Nov 10 00:32 mmcblk0p1 brw-rw---- 1 root disk 179, 2 Nov 10 00:32 mmcblk0p2 ...
上記の/dev/mmcblk0p1がbootパーティション、つまりFAT領域だ。
そしてdf -hでは表示されていないが、/dev/mmcblk0p2がLinuxのファイルシステムとして使われている。
SDカードのデバイス名は/dev/mmcblk0である。
RPiのイメージをSDカードに書き込んですぐの時点では、ディスクデバイスドライバとファイルシステムはSDカード全体を使うように設定されていない。
その2つを適切に設定すれば、目標達成である。
SDカード/dev/mmcblk0の2つ目のパーティションを拡張して、FAT領域とext4領域とを合わせて1GBとなるようにする。
fdiskでパーティションを作り直す
# fdisk /dev/mmcblk0
上記のコマンド実行後、以下のように操作する。
- p : パーティションのアドレス情報などを表示
- d : 隠し部分のパーティション削除
- 2 : 2番目のパーティションなので、2を指定。
- p : 結果確認
- n : 新しいパーティション作成
- p : primaryを指定
- 2 : 2番目のパーティションを指定
- 数字 : 最初のpで表示した2番めのパーティションのstartアドレスを指定
- 2097152 : 1セクタが512として、1GBを計算した値を入力
- w : 変更を書き込み。
root@minibian:~# fdisk /dev/mmcblk0 ... #1. p : パーティションのアドレス情報などを表示 Command (m for help): p Disk /dev/mmcblk0: 14.9 GiB, 15931539456 bytes, 31116288 sectors Units: sectors of 1 * 512 = 512 bytes ... Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 16 125055 125040 61.1M b W95 FAT32 /dev/mmcblk0p2 125056 1626112 1501057 733M 83 Linux #2. d : 隠し部分のパーティション削除 Command (m for help): d #3. 2 : 2番目のパーティションなので、2を指定。 Partition number (1,2, default 2): 2 Partition 2 has been deleted. #4. p : 結果確認 Command (m for help): p #/dev/mmcblk0p2が消えた Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 16 125055 125040 61.1M b W95 FAT32 #5. n : 新しいパーティション作成 Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) #6. p : primaryを指定 Select (default p): p #7. 2 : 2番目のパーティションを指定 Partition number (2-4, default 2): 2 #8. 数字 : 最初のpで表示した2番めのパーティションのstartアドレスを指定 #この場合、デフォルト値が先頭セクタからずれているので、入力し直すこと。 First sector (125056-31116287, default 126976): 125056 #9. 2097152 : 1セクタが512として、1GBを計算した値を入力 # 512 x 2097152 = 1073741824 = 1GB(1024^3で割る) Last sector, +sectors or +size{K,M,G,T,P} (125056-31116287, default 31116287): 2097152 Created a new partition 2 of type 'Linux' and of size 963 MiB. #10. w : 変更を書き込み。 Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: Device or resource busy The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8). # reboot
ここでfdiskコマンドから抜ける。 そして再起動。
resize2fsでファイルシステムを拡張
# resize2fs /dev/mmcblk0p2 ... # df -h Filesystem Size Used Avail Use% Mounted on /dev/root 932M 432M 442M 50% / ... /dev/mmcblk0p1 61M 20M 42M 32% /boot
以上で、ディスクの拡張が終わり、(このログではわからないが)キッチリ1GBの領域を使用するRPiができた。
私事
次回予告中、1つしか書けなかったけど、まぁ許してください、次回また書きますゆえ。
最近はあまりRPiで遊べていないのが現状。
今の仕事は組込みとは全くかけ離れた領域の仕事である。
ネットワーキング、DNS、MTA、データベース、LDAPなどの各種サーバについての知識などを猛勉強中。
まさに僕が避け続けてきた分野だ。
誰かがやってくれるだろう、と思っていたことであった。
こんなことなら、このあたりももっと勉強しておくんだったなと思う自分と、それでも仕事を通して勉強できて幸せだなと思う自分がいて面白い。
うん、なんか幸せ。
MINIBIAN 最小構成のRASPBIAN (Raspberry Pi) ①
組込み開発っぽい事したい
みんな大好きRaspberry Pi(以下RPi)に、僕もまた夢中なのだ。
www.raspberrypi.org
概要はここで説明せずとも、検索すればたくさんの記事が見つかる、とてもメジャーな製品だ。
使い方は様々なのだが、僕は特に「組込みっぽく」使うことを心がけている。
ネットワークに接続せず、USBシリアル変換ケーブルの給電のみで作動させている。
過去記事はこちら
また、USBシリアル変換ケーブルの給電のみでは、時折バグる。
そのため、現在ではこちらのUSBハブを仲介して接続している。
www.amazon.co.jp
要は、セルフパワーのUSBハブを介することで、電源を補えばよかったのだ!!
ファームウェアの読み書き
組込み開発の醍醐味といえば、PCでクロスコンパイルしたバイナリイメージや実行ファイルをターゲットに書き込む作業だ。
少なくとも僕の中ではそうだ。
「ちゃんと動いてくれるかな??」
と胸踊らせながらターゲットに書き込む。
答えは電源を入れた時、あるいはボタンを押した時にわかる、というのが組込み開発でしょう。
アプリやウェブの開発でも、「動かす直前」が最もドキドキするはず。
そんなわけで僕は、ネットワーク越しに実行ファイルを渡したり、USBメモリさしてコピーするみたいな、普通のPC操作をするのは嫌だった。
組込み開発ぽい雰囲気を出すことが大事なのだ。
そこで、ちょっとMっぽい条件を自分に課せた。
- 通信はUSBシリアル変換ケーブルしかできない。
- ファイルのやりとりは、ノートパソコンに付いているSDカードリーダのみ使用できる。
- OSはLinuxBeanのみ使用する。
これだけあれば十分だ。
さぁ、旅に出よう(自分自身いろいろ不可解)。
ターゲット用OSはMINIBIAN
以前にも説明したこちらのターゲットOS、というかイメージ。
minibianpi.wordpress.com
最新のものはRPi2にも対応しているはずなので、少しファイルサイズが大きい。
こちらの2014-11-24-wheezy-minibian.tar.gzが一番ファイルサイズが小さいと思うので、RPi(2じゃない)を使用する場合は、お好みで選ぼう。
SDカードは2GBでも十分。
今後拡張していくにしても、ApacheやSambaやGitやMySQLを入れてサーバ化するとかしなければ十分な容量だ。
僕は特にIOの制御、IPC関連のシステムコールを使用したシステムを作ってみたいと思っていて、それほど容量は必要ないと考えている。
ネットワークのsocketやlisten、bind、IPCは共有メモリやSemaphore、低レベルのIO制御のioctlとか使ってみたい。
何をするかによるけれども、とりあえずそういうシステムコールを使用するプログラムを作成する、というのが私の勉強スタイルだ。 目的のための勉強ではない、勉強そのものが目的なのだ!!(聞き飽きたフレーズ感がすごい)
LinuxでのSDカードへの書き込み
開発環境にはLinuxBeanを選定しているので、Linuxではお馴染みのddコマンドを利用しよう。
(ちなみに、僕はzsherなので、プロンプトは'%'です。)
SDカードにMINIBIANイメージの書き込み
% ls -1 {~/Work/RPi/img} . .. 2015-11-12-jessie-minibian.img % sudo dd if=2015-11-12-jessie-minibian.img of=/dev/sdg
僕の環境の場合、SDカードは/dev/sdgとして認識されていた。 SDカードがどのデバイスかは、抜き差ししてls /devして調べられたし。 なんか接続した時のログみて判断するのがいいみたいだけど、メンドイからやめた。
上記のコマンドが終了し、プロンプトが戻ってくれば書き込み完了。 実機に差し込み電源を投入(USBシリアルを接続)すれば、起動成功だ。
Linuxのシリアルコンソール
LiunxBeanはUbuntuベースのディストリビューションなので、Ubuntuのソフトが使える。
使いやすかったソフトはgtkterm。
こちらの設定をしてみよう。
gtktermのインストール
#gtktermのインストール % sudo apt-get install gtkterm
インストール直後はgtktermは使えない。 使いたいデバイス(ttyUSB*)へのアクセス権がないからだ。 次のコマンドで自ユーザをdialoutグループに追加する。
dialoutグループにユーザを追加
#デバイスがあるかどうか確認 % ls -l /dev/tty* #ttyUSB0がUSBシリアルデバイス #所有グループがdialoutになっている crw-rw---- 1 root dialout 188, 0 Jan 20 23:10 /dev/ttyUSB0 ... % sudo addgroup [ユーザ名] dialout #rootも追加しておいていいかもしれない % sudo addgroup root dialout
これでUSBシリアルケーブルを使用したRPiとの通信が正常にできる。 念の為に一度PCを再起動しておこう。
gtktermの使い方
LinuxBeanを使用しているならば、メニュー→アクセサリ→Serial port terminalから起動できる。 もちろんshellからgtktermとコマンドしても良い。
gtktermイメージ
gtkterm通信設定
設定項目 | 値 |
---|---|
ポート | /dev/ttyUSB0 |
ボーレート | 115200 |
パリティ | なし |
その他もろもろはデフォルトでおk。
gtkterm設定画面
上記の設定が完了すれば、gtktermイメージにあるように感動の起動ログを眺めることができる。
次回予告 Raspberry Piのイメージで遊ぶ
大体こういうことをする。
LinuxBean + FreeBSD + Windows10 マルチブート
FreeBSDが気になって仕方がない
もうずっとずっと気になっている。
毎朝、向かいのホームで電車を待つ彼女、くらい気になる。
以前に一度Linuxとのデュアルブートでインストールしようとしたのだが、Grubから起動できなかったり、ちょっと扱いに困ったので諦めた。
FreeBSDのインストールは、この年末年始に取り組んだ課題の一つである。 ではなぜFreeBSDが気になるのか。 OS関連の書籍などを読んでいるとよく目にする、UNIXの歴史的経緯。
A diagram showing the key Unix and Unix-like operating systems
BSDは何を隠そう、Unix V6の正当な子孫なのだ。 つまり、僕の大好きなDennis Richie(デニス・リッチー)の子孫でもあるわけだ。 そんなデニスの子孫になんとなく触れてみたい、というただそれだけの理由で気になっている。
因みにLinuxはその横のMinixに触発されて作成されたそうだ。
僕はBSDとLinuxのどっちが好きとか優れてる、なんて考えは全く持っていなくて、どっちも大好き。 現在も現役バリバリで働いてるOS、特にUnix系OSの話題の記事など読んでいてテンションが上がる。
こんな記事も見つけた。
osdn.jp
リーナスさんは言います。
「どちらも優れているし、どちらもソフトウェアとして正しい、方向性は違えども。」
本当にそう思います(よくわかってないけど)。
FreeBSDのハードルの高さ
まず、FreeBSDを使ってみようと思ったとき、お試しする方法としては、以下の3つの方法があると思う。
普通に考えてFreeBSDを直接インストールして単一で使おうとは思わないだろう。 僕の場合、上の2つは考えていなかった。 やっぱりOSは直接インストールしてこそ本領を発揮するし、その本領を見なければ試す意味もないと思う。 だからといって、今まで使ったこともないOSのみでマシンを駆動するのも大変だ、ということでマルチブートを採用した。
FreeBSDのインストール方法についてはこちらを参照しよう。
https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/bsdinstall-start.html
The FreeBSD Project
「インストール手順も書きなさいよ」と言われそうだが…。
FreeBSDは、単純にUnixに触れてみたいという思いだけでは使えないと思う。
Linuxは大抵のディストリビューションにおいて、インストール直後から必要なものの150%くらいを用意してくれている。
だから軽量Linuxなどはその余計なものを取っ払って、100%にしたり80%に抑えてあとはユーザに任せたりする。
FreeBSDは全然違っていて、僕のなんとなくの直感だけど、まず20%くらいしか用意してくれていない。
そこから必要な物を各自が用意していくという感じだ。
それぞれのツール、その用途をわかった上で自らチューニングしながらインストールしていかなければならない。
そういった部分からすでに、ハードルの高さが全く違うわけだ。
不要なものを削っていく、あるいは停止させる作業と、無いものを順次作って用意していく作業とでは、その難易度に差があって当然。 だから、FreeBSDをちょっと使ってみようと思った皆様方は、上記に張っているリンクへ飛び、しっかりとドキュメントを読み、基礎的な知識を得てインストールする、ということをおすすめする。
いう慣用句がもう少しでできるとか。
インストール手順を書くのが面倒だという訳ではないのですよ(という言い訳)。
FreeBSDのパッケージ管理
あと、FreeBSDを扱う上でよくわからなかったのが、パッケージ管理。 そもそも僕はUnix系OSはMacOSXかLinuxしか触れたことがなく、主にLinuxを使用していたので、わざわざソースをコンパイルしてインストールするということはあまりなかった。 単純に「apt-get」で大抵のツールが手に入ったからだ。
だから、FreeBSDの「ports」とか「pkg」がよくわかっていなかった。
FreeBSDでは、この2つがパッケージ管理の要になるようだ。
簡単に説明すると、「pkg」は「apt-get」と同様、リポジトリにおいてあるコンパイル済バイナリパッケージを、依存関係を解決しながらインストールしていく仕組みである。
「ports」はソースコードをコンパイルしていく仕組みで、あるパッケージをインストールする際に依存関係にあるソースコードも取得してコンパイルしていく。
/usrディレクトリにportsディレクトリがあり、各パッケージはその中でカテゴリ別にディレクトリ分けされている。
インストールしたいパッケージのディレクトリに入り、makeしてインストールするのがportsの仕組みだ。
portsを使用すると、そのパッケージのコンパイル方法を詳細に決めることができ、運用方法に見合ったパッケージを作成することができる。
マルチブート環境
あまり詳細にインストール手順などは書くつもりはないのがだ、僕は以下のパーティション分けでインストールした。
- LinuxBean 14.04 : 200GB
- FreeBSD 10.2 : 80GB
- Windows10 : 残り容量
よく、「マルチブート環境ではWindowsからインストールする」みたいな記事をよく見かけるのだが、僕はとりあえず上記の順番にインストールしていった。 Windowsをあとからインストールすると、MBRを上書きされてしまいgrubを再度インストールする手間があるが、Windows7からWindows10へアップグレードなどでどんな挙動をするかわからなかったので、この順番を採用した。
FreeBSDのインストール
FreeBSDをインストールする上で、一点ハマったことがあったので、メモしておく。
2.6. ディスク領域の割り当て
ディスク領域の割り当てをするときに、他の領域と同じように作成したパーティションに、直接ルート("/")ディレクトリを割り当てられないということ。
FreeBSDのパーティション作成(サンプル画像)
これはFreeBSDを単一でインストールする場合のパーティション分けになっている。
マルチブートする場合、この何もマウントしないfreebsd-ufs領域を作成し、その下にもう一つfreebsd-ufs領域を作成して、それにルート("/")ディレクトリを割り当てなければならない。
ada0 ada0p1 200GB ext4 (Linux) ada0p2 80GB freebsd-ufs NONE | ----- freebsd-ufs / ada0p3 216GB NTFS
みたいな。
具体的な画像とか残せたらよかったけど、インストール中のスクリーンショットってどうやって撮るんだろう…。
LinuxBeanでgrubの再インストール
上記のOSを全てインストールできたら、grubの再インストールをする。 LinuxBeanのLiveCDを起動し、ターミナルから以下のコマンドを実行する。
# mount /dev/sda1 # grub-install /dev/sda1
パーティションをマウントしないとビジー状態で書き込みができない、みたいなエラーが出る。
上記のコマンドが成功したら、再起動する。
これで起動時にいつものgrubの画面が表示されるはずだ。
FreeBSD起動メニューの作成
grubはLinuxとWindowsに関しては自動で起動パーティションを見つけてくれるのだが、FreeBSDのファイルシステムは見つけてくれないようだ。
grubからFreeBSD起動する場合は、Grub Customizerでメニューを作成する必要がある。
Grub Costomizer
このようにFreeBSDの起動メニューは自動では作成されない。
追加ボタンをクリックし、以下の画面を表示する。
Grub Costomizer メニュー追加
set root='(hd0,msdos2)' chainloader +1
これでOKすれば完了。
hd0,msdos2はHDDのパーティションをどのように分けたかなど、インストールした環境によって変わる。
こちらの記事とかがわかりやすいので拝読してみるべし。
jp.linux.com
上記の設定完了後、再起動すると、めでたくマルチブート環境の完成だ。
FreeBSDの実際
少しだけ試してみたけど、portsを利用するとコンパイルに時間がかかって大変だった。
デスクトップ環境を構築しようと思ってコンパイルをしていったのだが、依存関係のパッケージをコンパイルする度にオプションを指定しなければならなかった。
その度にコンパイルがストップするので、ずっと監視していなければならずなかなか大変だった。
デスクトップ以外にもvimやzshも同様に結構な時間がかかり、単純にlxdeを起動してターミナルからvimを起動するだけでも、FreeBSDインストールを始めてから丸2日ほどかかったと思う。
うーん、今後どのように使っていくべきか考えねばならぬ。
使い方さえしっかり覚えれば爆速環境を構築できるはずなのだが…。
MacOSX El CapitanにHomebrewをインストール
あけましておめでとうございます。
もう1月も半ばとなったが初エントリ。
前職を年末の少し早い時期に退職し、年末年始はおよそ丸半月、無職の期間を過ごした。
この間、次の仕事のために日々IT関連の勉強に励み、中でもネットワーク関連の書籍を3冊ほどざっと読んだ。
ごく簡潔にOSI参照モデルやインターネットプロトコルスイート、TCP/IPプロトコルやDNSといった基本的な知識を得た。
新年より新入社員としての仕事が始まり、まさに今取り組んでいる作業は「社内にある携帯電話の所在を調べる」である。
年末年始に学んだものが役に立っているようだ(皮肉である)。
けれど、もちろんそれだけが作業内容の全てではなく、ドメインコントローラーや社内で扱っているサーバの管理なども範疇で、まだまだ見えていない楽しい仕事がたくさん待っている模様。
社内SEではなく、実際はITインフラ管理というのが正しい。
その「管理」するものの中には、沼化しているカテゴリも多少あるようだが、そんな五里霧中を雲散霧消するのが僕の当面の仕事である。
美人社員に「Amaizing!!」といって喜んでもらえるように日々仕事に取り組みたい。
Homebrewをインストール
年末年始は、読書ばかりしていても飽きるので、ブログ書いたりPCの設定を結構した。
そしてPCを二台購入した…
ノートとデスクトップ…
いや、だって、社内SE頑張るし…
PC買って勉強したいし…
という自分に対する言い訳を並べ立てて「買い物かごに入れる」をポチった。
まぁそれも含めていくつか面白いこともやったので、順次書いていきたい。
Homebrewの詳細は以下。
Homebrew
Homebrew — OS X 用パッケージマネージャー
MacOSXのパッケージマネージャと呼ばれるもので、Homebrew以外には、
というものがある。気になる人は要チェック。
パッケージマネージャ比較
MacWiki - リスト/UNIXパッケージ
僕はパッケージ管理は何でもよかったのだが、とりあえず最近はHomebrewが主流になってきているということで、これを採用した。
そもそもHomebrewを入れてしたかったことは、Rictyを生成すること。
プログラミング用フォント Ricty
プログラミング以外でももちろん使用できるし、非常に読みやすく、僕は多用している。
Rictyは著作権上の問題があり、生成物をそのまま頒布することができないようだ。
Rictyの生成にはフォント作成ツールのFontforgeが必要、ということで、Fontforgeをインストールできればパッケージマネージャは何でも良かったわけだ。
インストールパスの指定
僕は本当は、Macにパッケージマネージャを入れるつもりはなかった。
MacOS環境が汚れるのはあんまり好むところではない。
ゴリゴリいじり倒しても大丈夫なようにLinuxマシンを使っているのだから。
しかし、少し調べてみると、Macの/usr/local以外にもインストールでき、あまり環境を汚さずにインストールできるようなので、試してみた。
今回は、~/homebrewを作成し、この~/homebrewフォルダ以下にインストールする。
ターミナルから以下を実行する。
Homebrewインストール
$ pwd /Users/[ユーザ名] $ curl -L https://github.com/Homebrew/homebrew/tarball/master | tar xz --strip 1 -C homebrew
上記でhomebrewの本体のインストールは完了。
このページのAlternative Installsを参照すると良い。
上記のコマンド完了後、~/homebrew/binを環境変数PATHに通す。
JAVA JDK
Homebrewのインストールが完了し、環境変数PATHの設定もし終えると、brewコマンドが使用可能になる。
このbrewコマンドを使用して、各種パッケージをインストールしていく。
Homebrew パッケージインストール
$ brew install fontforge
パッケージインストールを進めようとすると、JAVA関連のダイアログが表示され、インストールできないことがある。
僕の場合、Fontforgeがまさにそうだった。その場合は下記のページからJava JDKをダウンロードしてインストールしよう。
Java SE Development Kit 8 - Downloads
Java JDK ダウンロードページ イメージ
8u65、8u66のどちらでもいい、と思う。
このページで、Accept License Agreementの方にラジオボタンでチェックを入れないとダウンロードできないので注意。
Mac用のdmgファイルがあるのでダウンロードしてインストール。
これで問題なくパッケージインストールが可能になる。
レッツコマンドライフ。
Macに対する思い
僕のMacは2009 Midモデルだ。
多少ハードウェアを変えていて、HDDを2TBにし、MacOSXに1TB、Windows10に500GB、LinuxBeanに500GBという設定で使っている。
メモリももちろん8GBに増設。
Macintoshはやっぱり使いやすい。
入力機器が良い。
トラックパッドのジェスチャが好き。
キーボードの軽さも素敵。
ディスプレイも綺麗。
MacOSXも好きだ。
アップグレードされるたびに、不要な機能が増えつつも、UIは洗練され、Windowsに比べても間違いなく使いやすい。
けれど、このゴージャスなPCよりも、おもちゃみたいにレトロなマシンに、LinuxBeanのようなおもちゃみたいなOSを入れて遊ぶのが好きな僕。
僕のこのレトロマシン愛好魂はどこから生まれたのか…未だに解決しない謎である。