ROSチュートリアル

目的

wikiのチュートリアル を行います。

方法

準備

まずは下記のものを用意してください

  1. 前回作成したマシン

ファイルシステム

まずは、setup.bashを読み込みます。

bashの場合(標準)

                        $ source /opt/ros/indigo/setup.bash
                    

zshの場合(シェルを変更している場合)

                        $ source /opt/ros/indigo/setup.zsh
                    

これにり、rosのコマンドが使えるようになります。

ワークスペース

ROSで作業するためのワークスペースを作成します。 基本的にここで作業を行います。

                            $ mkdir -p ~/catkin_ws/src
                            $ cd ~/catkin_ws/src
                            $ catkin_init_workspace
                        

ワークスペースのビルドは次のようにして行うことができます。

                            $ cd ~/catkin_ws/
                            $ catkin_make
                        

ArchLinuxでcatkin_makeがうまく行かない場合は、こちらをご覧ください。

ワークスペースを適用します。

                            $ source devel/setup.bash
                        

zshの場合は上記のように.bashを.zshに変更してください。

この読み込みはシェルを起動するたびに必要になるので、.bashrc .zshrcなどに書き込んでおくと楽です。

roscd

roscdを使うとパッケージのディレクトリに移動できます。

                            $ roscd パッケージ名
                        

タブ補完を使うこともできます。

パッケージ

ROSのcatkinパッケージはCMakeLists.txtとpackage.xmlを含む必要があります。

パッケージの作成

std_msgs,rospy,roscppに依存したbeginner_tutorialsパッケージを作成します。

                            $ cd ~/catkin_ws/src
                            $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
                        

rospackコマンドでパッケージの依存を調べることができます。

                            $ rospack depends beginner_tutorials
                        

ビルド

パッケージのビルド

パッケージをビルドします。

                            $ cd ~/cakint_ws
                            $ catkin_make
                        

ノード

概念

  • ノード:ノードはROSを使用して他のノードとやりとりする。
  • トピック:ノードはメッセージをトピックに向けて配信し、購読して受け取る。
  • メッセージ:トピックへ配信・購読するROSのデータ型。
  • マスター:ROSのネームサービス。
  • rosout:ROSのおけるstdout・stderr。
  • roscore:マスター+rosout+パラメータサーバ。

roscore

roscoreはROSを使用する際に一番初めに起動させます。

                            $ roscore
                        

rosrun

rosrunはパッケージ名を使用して、パッケージに含まれるノードを起動します。

turtlesimを起動してみます。

                            $ rosrun turtlesim turtlesim_node
                        

トピック

セットアップ

rosrunの続きからさらにturtle_teleop_keyを起動します。

                            $ rosrun turtlesim turtle_teleop_key
                        

これで、亀を矢印キードで操作することができるようになりました。

ROSトピック

turtlesim_nodeとturtle_teleop_keyはトピックを介して通信しています。

rqt_graphを使って、グラフを作成することができます。

                            $ rosrun rqt_graph rqt_graph
                        

rostopicを使うことでトピックの詳細を得ることができます。 echoを使うとトピックのデータを見ることができます。

                            $ rostopic echo /turtle1/cmd_vel
                        

rostopic listではトピックのリストを得ることができます。

                            $ rostopic list -v
                        

rostopic pubではトピックを配信することができます。

                            $ rostopic pub トピック メッセージタイプ 引数
                            $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
                        

rqt_plotを使用すると、トピックのデータをグラフにすることができます。(略)

サービス

サービスもトピックと同じノード間の通信に使われる手段の一つですが、サービスは、リクエストとレスポンスから成り立っています。

前のままturtlesim_nodeは起動しておいてください。

ROSサービス

rosserviceを使うことでサービスの詳細を得ることができます。

listを使うと提供されるサービスを表示することができます。

                            $ rosservice list
                        

callでサービスを呼び出すことができます。

                            $ rosservice call サービス 引数
                            $ rosservice call clear
                            $ rosservice call spwan 2 2 0.2 ""
                        

rosparamを使用すると、パラメータを操作することができます。(略)

デバッグ

rqt

rqt_consoleはログ収集フレームワークにノードからの出力を表示する機能を追加します。

rqt_clogger_levelはノード実行時の力詳細レベルを変更できます。

両方を起動します。

                            $ rosrun rqt_console rqt_console
                            $ rosrun rqt_logger_level rqt_logger_level
                        

これらを使用してでログを見ることができます。(略)

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/26

2015/8/11 追記

 

 

 

ROS

目的

ロボット開発に便利なツールなどを提供してくれるROSのインストールを行います。

方法

準備

まずは下記のものを用意してください

Linux マシン

ソフトウェアのインストール

まず、makepkgで使用するbase-develをインストールします。

                        $ sudo pacman -Sy base-devel --needed
                    

ROSはyaourtを使用するため、もしインストールしていない場合はyaourtをインストールしておいてください。

パスワードの毎回の入力を省くために、下記のように設定してください。

                        $ sudo echo SUDONOVERIF=1 >> /etc/yaourtrc
                    

AUR パッケージのインストール

yaourtを使ってros-indigoのフルシステム (ROS,rpt,rviz,ロボットの一般的なライブラリ,2D/3Dシュミレータ,ナビゲーション,2D/3D認識) をインストールします。

                            $ yaourt -S ros-indigo-desktop-full --noconfirm --needed
                        

かなり時間がかかりますのでしばらくお待ちください。

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/15

 

 

 

ROSのインストール(Ubuntu・ArchLinux)

目的

Robot Operating SystemをUbuntuにインストールします。

2015/8/7 追記
ArchLinuxでのインストール方法を追記しました。

準備

まずは下記のものを用意してください

  1. Ubuntu14.04マシン or ArchLinuxマシン
  2. インターネット環境

(1) Ubuntuは15.04で試したのですが、依存関係がうまくいかないため14.04で行います。
indigoの対応バージョンは13.10と14.04のみのようです。 Ubuntu14.10と15.04を使用したい場合は、indigoではなくjadeをインストールしてください。

ArchLinuxは2015/8/7時点での最新のものです。

今回は(Ubuntu14.04 or ArchLinux)とindigoを使用します。

Ubuntu14.04

Ubuntu14.04の場合です。

sources.listのセットアップ

デフォルトではpackages.ros.orgのパッケージを登録していないため、登録を行います。

                        $ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
                    

鍵の設定

鍵の設定を行います。

                        $ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
                    

アップデート

パッケージインデックスを更新します。

                        $ sudo apt-get update
                    

インストール

インストールを行います。最小から最大までパッケージがありますが、今回はすべてインストールします。

                        $ sudo apt-get install ros-indigo-desktop-full
                        $ sudo apt-get install python-rosinstall
                    

ArchLinux

ArchLinuxの場合です。

まずは、yaourtをインストールしておいてください。

インストール

インストールします。

                        $ yaourt -S ros-indigo-desktop-full --needed --noconfirm
                    

ただし現在(2015/8/7)、このまま実行すると下記のようなエラーがでます。

                        ==> ERROR: A failure occurred in build().
                        Abortin...
                        ==> ERROR: Makepkg was unable to build ros-indigo-catkin.
                    

遡って読んでみると、

                        ImportError: "from catkin_pkg.package import parse_package" failed: No module named catkin_pkg.package
                        Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
                    

ros-indigo-catkinのインストール中に/tmp/yaourt-tmp-username/aur-ros-indigo-catkin/src/catkin/cmake/parse_package_xml.pyのファイルがcatkin_pkg.packageをimportできなく怒ってるようです。

まずは、catkin-pkgをインストールしましょう。

                        $ yaourt -S python-catkin-pkg --noconfirm --needed
                    

というわけで、catkin_pkgがどこにあるのか検索すると、

                        $ sudo find / -name "catkin_pkg"
                        /usr/lib/python3.4/site-packages/catkin_pkg
                    

検索結果のフォルダをPYTHONPATHへ登録します。 PYTHONPATHへ登録すると、pythonスクリプトのインクルードディレクトリに登録されます。

                        PYTHONPATH=/usr/lib/python3.4/site-packages/
                    

登録したので、catkinがインストールできるか試してみましょう。

                        $ yaourt -S ros-indigo-catkin --noconfirm --needed
                    

うまくいきましたか?それでは、もとのインストールに戻りましょう。

                        $ yaourt -S ros-indigo-desktop-full --needed --noconfirm
                    

catkin-pkgの競合

最後に、インストール途中でcatkin_pkgが競合して、python-catkin-pkgが削除されてpython2-catkin-pkgがインストールされます。

ArchLinuxで後にcatkin_makeをした時にうまくできない場合は、ROSシステムがpython-catkin-pkgのpython3バージョンpython2バージョン両方に依存しているにもかかわらず、python2-catkin-pkgのみしか入っていないためだと考えられます。

                        $ # catkinワークスペースで
                        $ catkin_mae
                        # 〜略〜
                        ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg'
                        Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
                        CMake Error at /opt/ros/indigo/share/catkin/cmake/safe_execute_process.cmake:11 (message):
                        # 〜略〜
                    

ここでyaourtを使ってpython3のバージョンをインストールしようとすると、競合を怒られてインストールできません。

                        $ yaourt -S python-catkin-pkg
                        # 〜略〜
                        looking for conflicting packages...
                        :: python-catkin-pkg and python2-catkin-pkg are in conflict (python2-catkin_pkg). Remove python2-catkin-pkg? [y/N] y
                        error: failed to prepare transaction (could not satisfy dependencies)
                        :: python2-rosdep: requires python2-catkin-pkg
                        :: ros-indigo-catkin: requires python2-catkin-pkg
                        :: ros-indigo-rospack: requires python2-catkin-pkg
                        # 〜略〜
                    

そのため、pipを使ってアップデートしてます。

                        $ sudo pip install -U catkin_pkg
                    

findで確認してみると、3.4にも2.7にもあることが確認できます。

                        $ sudo find / -name "catkin_pkg"
                        $ catkin_make
                    

これでcatkin_makeも実行できるようになりました。

共通手順

rosdepの初期化

rosdepを初期化します。

                        $ sudo rosdep init
                        $ rosdep update
                    

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/25

2015/8/ 7 追記
2015/8/11 追記

 

 

 

Makefileの書き方2

目的

Makefileの書き方に続いて、もっと簡単なMakefileを書きます。

準備

まずは下記のものを用意してください

  1. Linuxマシン

make

Makefile

                        CC       = gcc
                        CCFLAGS  = -Wall -Wextra -O2 -g
                        SOURCES := $(wildcard *.c)
                        TARGET   = $(SOURCES:.c=.bin)

                        all: $(TARGET)

                        %.bin:%.c
                            $(CC) $(CCFLAGS) $< -o $@

                         clean:
                            $(RM) -r *.bin
                    

wgetを使って保存してください。

                        $ wget http://tokun.net/bookshelf/program/makefile
                    

これでmakeをすると、.cの拡張子を持つファイルはコンパイルされて、元のファイル名.binという実行ファイルが生成されます。

C++のMakefileを作りたい場合は、CCをg++に、SOURCESとTARGETの.cを.cppに変更してください。

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/28

参考サイト

 

 

 

Makefileの書き方

目的

C++やCなどコンパイラ型言語を使ってプログラミングをするときは、何度も何度もコンパイルを繰り返します。 ここで、今RaspberryPi(ARM Linuxボード)を使ってプログラムを作成しているとします。 プログラムをホストマシンで組み、クロスコンパイルして実行ファイルをRaspberryPiへと転送します。 このとき、作業では次のコマンドを打ち込みます。

                    gcc-linaro-arm-linux-gnueabihf-g++ -Wall -Wextra -O2 -g -MMD -MP -L/usr/local/lib -I../include -I/usr/local/include -o cmd
                    scp cmd user@192.168.7.2:/usr/bin/
                

これだけを見ると「たったの2行?」と感じるかもしれませんが、コンパイルして実行するたびにこのコマンドを何度も何度も打ち込むのはとても大変で非効率的です。 1回で160文字、10回繰り返すと1600文字、30回繰り返すと4800文字、これだけあれば、ソースコード100行分は優に超える文字数になります。 この無駄な時間を減らすためにあるのが、今回のテーマmakeです。

間違いを恐れずにmakeを大雑把にいうと、シェルスクリプトのコンパイル特化版です。 また、大規模で分割されたプログラムなどで、必要なものだけコンパイルするため高速化を図れます。

では、makeを使うとどのくらい短縮できるのでしょうか? 答えは次のコマンドが表していますね。 makeを使った時に、先ほどと同じ操作をするために打つコマンドです。

                    make
                

「えっ?これだけ?」と思うかもしれません。 その通りです。 makeを使うとこれだけで、コンパイルから転送までが済んでしまいます。 あんな長ったらしいコマンドとはもうおさらばです。

ただし最初からmakeと打つだけでできるわけではありません。 makeを使うためには、コンパイルの設定を書き込んだMakefileが必要になります。 Makefileはその名の通りmakeのファイルで、コンパイラの情報からオプション・依存関係まで、様々なものを書き込んでおくのですが、これがなかなか慣れない書き方をしなければなりません。 今回は、このMakefileを書いて作業の効率を上げる方法を解説していきます。

方法

では、ここからはMakefileの書き方です。

準備

まずは、makeをインストールしてください。

                        # ArchLinux
                        $ sudo pacman -S make

                        # Ubuntu Debian系
                        $ sudo apt-get install make

                        # Fedora Redhat系
                        $ sudo yum -y install make
                    

今回はArchLinuxでC++を使って解説しますが、LinuxならUbuntuでもFedoraでも基本的な操作は変わりません。

次に、普段コンパイルに使用しているコマンドを用意してください。 今回は先ほど上げた2行のコマンドとします。

オプションなどについては別の回で解説します。

書き方

まずは、先に完成したMakefileです。

                            CROSS   := ~/Program/cross_gcc/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf

                            ifneq ($(CROSS),)
                                CROSS_PREFIX	:= $(CROSS)-
                            endif

                            CXX		 = $(CROSS_PREFIX)g++
                            CXXFLAGS = -Wall -Wextra -O2 -g -MMD -MP
                            LDFLAGS	 =
                            LIBS	 = -L/usr/local/lib
                            INCLUDE	 = -I../include -I/usr/local/include
                            BIN_DIR  = ../bin/
                            TARGET 	 = $(BIN_DIR)$(shell basename `readlink -f ..`)
                            OBJDIR	 = ./obj
                            ifeq "$(strip $(OBJDIR))" ""
                                OBJDIR = .
                            endif
                            SOURCES	:= $(wildcard *.cpp)
                            OBJECTS	 = $(addprefix $(OBJDIR)/,$(SOURCES:.cpp=.o))
                            DEPENDS	 = $(OBJECTS:.o=.d)

                            all: $(BIN_DIR) $(TARGET)

                            $(TARGET): $(OBJECTS)
                                $(CXX) -o $@ $^ $(LDFLAGS)

                            $(OBJDIR)/%.o:%.cpp
                                @[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
                                $(CXX) $(CXXFLAGS) $(INCLUDE) -o $@ -c $<

                            $(BIN_DIR):
                                mkdir -p $(BIN_DIR)

                            clean:
                                $(RM) -r $(OBJECTS) $(DEPENDS) $(TARGET) $(BIN_DIR) `readlink -f $(OBJDIR)`

                            upload: $(BIN_DIR) $(TARGET)
                                scp $(TARGET) root@192.168.7.2:/usr/bin/


                            -include $(DEPENDS)
                        

20行目までが、変数などの定義、22行目からがコンパイルなどの操作をしています。

変数にはファイル名などを"="や":="などの演算子で代入することができます。
変数を使用する際には$(変数名)のようにして使用します。

変数の役割は以下の通りです。

変数名役割
CROSS クロスコンパイラへのパス(最後の"-gcc" "-g++"は除いて代入)
CXX コンパイラの名前("$(CROSS)-g++"が代入される。CROSSが空の場合は"g++"のみ)
CXXFLAGS コンパイルオプション(複数の場合はスペース区切りで列挙)
LDFLAGS  
LIBS ライブラリへのパス
INCLUDE インクルードするファイルへのパス
BIN_DIR 作成する実行ファイルを保存するフォルダ名
TARGET 作成する実行ファイルの名前(今回は上の階層のディレクトリ名を取得)
OBJDIR コンパイル・リンク中に生成されるファイルの一時保存場所
SOURCES コンパイルするソースファイル名(今回は .cppのファイル)
OBJECTS コンパイル・リンクで生成されるファイル名
DEPENDS  

変数を定義したら、それらを用いてコンパイルなどの操作を行います。

操作のためには依存関係を記述します。書き方は以下のようになります。

                            ターゲット名: 依存ファイル名
                                コマンド
                        

このようなブロックのものを複数記述することができます。

では、ブロックが複数あるときには、どのブロックが実行されるのでしょうか?
makeでは、ターミナルで"make"のみを実行した時にはターゲット名が"all"のものが実行され、"make ターゲット名"のように指定すると、指定したターゲット名を持つブロックが実行されます。
今回のmakefileでは"make"を実行すると22行目"all"ブロック(コマンドなし)が、"make upload"を実行すると37行目"upload"ブロックが実行されます。

では、ターゲット名について見ていきましょう。
ターゲット名には、基本的にはそのブロックを実行すると生成されるファイル名を記述します。
31行目"$(BIN_DIR)"はこのブロックを実行すると、"$(BIN_DIR)"を生成するということがわかります。
"all" "upload" "clean"などのように、生成するファイル名でないものをターゲット名にすることもできます。 ただし、このとき"all"は先述のように特別な意味を持ちます。

次に、依存ファイルについて見ていきましょう。
ターゲット名のコロンを挟んだうしろにあるのが依存ファイルです。 スペースつなぎで複数記述することができます。 依存ファイル名の部分には、そのブロックを実行するために必要なファイル(依存ファイル)名を記述します。
22行目"all"を見てみましょう。 このブロックを実行するためには$(BIN_DIR)と$(TARGET)の2つが必要だということがわかります。 makeはこの情報を元に、現在$(BIN_DIR)と$(TARGET)の2つがあるかどうかをチェックして、2つともある場合にはそのブロックを実行します。
では、どちらか一方、もしくは両方がなかった場合はどのようになるのでしょうか?
makeは依存ファイルが欠けているときは、そのファイルを生成してから現在のブロックを実行します。 つまり、今回$(BIN_DIR)がなかったとすると、まずは$(BIN_DIR)を生成しようとします。 この時に呼び出されるのが、不足ファイルと同じターゲット名を持つブロックです。 今回は$(BIN_DIR)ブロックが該当します。
これで、無事$(BIN_DIR)が生成されると、元のブロックに戻ってそのブロックを実行します。

このようにして、makeは不足ファイルがあるとそのファイルを生成しながらブロックを実行していきます。 これのようにしてmakeは動作していきます。

流れ

では、基本的な書き方を学んだところで、今回のMakefileの大まかな流れを見てみましょう。

まず、"make"を実行すると"all"ブロックに入ります。 依存関係にある2つのファイルは生成されていないため、"$(BIN_DIR)"ブロックと"$(TARGET)"ブロックが呼び出されます。
"$(TARGET)"ブロックでは$(OBJECTS)を依存ファイルとしているため、"$(OBJECTS)/%.o"ブロックが呼び出されます。 "$(OBJECTS)/%.o"ブロックでは%.cppを依存ファイルとしていますが、このファイルはすでに作成しているプログラムファイルのため、依存関係が満たされてコマンドが実行されます。
これにより、$(OBJECTS)が生成されるため、"$(TARGET)"ブロックが実行されます。
これにより、$(TARGET)が生成されるため、"all"ブロックが実行されますが、コマンドがないためここで終了します。
"all"ブロックでは処理が行われませんでしたが、"$(TARGET)" "$(OBJECTS/%.o"ブロックでコンパイル・リンクがされたため、実行ファイルが生成されました。

これが、このMakefileのおおまかな流れです。

おわりに

軽いmakeについての説明をさせていただきましたが、いかがでしたでしょうか?
わからないことなどがありましたら、ご質問だくさい。

2015/6/29

 

 

Wiresharkを用いたWi-fiスキャン

目的

パケットキャプチャツールであるWiresharkを用いて、無線LANを流れるパケットをキャプチャします。

準備

まずは下記のものを用意してください

  1. 無線LANに接続可能なLinuxマシン

インストール

Ubuntu

                        $ sudo apt-get install wireshark
                    

ArchLinux

                        $ sudo pacman -Sy wireshark
                    

設定

まずは、インターフェースの設定を行います。

無線LANカードには次のようなモードがあります。

  • マネージモード:普段最も使う、アクセスポイントへ接続するモード
  • アドホックモード:アクセスポイントを介さず端末同士で直接接続するモード 最近ではゲーム機の通信などに用いられる
  • マスターモード:テザリングなど、自分がアクセスポイントとなり、クライアントを接続させて通信するモード
  • モニターモード:今回使う、自分はデータの送信は行わず、ただ飛び交うパケットを受信し続けるモード

これらからわかるように普段は無線LANカードはマネージモードになっています。 このままでは、飛び交うパケットのキャプチャができないのでモニターモードに設定します。

iwconfigで確認してみましょう。

                    $ iwconfig
                

wlan0やlwp2s0などで表されるのが無線LANカードです。 Mode:のうしろにManagedと書いてある場合はマネージモードになっています。

設定

まずは、普段は無線LANカードは有効になっています。 設定を行うためにip linkを使ってdownにさせます。

wlp2s0はiwconfigで確認したデバイス名に各自置き換えてください。

                        # Ubuntuの場合
                        $ sudo iwconfig wlp2s0 down
                        # ArchLinuxの場合
                        $ sudo ip link set down wlp2s0
                    

この操作を行わないと、下記のように怒られます。

                        Error for wireless request "Set Mode" (8B06) :
                            SET failed on device wlp2s0 : Device or resource busy.
                    

ip linkでdownにさせたため、ifconfigで確認すると、wlp2s0(または任意のデバイス名)は見えなくなっています。

                        $ ifconfig
                    

さて、これで設定を行うことができるようになりました。

無線LANカードのモードをモニターモードに設定します。

                        $ sudo iwconfig wlp2s0 mode monitor
                    

これでモードがモニターモードに設定されました。 iwconfigで確認してみましょう。

                        $ iwconfig
                    

Mode:Monitorとなっていると思います。 Managedに戻す場合は、monitorの部分をmanagedに変えてください。

次にさきほど、ip linkでdownにしたインターフェースをupにします。 これによってifconfigでも確認できるようになり、インターフェースが使えるように。

                        # Ubuntuの場合
                        $ sudo iwconfig wlp2s0 up
                        # ArchLinuxの場合
                        $ sudo ip link set up wlp2s0
                        # 次にどちらの場合も
                        $ ifconfig
                    

これで設定は完了です。

もし、ビーコンパケットを読んでカレントチャンネルを得た場合は、チャンネルを変える必要が出てくるかもしれません。 チャンネルを変える場合は下記のように実行してください。

この場合はチャンネルを8に変えてください。

                        $ sudo iwconfig wlp2s0 channel 8
                    

キャプチャ

設定を完了させたので、いよいよキャプチャを行います。

wiresharkを起動してください。

                    $ sudo wireshark
                

ここからはいつもどおりのパケットキャプチャです。 wiresharkの説明を見ながらインターフェースをwlp2s0など無線LANカードに設定して、キャプチャを行ってください。

おわりに

いかがでしたでしょうか。 わからないことなどがありましたら、ご質問だくさい。

2015/7/28

参考サイト

Linuxの固定IP設定

目的

今回はLinuxの固定IPの設定についてです。

サーバや組み込みなどではDHCPを用いたIPアドレスの割当ではなく、事前にデバイスとIPアドレスが関連付けられている固定IPの方が多く用いられます。

今回は、そんな任意のIPアドレスの割当方法をやっていきたいと思います。

方法

では、ここからはIPアドレスの設定を行っていきます。

Linuxの中でも、ディストリビューションによって採用するソフトが変わるため、今回はArchLinuxなどnetctlを使うOSをメインにやっていきます。

準備

まずは下記のものを用意してください

  1. ネットワークに接続したLinuxマシン

以上です。

一時的なIPアドレスの割当

この方法では、再起動すると設定が初期化されてしまうので、恒久的な設定をしたい場合は後述の方法で行ってください。

この方法は、接続したDHCP機能がないデバイスと通信がしたいときなどに一時的に使用します。

まずは、設定するデバイス名を調べてください。

                        $ ifconfig
                    

ArchLinuxの場合

ipを使って一時的に設定します。

デバイス名がわかったら、下記のコマンドを実行します。IPアドレス、サブネットマスク、デバイス名は適宜設定してください。

                            $ sudo ip addr add 192.168.7.2/24 dev enp4s0"
                        

もう一度ifconfigで確認して、IPアドレスが割り当てられていたら成功です。

恒久的なIPアドレスの割当

この方法で設定したIPアドレスは再起動しても設定が維持されます。

多くの場合はこちらの方法を使います。

まずは、設定するデバイス名を調べてください。

                        $ ifconfig
                    

ArchLinuxの場合

ArchLinuxはnetctlを採用しているため、設定にはnetctlを使います。

特徴として、デバイスごとに設定ファイルを作成して有効にします。

まずは、設定ファイルのテンプレートをコピーします。

                            $ sudo cp /etc/netctl/examples/ethernet-static /etc/netctl/staticip
                        

コピーしてきたファイルは下記のようなものになっています。

                           Description='A basic static ethernet connection'
                           Interface=eth0
                           Connection=ethernet
                           IP=static
                           Address=('192.168.1.23/24' '192.168.1.87/24')
                           #Routes=('192.168.0.0/24 via 192.168.1.2')
                           Gateway='192.168.1.1'
                           DNS=('192.168.1.1')
                        

インターフェイスやIPアドレスなどは適宜設定してください。

私の環境では、下記のように設定ました。

                           Description='A basic static ethernet connection'
                           Interface=enp4s0
                           Connection=ethernet
                           IP=static
                           Address=('192.168.1.23/24')
                           Gateway='192.168.1.1'
                           DNS=('8.8.8.8')
                        

ファイルを保存したら次に、有効にします。

                            $ sudo netctl enable staticip
                        

再起動後に固定IPが有効になります。

                            $ sudo reboot
                        

2015/10/21追記
上記方法ではうまくいかない場合があります。 その場合は下記方法を試してみてください。

                            $ sudo systemctl stop netctl-ifplugd@eth0
                            $ sudo netctl stop-all
                            $ sudo systemctl disable netctl-ifplugd@eth0.service
                            $ sudo systemctl enable netctl@eth0
                            $ sudo netctl enable staticip
                        

Ubuntu・Debianの場合

UbuntuやDebianでは、/etc/network/interfacesを編集することで実現します。

/etc/network/interfacesを開いてください。
ファイルには下記のようなものが書いてあると思います。

                            auto lo
                            iface lo inet loopback
                        

これはloの設定です。

今回は、さらにこれに設定したいデバイスの情報を追加していきます。

このファイルの下に下記の情報を追加してください。 デバイス名・アドレス・ネットマスクは適宜変更してください。

                            auto eth0
                            iface eth0 inet static
                            address 192.168.1.200
                            netmask 255.255.255.0
                            gateway 192.168.1.1
                            dns-nameservers 8.8.8.8
                        

ファイルを保存し、再起動後に固定IPが有効になります。

                            $ sudo reboot
                        

おわりに

わからないことなどがありましたら、ご質問だくさい。

2015/7/02