Linux日記 [Linuxもたしなむ程度に]
前書き
このページは化け猫おちゃっこの日記のページです。
Windowsの3Dプログラマ歴ばかり長かった おちゃっこです。
そんなWindows馬鹿がLinuxに挑戦します。
理由は、社会に出たらLinuxやUnixのスキルも求められたりするから。
そしてなんかWindowsよりも思い通りになるような希望を感じるから。
Linuxのカーネルのソースをいじれるようになったら かっこいいと思うー。
てなノリも結構あります。
最初は よちよち歩きですが いつかLinuxをバリバリ使えるようになりたい。仕事でも使いたい!
ということで はじまりはじまりー。
上にある記事の方が新しい記事になるように書いていきます。
この前作った簡易NAT SuperSimpleNat_2のこと。
SuperSimpleNat_2はオープンソースです。
https://github.com/Ochakko/SuperSimpleNat_2
簡易NATの作成で問題になったことの1つにRSTパケットがある。
TCPのハンドシェイクは
[クライアントから]syn --> [サーバから]syn + ack -->[クライアントから]ackで行われる。
NATはこのクライアントのサーバの間に入ってアドレスを変換してパケットを橋渡しします。
であるから、
syn + ackがサーバから送られるときsyn + ackがNATマシンを経由する。
NATマシンにおいてハンドシェイク用の待機ソケットが存在しない場合、
NATマシンはsyn + ackを受け取らずにサーバに受信失敗のICMPとRSTを送る
(rstとICMPはCentOS7の動作)。
これは簡易NATの仕様が、各接続についての専用のパケットを持たずに
プロミスキャスでサーバとクライアントに受け渡す仕様だからである。
この問題の解決策としてNATマシンのファイアウォルでRSTの送信ドロップ、ICMPの送信ドロップをする方法がある。
しかし、RSTやICMPを送ることが出来ないのは何かの問題になりそうである。
そこで仕様の変更を考えているのであるが。
NATマシンで各接続ごとの専用のパケットを用意して、その専用パケットでサーバからのsyn + ackを受け取って
ackナンバーなどのつじつまを合わせてクライアントへの受け渡しをするという方法が考えられる。
これをハンドシェイクサロゲート型NATと呼ぶことにする(一般的にも存在すると思われるが何と呼ばれているかまだ知らない)。
この方法の問題点はクライアントのdst IPとクライアントへのsrc IPが異なる可能性があることである。
LANの中では経路が確定していることが多いので
src IPで嘘をついても(実際のsrcがNATだがサーバーのIPをsrcとして記述しても)成り立つことが多い。
しかし、複数の経路が考えられる場合、IPの不一致が問題になって通信が出来ないと思われる。
そこで調べた結果、ソースルーティングとルーズソースルーティングというオプションが存在することが分かった。
ソースルーティングとは、通り道をすべて指定するオプションであり、
ルーズソースルーティングとは必ず通るルータだけを指定するオプションである。
指定できるアドレスの数には限りがある。
つまり、ハンドシェイクサロゲートとソースルーティングを組み合わせることにより
RSTのドロップの必要のないNATを作成できそうである。
だが、ソースルーティングは詐欺にも使われることがありうるので
インターネットのルータではドロップする設定になっていることが多いらしい。
言い換えると、
ハンドシェイクサロゲート型のNATは、LANの中でなら機能する可能性が高い。
いや待てよ。
話がおかしい。
ソースルーティングの必要性があるのは
クライアントとサーバの「すべての」通信において自分のNATを経由させるためである。
ただ必要なだけの橋渡しをするNATとして機能させるだけなら
ソースルーティングは必要ないと思われる。
つまりハンドシェイクサロゲート型NATはインターネットにおいても有効であると思われる。
いやしかし、まだそれほど必要性を感じていないので
ハンドシェイクサロゲート型の実装は保留。
自作NAT SuperSimpleNat_2 [
https://github.com/Ochakko/SuperSimpleNat_2 ]は
「TCPやUDPのポートを判断材料にして」、クライアントのアドレスをNATマシンのアドレスに置き換えて
目的地に送信しています。
つまり、クライアントのパケットにTCPやUDPのポートがないものは目的地に送信できない状態です。
この状態ではICMPパケットをNATを介してやり取りすることが出来ません。
しかし、CentOS7のOSの機能を使用してNAT設定すると、普通にICMPもNATマシンを介してやり取りできます。
どのようにしてこのようなことが可能なのかを調べるためにICMPパケットをキャプチャしてみました。
ICMPパケットをキャプチャしてみるとNATを介してやり取りする方法が分かったのですが
どうやらICMPのタイプによって複数の方法を用意しないといけないようです。
どういうことかというと
pingとその応答、つまりエコーのICMPパケットにはシーケンス番号が付いています。
NATの前後でICMPのシーケンス番号が一致していました。
つまりシーケンス番号を判断基準にしてNATが仲介するようです。
エコー以外のICMPには、TTLが0になった通知や各種エラーの情報などがあります。
今までみたところ、この種のICMPにはエラーを起こしたパケットのヘッダが
ICMPのデータ領域に格納されていました。
ですので、データ領域のヘッダを判断基準にしてNATが仲介すれば良いようです。
ということで、SuperSimpleNat_2にICMP転送機能を付けようと思いました。
その前に、CentOS7ではどうなっているのかを調べてみました。
CentOS7ではプロトコル固有の追跡や転送が必要な部分はヘルパーモジュールとして実装されているようです。
カーネルのソースをみていないので想像なのですが
ヘルパーモジュールということは別プロセスなのかもしれません。
ICMPというのはTCPやUDPパケットのエラーについての報告が含まれるわけですから
TCPやUDPのポートやアドレスの変換がどうなっているのかを把握しないと
正しく転送できません。
NATとICMP転送プログラムが別プロセスであるとすると
NATの転送情報をICMP転送プログラムと共有する必要が生じます。
そういうわけで、Linuxにおける共有メモリについて調べる必要が出てきました。
調べると、XSIのshmという仕組みとPOSIXのsemaphoreという仕組みを利用することで
可能なことが分かりました。
今後、共有メモリを利用する際に再確認できるようにという目的も兼ねてGitHubにpushしました。
https://github.com/Ochakko/ShareMemLinux
CentOS7上で作成したのでオープンソースでライセンスはGPLです。
これでアドレスとポートの変換表をプロセス間で共有するための準備が出来ました。
次はこれを導入してICMPの転送プログラムを作成してみようと思います。
Linuxで仕事をするときにパッと使える部品を準備しておこうということになり
勉強しながら作ってます。
メモリのミスをみつけるために
electric fenceとmtraceを覚えました。
electric fenceはmallocしためもりへの範囲外への値セットでabortする仕組みです。
mtraceはフリーし忘れメモリを検出する仕組みです。
両方を同時に使うことは出来ないようなのですが、開発中に切り替えてチェックできます。
それと、デバッグに欠かせないgdbの扱いに慣れました。
emacsも画面4分割で使うことに慣れてきました。
そんな感じの職業訓練風味の中で作ったプログラムが
ReplaceStrings2です。
GitHubにpushしました。
https://github.com/Ochakko/ReplaceStrings2
ReplaceStrings2はXMLファイルの操作を想定しています。
2つのマーク間の文字列を切り出して、その範囲で文字列変換出来る機能があります。
Windowsでおなじみのセキュア文字列関数(おしりに_sがつく文字列関数)も
自分なりに書いてみました。
文字列の範囲外への書き込みというミスを防ぐことが出来ます。
というわけで
基本から勉強中、職業訓練中風味の化け猫でしたっ!!
「文字列操作はおしりにSっ!!」
NATを自作してNATの原理が分かったので
今度はOS(CentOS7)の設定でNATを機能させてみました。
基本的には
それぞれのNICにゾーンを設定するだけでうまくいきました。
ただし、他に間違えた個所があったからかもしれませんが
プライベートアドレスをexternalゾーンに設定できなくて苦労しました。
実験環境がNIC2枚ともプライベートアドレスだったので。
しかし、externalの代わりにworkにすることでうまくいきました。
あとはDNSの穴を開けたくらいです。
ということで純粋にNATの機能が欲しいのならOSの設定だけでOKです。
オリジナルのフィルターを付加したりする場合に
自作NATの意味が出てくるのではないかと思っています。
次はRedmineの本を読みます。
この前仕事した時に、隣の席の人(別プロジェクト)が「チケットチケット!」って言っていたのでww
チケットって、たぶんRedmineですよね??
自作NATプログラム、デバッグしました。
GitHubに置きました。
https://github.com/Ochakko/SuperSimpleNat_2
CentOS7で動かすための最小限のファイアウォルも絞り込むことが出来ました。
そして
仕事でも使うであろうgitの使い方を、この時間のあるときにちゃんと覚えておこう
ということで
「入門git」というすでに購入済の本を読みました。
メモを取りながら、実際に実行しながら読みました。
本を読んだおかげで、おっかなびっくりではなくある程度自信をもってgitコマンドを打てるようになりました。
あと仕事で使いそうなツールと言えば、、、
チケットとかいうやつ!?
チケットの練習をしておこう。
自作NATプログラム、書き直しました。
名前はSuperSimpleNat_2です。
制作ソフトのページに置いてあります。
NATにするLinuxマシンにNICを2枚刺して
片方から来たパケットのIPとポートを変換してチェックサムを計算しなおして他方に渡します。
TCPとUDPの橋渡しをしました。
NATとはカーネルの機能としてありますが
勉強、応用のためのものです。
いろいろ応用できそうなので
まだいじってみる予定です。
追記:
GitHubにもアップしました。
https://github.com/Ochakko/SuperSimpleNat_2
自作NATプログラムの経過です。
「ルータ自作でわかるパケットの流れ」っていう本を読んで
C言語によるルータプログラムの作り方の基本がわかったので
それを改造してNATを作ってみて勉強しようという流れです。
ここでいうNATとはIPとポートと両方変換するタイプです。
今日やっと動きました。
クライアントからNIC2枚刺しのNATマシンにアクセスして
セグメントを越え
上位ルータ兼firewall兼proxyを介して
インターネットのホームページをブラウジングすることに成功しました。
ブラウザはFireFoxを使いました。
やってみて問題になった部分は
チェックサムの計算とセットと
NATマシンのファイアウォルとフィルタ設定でした。
RAWソケットでMACの部分から全部埋めました。
NATプログラム自体はそれほど難しくないのですが
うまくいかない原因がNATマシンのファイアウォルとフィルタであることに気が付くまでが大変でした。
具体的には
3ウェイハンドシェイクのSYN + ACKがNATマシンに飛んでくると
NATマシンがそれを受け取らないというICMPを投げました。
それを防ぐと今度はNATマシンがRSTパケットを投げました。
このICMP問題とRST問題をOS(CentOS7)の設定で何とかすれば良いのです。
つまりFirewall-cmdを使いまくるのです。
--directを使用したフィルタのダイレクト設定をしないとうまくいきませんでした。
とはいえ、
NATプログラムを作りましたが
OSの機能でもっと高機能なことが簡単に出来るようになっています。
今回自作したのは勉強のためと、いざというときに応用が利くようにということです。
作ったプログラムはどうしようかなぁ?
今回のは本に載っていたのを改造したわけですが
自分風に作り直してオープンソースにしてみようかしら??
よし、明日から書き直し作業をしてオープンソースとしての公開を目指そう!!
ホームページでは詳しい解説はたぶんしませんけれど。
まず進捗から。
前回、NATを作ってみようと書きました。
昨日、ちょっと試してみました。
まだこれからデバッグするところです。
さて今回のテーマはSSHです。
SSHとはサーバーにリモートログインするためのプログラムです。
SSHは安全と言われています。
どうして安全なのかを知ることで安心できると思って調べてみました。
安全なSSHとは、公開キーと秘密キーを設定してあるSSHのことです。
公開キーとはエンコードキーであり、秘密キーとはデコードキーです。
一般に、クライアントに公開キーと秘密キーを置き
サーバに公開キーを置きます。
キーを使用したSSHの仕組みは以下のページで説明されています。
http://d.hatena.ne.jp/kasei_san/20120329/p1
ここで気になったのは
あるセッション中だけ有効な共通キーのやりとりです。
共通キーを見張っていたら盗聴できちゃうのではないか?とも思いました。
しかし、共通キーを渡す際に公開キーで暗号化すれば
それは秘密キーを持っていないと中身が分からないので
通信は盗聴できないことが分かりました。
更に気になったのは
遠隔地にサーバーがある場合、
公開キーを通信で送りつけることになります。
その際のSSHでユーザーのパスワードと公開キーが見られてしまう可能性があります。
しかし、
通信のセッションを張るためにも
共通キーを取得するためにも秘密キーが必要になります。
ですから、不正なセッションを張ることも盗聴することもできないことになります。
そしてキーを設定した後は
素のユーザーパスワードではSSH出来なくなるので安全ということでしょう。
念のため、キー設定後にユーザーのパスワードを変更しておくと更に安心でしょう。
ということで
秘密キーを通信で送らないように注意すればSSHは安全と言えるでしょう。
あんしん、あんしん。
本を読みながら
CentOSとC言語でルータプログラムを作った。
LAN内での実験で
異なるネットワークセグメントを越えることに成功した。
末端のクライアントからインターネットに出るためには
自作ルータを入れて3つのルータを越えなくてはならない感じの構成にしている。
自作ルータは3段目なのであるが
2段目のルータのフィルター機能で、ある1つのネットワークアドレスしか外とやり取りできない状態。
なので末端のクライアント(3段目のルータの下にぶら下がっている)から通信できるのは
2段目のルータまでの状態。
この構成で
末端のクライアントからインターネットに出るために
自作ルータにNAT機能をつけようと思う。
末端のクライアントからのパケットを3段目のルータでEtherヘッダとIPとポートも書き換えて
2段目のルータに送信する。
反対向きのパケットについても同様に処理すれば
インターネットに出られると思う。
というわけで
次は自作NAT(IPマスカレード)に挑戦します。
シャワーをあびながら あーーーっ と思った。
なんで思ったかというと、
254回もpingしないでも1回のブロードキャストのpingで済むのではないかと思ったからである。
シャワーから出てきてから早速試してみた。
まずはシェルのコマンドで、オプションを追加してブロードキャストアドレスのpingをした。
返事をしないマシンが多数だった。
調べてみた。
どうやらICMPのbroadcastのpingというのがいたずらに使われるのが流行ったことがあるようで
最近のマシンでは受け付けないようになっているようである。
プログラムからも試してみたが
そういう経緯からであろうか、ただアドレスにブロードキャストアドレスを指定するだけでは
権限が不足しているエラーが出た。
検索したら
ICMPのブロードキャストをするためにはbroadcastフラグも必要とのこと。
もう1つ調べたというか確認した。
IPv4の3番目と4番目のオクテットを255にしたらどうなるのか。
こういうブロードキャストはサブネットブロードキャストと呼ばれ
これもまた、いたずらに使われたことがある経緯で?最近のマシンでは受け付けないようになっているとのこと。
マシンというのはルータも含む。
ということで まとめると
ブロードキャストとは同一セグメント内でのみ有効である。
ICMPのブロードキャストを受け付けないマシンが多い。
なので
LAN内のIPを調べるのに254回pingするのは無駄ではなかったのである。
またちょっと勉強した。
LAN内のIPとFQDNとMACアドレスを検索するpingsearchは
シングルスレッドでselect多重化を使って作ったものである。
シングルスレッドであるから
pingを254回送信する処理の後に受信用のselectをしている。
送信している間に届いたパケットはどうなるのかが気になったので調べた。
NICにもバッファがあるが
ソケットライブラリのバッファにrecv読み出ししていないデータが溜まるとのこと。
つまりソケットライブラリのバッファがあふれる前にrecvで読みださないと
データが失われることになる。
そこでバッファのサイズについても調査した。
/proc/sys/net/core/rmem_default
にrecvバッファサイズのデフォルト値が記されており
/proc/sys/net/core/rmem_max
にrecvバッファの最大値が記されている。
プログラムで変更するには
sockoptのSO_RCVBUFで変更するとのこと。
調べてみたら
大丈夫なくらいの値に設定されていた。
しかし、そんなに大きいサイズでもなかった。
LAN内のIPとFQDNとMACアドレスをサーチするpingsearchの高速化をしてみました。
この前までは25秒くらいかかっていたのですが
1秒で検索完了できるようになりました。
どうやったかというと
ただの多重化です。
この前まではselectの機能を使いこなせていなかったのです。
多重化機能をちゃんと使用したところLAN内検索が1秒で出来ました。
またちょっと進歩。
FQDN取得はDNSやhostsファイルに依存するようで
取得できないものが相変わらずあるのが うーーーん というところ。
前から買ってあったんだけれど
ルータのプログラミングの本。
必要環境が
2枚以上のNICの刺さったLinuxマシンということで
面倒くさかったり、NICにつなぐマシンが無かったりして
読んでいなかったのである。
昨日、やっと重い腰を上げて
LinuxマシンにNICを追加して
2台目のNUCにもLinuxをインストールした。
読み始めたのであるが
いきなり目から鱗である。
まず、セグメント違いの間のパケットのやり取りについて。
今までは、セグメントが違うごとにヘッダが追加される噂を聞いてそれを(半分)信じていたのである。
しかし、実際にはルータでヘッダの書き換えが行われているのであった。
やっと、つじつまがあう説明に出会った。
そしてもう1つの重要なこと。
MACアドレスなどをいじることが出来るRAWソケットでも
イーサネットパケットには
みることが出来ないしいじることが出来ない領域が12バイトもある。
つまり、RAWソケットをいじって得意になっていたずらしても
調べるところが調べたら、分かってしまう可能性が高いということである。
これはエッセイで「VMの階層」と書いていたニュアンスを連想する。
ある階層にとってすべての情報が分かったとしても、
それを支配する階層には未知の情報があるという意味で
VMの階層という言葉を使っていた。
12バイトの領域を知った時、まさにそれを連想した。
私が知り得る情報で12バイトがいじれませんと公開されているわけであるから
この12バイトを征服したところで
それを支配する層にはまだ秘密があるはずだと思うのである。
コンプライアンスが高いものが強いのは、こういうところから来るのかもしれない。
だから、いたずらはやめておこう。
まあ、それは良いとして
実際の作業はというと結構地味で。
本を読んでリンク層でのソケットの扱いを覚え、飛んでくる情報のMACをみた。
それをこの前作ったPingSearchにマージした。
LAN内のIPを調べて
IPとFQDNとMACアドレスを表示するようにした。
ちょっと進歩した。
本を読んでばかりでは飽きるので
プログラミングしてみた。
まずはC言語でRAWソケットを使ってPingを作った。
これ、何かに使えないかなぁ?と思ってたら思いついた。
LANのネットワークアドレス内にpingをして
(最後の桁を1から254まで変化させて)
LAN内のマシンのIPをチェックするプログラムを作った。
IPだけだとなんのこっちゃ?なので
FQDNも取得して出力した。
selectのタイムアウトを使用したので
タイムアウトをコマンドラインで指定できるようにした。
100msのタイムアウトでサーチすると
だいたい25秒くらいでLAN内のIPとFQDNが分かる。
名前が取得できなかったものもあった。
ルータとスイッチは名前を返さなかった。
割と勉強になった。
さて次は何をしようかな??
堅い本ばかりで嫌になった時は
漫画の「シス管系女子」を読みます。
ちょっと どじっこ風の女性が シス管として成長していく漫画なのですが
役に立つし面白いです。
コマンドを覚えきっていなかったり 詳しい使い方を知らなかったりする人向けです。
漫画を注文したのですが
今日はすでに手元にある月刊誌の「シス管系女子」を読みました。
今日の収穫は
1、公開キーと秘密キーを使用してのssh。
2、シェルスクリプトからのscp。
3、cronを使用した定期ジョブの設定。
って感じです。
シス管系女子のSeason2を読みながら実際に実行しました。
楽しみながら勉強できますよ。
お勧めです。
Linuxのプログラミングを本で勉強中です。
まずは「ふつうのLinuxプログラミング」を読み終わりました。
サンプルも分かりやすく、Linuxプログラミングの最初の本として良いと思いました。
とりあえずとっかかりは押さえた感じ!?
それにしてもLinuxプログラミングは
仕様の背景?がシンプルとでも言いましょうか、言葉にしずらいのですが
技術の話でも、なんか割とすんなりと頭に入ってきます。
読んでいて
ああ、そういう風になっているのか、納得ぅーっていう感じです。
例えば、ある基本的なことを理解すると
たくさんのことを それに関連つけて 理解することが出来るという感じでした。
その本の紹介欄にあったので
次は「詳解UNIXプログラミング第3版」を入手しました。
結構、厚い本です。
この本をこれから読んでいきます。
そして、前から買ってあった
「Linux Network Programming Bible」
と
「ルーター自作で分かるパケットの流れ」
も買っただけで読んでなかった。
下の日記にある
GTK+の本と サーバーの本もある。
こっちに飽きたらあっちに あっちに飽きたらこっちにって感じで
これらの本を並行して読んでいこうと思います。
CentOS7にSambaをインストールして外付けHDDを共有しました。
パスワード付きでの共有が出来ました。
以下、そのときのメモ。
/***
* server側
***/
yum install samba
yum install samba-winbind
/* /etc/sysconfig/sambaの編集 */
WINBINDOPEIONS="-F"
/* ファイアウォルの設定 */
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
/* 外付けHDDの準備 */
ls -Z /mnt/
で/mnt/hdd1の現在のディレクトリタイプを確認。
chcon -t samba_share_t /mnt/hdd1
でsambaでシェアしたい外付けhddのディレクトリタイプにsamba_share_tを付与。
外付けHDDがntfsの場合samba_share_tの付与は失敗するので
setsebool -P samba_share_fusefs on
とする。
(ntfsのmountの仕方は
外付けHDDをマウントするの記事)
ls -Z /mnt/
で/mnt/hdd1の新しいディレクトリタイプを確認。
必要に応じてchmod -R *** , chown -R ***
/etc/selinux/targeted/contexts/files/file_contexts.local
に以下のエントリーを追加(ファイルがなかったら新規作成)
/mnt/hdd1(/*)? unconfined_u::object_r:samba_share_t:s0
ntfsの場合は
/mnt/hdd1(/*)? unconfined_u::object_r:fusefs_t:s0
/* ユーザの準備 */
useradd Samba用のユーザ名
groupadd Sambaユーザのグループ名
usermod -a -G Sambaユーザのグループ名 Samba用のユーザ名
smbpasswd -a Samba用のユーザ名
パスワード入力
/* smb.confを編集 */
[global]のすぐ下に
unix charset = UTF-8
dos charset = CP932
[global]のところに
workgroup = WORKGROUP
netbios name = Sambaサーバのコンピュータ名
//許可するネットワークアドレス
hosts allow = 127. 192.168.1.
max protocol = SMB2
(loggin options)のところに
max log size = 5000
log level = 3
(Standalone Server Opeions)のところに
security = user
passdb backend = tdbsam
map to guest = bad user
dns proxy = no
(Printing Opeions)のところ
コメントアウト
(File System Options)のところ
map archve = no
map hidden = no
map read only = no
map system = no
store dos attributes = yes
[homes]のところ
browsable = no
writable = yes
[printers]のところ
path = /var/spool/samba
browsable = no
guest ok = no
writable = no
printable = yes
以下、セクションごと書き足し
[SecSambaDir]
path = /mnt/hdd1
valid users = Samba用のユーザ名
guest ok = no
writable = yes
browsable = yes
write list = Samba用のユーザ名
read list = Samba用のユーザ名
/* sambaの起動 */
systemctl start smb.service
systemctl start nmb.service
/* OS起動時に指定サービスを起動 */
systemctl enable smb.service
systemctl enable nmb.service
/* sambaの再起動 */
systemctl restart smb.service
systemctl restart nmb.service
/***
* Linux client側
***/
yum install samba-client
firewall-cmd --permanent --add-service=samba-client
firewall-cmd --reload
/***
* Windows Client側
***/
スタートメニューを右クリックして
ファイル名を指定して実行を起動
\\Sambaサーバのコンピュータ名
を書いて実行
Linuxといえばシェルのコマンドで なんでもかんでも済んでしまうのですが。
今後必要になることもあると思い
GUIアプリの作り方の勉強もはじめました。
GTK+っていうツールキットを選びました。
LinuxのGNOMEデスクトップはGTK+で作られています。
GIMPっていう有名な描画ソフトもGTK+で作られています。
ということで選びました。
下の図20151104_1は、初日の勉強の成果です。
とりあえず、画像を貼り付けて ボタンを付けて、、、
本を読みながらやってます。
図20151104_1 初日の成果
Windowsで作っていたような普通のダイアログとか作りたいですね。
Linuxはサーバ分野が得意である。
一番 身近で簡単そうなサーバは Sambaじゃないかなぁ。
SambaとはWindowsとも連携可能なファイルサーバである。
つまりは、ファイル置き場である。
開発マシンは、ちょっとしたことで 立ち上がらなくなったりすることも有り得る。
データを定期的にファイルサーバに保存しておく意味はある。
複数人で開発するときはもちろん、ひとりであっても開発環境と保存場所を分ける意味はある。
NUC+外付け1T HDDをSambaサーバにすることにした。
で、まずはおもむろに GUIソフトの「ファイル」とやらで外付けHDDをみてみる。
すると、、、
mount -t ntfs error のようなメッセージが出て、HDDの中身をみることが出来ないぃーー!!
そうか、ntfsはWindows用のファイルシステムなのでCentOSはデフォルトでは対応していないのだなぁ。
こういうときは、グーグル先生の出番である。
調べると
yum -y install epel-release
にてepelのrepoをインストール
vi /etc/yum.repos.d/epel.repo
にてepelのrepoの設定を編集。
最初の方を編集。
failovermethod=priority
enabled = 0 //enabled=の1を0に変えて手動にする。
gpgcheck=1
手動設定なので--enablerepo=epelを付けてyumでインストール
yum -y --enablerepo=epel install dkms fuse-ntfs-3g
これでntfsのインストールが出来た。
さて、LinuxではUSBや外付けHDDにアクセスするには
mountという処理が必要である。
mkdir /mnt/hdd1 (hdd1の部分は適当に決める)
mount -t ntfs /dev/sdb1 /mnt/hdd1 のようにデバイス(ここでは/dev/sdb1)と/mnt/hdd1を関連つける。
これをやるとアクセスできるようになる。
起動するたびにこれをやるのは面倒なので
/etc/fstabに記述して、起動時に自動的にmountするようにする。
ここでもう一工夫ある。
/dev/sdb1などは 環境依存である。いつも必ずmountしたいHDDが/dev/sdb1というデバイス
である保証は無い。
そこでHDDに一意に付けられているUUIDというものを使用する。
blkidというコマンドでUUIDは調べることが出来る。
UUIDを調べたら
/etc/fstabに
UUID=(調べたものを書く) /mnt/hdd1 ntfs defaults 0 0
というエントリーを書く。
これでntfsの外付けHDDが起動時に/mnt/hdd1にmountされて使用できる。
ちなみに、管理者権限が必要なコマンドは頭にsudo を付けて実行するが省略している。
ああ、マウント出来た。
次回こそ、Sambaの設定をしよう。
Linuxはサーバ分野で活躍している。
いろいろ種類があるが、セキュリティが高いと言われているCentOSを選んだ。
要するに、余計なものがあまり入っていなかったりするのであろう。
CentOSは無料である。商用のRed Hat Linuxの支援により成り立っている。
CentOS7インストールマシンは i7 一台と NUC 二台。
NUCには最初、インストールできなかったが
BIOSを最新にしてCentOSも新しいものをDLしたらインストールに成功しました。
インストールオプションは
GUIサーバで 互換性ライブラリと開発環境とスマートカードサポートを有効にしました。
後は必要に応じて手動でインストールしていきます。
さて、はじめよう。