Ubuntu(16.04)

#0 はじめに
今までCentOSしか使ったことがありませんでした。
はじめてUbuntuをインストールしたときに使った機能や設定変更のまとめです。


#1 環境
VMware Workstation 12 Player上のゲストマシンです。

```
root@server:~# cat /etc/issue
Ubuntu 16.04 LTS \n \l

root@server:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"

root@server:~# uname -a
Linux server 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```


#2 使用するISOイメージ
下記サイトより、ubuntu-ja-16.04-desktop-amd64.isoをダウンロードしました。
https://www.ubuntulinux.jp/download/ja-remix


#3 設定変更
##3.1 multi-userターゲットに変更
GUIを使うと、PCの操作が非常に重くなるため、CUIに設定変更しました。

```
root@server:~# systemctl get-default
graphical.target

root@server:~# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.

root@server:~# systemctl get-default
multi-user.target
```

##3.2 NICの名前変更
NICの名前をPNIN(Predictable Network Interface Names)から従来の命名方法(eth0,eth1...)に変更しました。

```
root@server:~# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="biosdevname=0 net.ifnames=0"

root@server:~# grub-mkconfig -o /boot/grub/grub.cfg

update-grubでもOKです。
root@server:~# update-grub

man update-grubより抜粋
 >update-grub is a stub for running grub-mkconfig -o /boot/grub/grub.cfg to generate a grub2 config file.
```

##3.3 エディタの変更
Ubnutuでは標準エディタとしてnanoが起動するようです。
私はCentOSではviを使っているので、標準エディタをnanoからviに変更しました。
変更方法は以下のとおりです。

```
私の場合、ホームディレクトリに.bashrcがなかったので、/etc/skelよりコピーしました。
root@server:~# cp /etc/skel/.bashrc ~/

コピーした.bashrcに下記環境変数を追加する。
root@server:~# vi .bashrc
root@server:~# cat .bashrc
-中略-
export EDITOR=vi
```

##3.4 ユニット定義ファイルの場所
Ubuntuではユニット定義ファイルがインストールされる場所がCentOSとは異なるようです。

|OS名         | デフォルト             | カスタマイズ        |
|:-----------|:-----------------------|:-------------------|
|CentOS7.3   |/usr/lib/systemd/system |/etc/systemd/system |
|Ubuntu16.04 |/lib/systemd/system     |/etc/systemd/system |

「デフォルト」とは、yumやaptでパッケージをインストールするとき、
ユニット定義ファイルがインストールされる場所です。
「カスタマイズ」とは、デフォルトにインストールしたユニット定義ファイルを変更して使う場合に
変更したユニット定義ファイルを置く場所です。
カスタマイズはCentOSとUbuntuで違いはないようです。

##3.5 IPアドレスの設定
NetworkManagerのnmtuiコマンドを使ってIPアドレスを設定していましたが、
NetworkManagerを停止した状態でIPアドレスを設定してみました。
NetworkManagerを停止すると、IPアドレスやデフォルトGW等の情報は下記ファイルに設定する必要があります。
ただし、CentOSとUbuntuでは以下のように異なります。
・CentOS：/etc/sysconfig/network-scripts/ifcfg-eth0
・Ubuntu：/etc/network/interfaces

```
NetworkManagerを停止する。
root@server:~# systemctl stop NetworkManager

"auto eth0"以下を追加しました。
root@server:~# vi /etc/network/interfaces
root@server:~# cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
  address 192.168.0.220/24
  gateway 192.168.0.1

システムを再起動する。
root@server:~# shutdown -r now

ちなみに、nmtuiコマンドで設定したIPアドレス等の情報は、下記ファイルに保存されます。
root@server:~# cat /etc/NetworkManager/system-connections/eth0
[connection]
id=eth0
-以下、略-
```

##3.6 ロケールの変更
日本語表示を英語表示に変更する方法を以下に示します。

```
bashrcに環境変数を設定する。
root@server:~# vi .bashrc
export LANG=en_US.utf8

root@server:~# source .bashrc
```




#4 Proxy設定
Proxyがある環境（とくに会社）で必要な設定です。
##4.1 apt-getの場合

```
usernameとpasswordは、proxy認証時に使うものを指定する。
また、proxyのホスト名やポート番号は、実際の環境にあわせて変更してください。
下記の例はポート番号は8080の使用を想定しています。
root@server:~# vi /etc/apt/apt.conf.d/90proxy
root@server:~# cat /etc/apt/apt.conf.d/90proxy
Acquire::http::proxy "http://username:password@proxy.co.jp:8080/";
Acquire::https::proxy "https://username:password@proxy.co.jp:8080/";
```

##4.2 wgetの場合
##4.3 curlの場合


#5 aptコマンドの使い方
リポジトリからパッケージを取得してインストール/アップデートをするコマンドです。
CentOSのyumコマンドに相当します。
aptコマンドの使い方は下記を参考にしました。
[第327回　aptコマンドを使ってみよう](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0327)
[Ubuntu16.04ではapt-getでなくaptコマンド](http://blog.treedown.net/entry/2017/03/25/010000)
[Ubuntu 16.04 / Debian 8: aptコマンドの使い方](https://www.hiroom2.com/2016/05/12/ubuntu-16-04-debian-8%E3%81%AEapt%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

## 5.1 インストール方法(install)

```
root@server:~/apt# apt install hping3
-以下、略-
```

## 5.2 アンインストール方法(remove)
```
root@server:~/apt# apt remove hping3
-以下、略-
```

## 5.3 アンインストール方法(purge)
removeは、設定ファイルが削除されず残ってしまいます。purgeを使うと、設定ファイルも削除できます。

```
root@server:~# apt purge apache2
-以下、略-
```


##5.4 パッケージの検索方法（完全一致:list)

```
root@server:~/apt# apt list hping3
一覧表示... 完了
hping3/xenial,now 3.a2.ds2-7 amd64 [インストール済み]

```

##5.5 パッケージの検索方法（部分一致:search)

```
root@server:~/apt# apt search hping3
ソート中... 完了
全文検索... 完了
hping3/xenial,now 3.a2.ds2-7 amd64 [インストール済み]
  Active Network Smashing Tool

hping3-dbgsym/xenial 3.a2.ds2-7 amd64
  debug symbols for package hping3
```

## 5.6 ソースパッケージのインストール方法
[Ubuntu 16.04: apt sourceでソースコードをダウンロードする](https://www.hiroom2.com/2016/07/14/ubuntu-16-04-apt-source%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B/)
[独自Debパッケージやaptリポジトリを使ったサーバー管理術](http://knowledge.sakura.ad.jp/tech/1123/)

###5.6.1 事前準備

```
ソースパッケージのリポジトリのコメントアウトを削除する。
root@server:~/test# grep deb-src /etc/apt/sources.list
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates universe
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://archive.canonical.com/ubuntu xenial partner
# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
# deb-src http://security.ubuntu.com/ubuntu xenial-security universe
# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

ソースパッケージのリポジトリを確認する。コメントが削除できたことがわかる。
root@server:~/test# grep deb-src /etc/apt/sources.list
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://archive.canonical.com/ubuntu xenial partner
deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

リポジトリのデータベースを更新する。
root@server:~# apt -y update
```

###5.6.2 ソースパッケージのダウンロード

```
ipコマンドのパスを調べる。
root@server:~/test# which ip
/sbin/ip

ipコマンドはiproute2パッケージに含まれていることがわかる。
root@server:~/test# dpkg -S /sbin/ip
iproute2: /sbin/ip

iproute2のソースパッケージをダウンロードする。
root@server:~/test# apt source iproute2
-中略-

ダウンロードしたソースパッケージを確認する。
root@server:~/test# ls
root@server:~/test# ls -F
iproute2-4.3.0/  iproute2_4.3.0-1ubuntu3.16.04.1.debian.tar.xz  iproute2_4.3.0-1ubuntu3.16.04.1.dsc  iproute2_4.3.0.orig.tar.xz

```

###5.6.3 ソースパッケージのダウンロード(カーネルソースコード）
カーネルのソースパッケージのダウンロードは[ここ](https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel)を参考にしました。

```
root@server:~/test# uname -r
4.4.0-21-generic

root@server:~/test# apt source linux-image-4.4.0-21-generic
パッケージリストを読み込んでいます... 完了
'linux-image-4.4.0-21-generic' の代わりに 'linux' をソースパッケージとして選出しています
注意: 'linux' パッケージは以下の場所の 'Git' バージョン制御システムで保守されています:
git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial
パッケージの最新の (まだリリースされていないかもしれない) 更新を取得するには、
git clone git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial
を使用してください。
146 MB のソースアーカイブを取得する必要があります。
-以下、略-

ダウンロードしたソースを確認する。
root@server:~/test# ls -F
linux-4.4.0/  linux_4.4.0-96.119.diff.gz  linux_4.4.0-96.119.dsc  linux_4.4.0.orig.tar.gz
```

##5.7 インストール可能なパッケージを調べる方法(apt-cache policy)

```
hping3はまだインストールされていない。
root@server:~# hping3
プログラム 'hping3' はまだインストールされていません。 次のように入力することでインストールできます:
apt install hping3

インストール可能なパッケージを調べる。3.a2.ds2-7のhping3がインストールできることがわかる(★)。
root@server:~# apt-cache policy hping3
hping3:
  インストールされているバージョン: (なし)
  候補:               3.a2.ds2-7
  バージョンテーブル:
     3.a2.ds2-7 500　★
        500 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages

hping3パッケージをインストールする。
root@server:~# apt-get -y install hping3

インストールされたバージョンが3.a2.ds2-7になったことがわかる(★)。
root@server:~# apt-cache policy hping3
hping3:
  インストールされているバージョン: 3.a2.ds2-7 ★
  候補:               3.a2.ds2-7
  バージョンテーブル:
 *** 3.a2.ds2-7 500
        500 http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
        100 /var/lib/dpkg/status
```


##5.8 インストール可能なバージョンの一覧を調べる方法(apt-cache madison)

```
root@server:~# apt-cache madison hping3
    hping3 | 3.a2.ds2-7 | http://jp.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
    hping3 | 3.a2.ds2-7 | http://jp.archive.ubuntu.com/ubuntu xenial/universe Sources
```


##5.9 aptコマンドの操作履歴の確認方法

```
hping3パッケージをインストールする。
root@server:~/apt# apt install hping3

操作履歴を確認する。
root@server:~# less /var/log/apt/history.log
Start-Date: 2017-09-20  11:44:43
Commandline: apt install hping3
Requested-By: hana_shin (1000)
Install: hping3:amd64 (3.a2.ds2-7)
End-Date: 2017-09-20  11:44:45
```




#6 dpkgコマンドの使い方
##6.1 パッケージ一覧の表示方法(dpkg -l)
CentOSの"rpm -qa"に相当する。

```
root@server:~# dpkg -l 
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前                                  バージョン                              アーキテクチ 説明
+++-=====================================-=======================================-============-================================================================================
ii  a11y-profile-manager-indicator        0.1.10-0ubuntu3                         amd64        Accessibility Profile Manager - Unity desktop indicator
ii  account-plugin-facebook               0.12+16.04.20160126-0ubuntu1            all          GNOME Control Center account plugin for single signon - facebook
ii  account-plugin-flickr                 0.12+16.04.20160126-0ubuntu1            all          GNOME Control Center account plugin for single signon - flickr
ii  account-plugin-google                 0.12+16.04.20160126-0ubuntu1            all          GNOME Control Center account plugin for single signon
-以下、略-
```

##6.2 パッケージに含まれているファイルの表示方法(-L)
CentOSの"rpm -ql"に相当する。

```
root@server:~# dpkg -L bc
/.
/usr
/usr/bin
/usr/bin/bc
/usr/share
/usr/share/doc
/usr/share/doc/bc
/usr/share/doc/bc/README
/usr/share/doc/bc/bc.html
/usr/share/doc/bc/examples
/usr/share/doc/bc/examples/ckbook.b
/usr/share/doc/bc/examples/pi.b
/usr/share/doc/bc/examples/primes.b
/usr/share/doc/bc/examples/twins.b
/usr/share/doc/bc/NEWS.gz
/usr/share/doc/bc/copyright
/usr/share/doc/bc/AUTHORS
/usr/share/doc/bc/changelog.Debian.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/bc.1.gz
/usr/share/doc-base
/usr/share/doc-base/bc
/usr/share/menu
/usr/share/menu/bc
/usr/share/info
/usr/share/info/bc.info.gz
```

##6.3 コマンドが含まれているパッケージ名を調べる方法(-S)
CentOSの"rpm -qf"に相当する。

```
コマンドのパス名を調べる。
root@server:~# which bc
/usr/bin/bc

コマンドのパス名をもとに、パッケージ名を調べる。bcコマンドはbcパッケージに含まれていることがわかる。
root@server:~# dpkg -S /usr/bin/bc
bc: /usr/bin/bc

bcパッケージのバージョンは"1.06.95-9build1"だとわかる。
root@server:~# dpkg -l |grep -w bc
||/ 名前               バージョン                  アーキテクチ 説明
+++-==================-===========================-============-================================================================================
ii  bc                 1.06.95-9build1             amd64        GNU bc arbitrary precision calculator language
```

##6.3 パッケージを削除する方法(-r)

```
root@server:~# dpkg -r tcpdump
(Reading database ... 216276 files and directories currently installed.)
Removing tcpdump (4.9.2-0ubuntu0.16.04.1) ...
Processing triggers for man-db (2.7.5-1) ...

```


##6.5 パッケージの詳細情報を確認する方法(apt show)

```
bcコマンドのパスを調べる。
root@server:~# which bc
/usr/bin/bc

bcコマンドが入っているパッケージ名を調べる。bcパッケージであることがわかる。
root@server:~# dpkg -S /usr/bin/bc
bc: /usr/bin/bc

bcパッケージの詳細情報を確認する。
root@server:~# apt show bc
Package: bc
Version: 1.06.95-9build1
Priority: optional
Section: math
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Ryan Kavanagh <rak@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 246 kB
Depends: libc6 (>= 2.14), libreadline6 (>= 6.0)
Homepage: http://ftp.gnu.org/gnu/bc/
Task: ubuntu-desktop, ubuntu-usb, print-server, kubuntu-desktop, edubuntu-desktop, edubuntu-usb, xubuntu-core, xubuntu-desktop, mythbuntu-desktop, lubuntu-core, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntu-gnome-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-mate-cloudtop
Supported: 5y
Download-Size: 82.6 kB
APT-Manual-Installed: yes
APT-Sources: http://jp.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
Description: GNU bc: 任意精度の計算言語
 GNU bc is an interactive algebraic language with arbitrary precision which
 follows the POSIX 1003.2 draft standard, with several extensions including
 multi-character variable names, an `else' statement and full Boolean
 expressions.  GNU bc does not require the separate GNU dc program.
```

#7 サービスの起動、確認、停止方法(systemctl)
##7.1 サービスの起動方法
```
root@server:~# systemctl start ufw
root@server:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
   Active: active (exited) since 日 2017-09-17 19:39:27 JST; 33s ago
  Process: 1300 ExecStop=/lib/ufw/ufw-init stop (code=exited, status=0/SUCCESS)
  Process: 1312 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
 Main PID: 1312 (code=exited, status=0/SUCCESS)

 9月 17 19:39:27 server systemd[1]: Starting Uncomplicated firewall...
 9月 17 19:39:27 server systemd[1]: Started Uncomplicated firewall.
 9月 17 19:39:56 server systemd[1]: Started Uncomplicated firewall.
```

##7.2 サービスの停止方法
```
root@server:~# systemctl stop ufw
root@server:~# systemctl status ufw
● ufw.service - Uncomplicated firewall
   Loaded: loaded (/lib/systemd/system/ufw.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2017-09-17 19:41:01 JST; 1s ago
  Process: 1321 ExecStop=/lib/ufw/ufw-init stop (code=exited, status=0/SUCCESS)
  Process: 1312 ExecStart=/lib/ufw/ufw-init start quiet (code=exited, status=0/SUCCESS)
 Main PID: 1312 (code=exited, status=0/SUCCESS)

 9月 17 19:39:27 server systemd[1]: Starting Uncomplicated firewall...
 9月 17 19:39:27 server systemd[1]: Started Uncomplicated firewall.
 9月 17 19:39:56 server systemd[1]: Started Uncomplicated firewall.
```

#8 ファイアウォール(ufw)
ufwの使い方は[ここ(ufwコマンドの使い方)](https://qiita.com/hana_shin/items/a630871dce209cff04f3#7-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3application-integration%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)に移動しました。


#9 時刻同期
NTPのインストールは[ここ](https://help.ubuntu.com/lts/serverguide/NTP.html)を参考にしました。

##9.1 NTPパッケージのインストール
```
root@server:~# apt-get -y install ntp
```

##9.2 NTPサーバの登録

```
デフォルトだと非常に多くのNTPサーバと時刻同期をしていました。
自宅環境の時刻精度は重要ではないので、NICTのNTPサーバ(ntp.nict.jp)だけにしました。
root@server:~# vi /etc/ntp.conf
server ntp.nict.jp
```

##9.3 NTPの再起動
```
root@server:~# systemctl restart ntp
root@server:~# systemctl status ntp
● ntp.service - LSB: Start NTP daemon
   Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
   Active: active (running) since 日 2017-09-17 19:49:28 JST; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 4951 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
  Process: 4964 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
    Tasks: 2 (limit: 512)
   CGroup: /system.slice/ntp.service
           mq4975 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 122:129

 9月 17 19:49:28 server ntpd[4975]: Listen normally on 2 lo 127.0.0.1:123
 9月 17 19:49:28 server ntpd[4975]: Listen normally on 3 eth0 192.168.0.220:123
 9月 17 19:49:28 server ntpd[4975]: Listen normally on 4 lo [::1]:123
```

##9.4 NTPサーバの確認

```
時刻同期しているサーバを確認する。左端に*が付いたサーバが現在同期中のNTPサーバです。
root@server:~# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*golem.canonical 17.253.34.253    2 u   11   64   37  248.200    1.250   3.514
```

#10 AppArmorの使い方




#11 カーネルメッセージ
CentOSでは/var/log/messagesにカーネルメッセージが保存されていましたが、
Ubuntuでは/var/log/syslogに保存されるようです。

```
root@server:~# cat /var/log/syslog
Sep 17 18:24:13 server rsyslogd: [origin software="rsyslogd" swVersion="8.16.0" x-pid="672" x-info="http://www.rsyslog.com"] start
Sep 17 18:24:13 server systemd-modules-load[326]: Inserted module 'lp'
Sep 17 18:24:13 server systemd-modules-load[326]: Inserted module 'ppdev'
```

#12 カーネルのデバッグ方法
##12.1 カーネルシンボル情報のインストール
crashやsystemtapを使うためには、カーネルのシンボル情報が必要です。
まず、カーネルのシンボル情報をインストールします。
インストール方法は、[ここ](https://wiki.ubuntu.com/Kernel/Systemtap)を参考にしました。

```
root@server:~# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C8CAB6595FDFF622
Executing: /tmp/tmp.lpyWq7rDI1/gpg.1.sh --keyserver
keyserver.ubuntu.com
--recv-keys
C8CAB6595FDFF622
gpg: 鍵5FDFF622をhkpからサーバkeyserver.ubuntu.comに要求
gpg: 鍵5FDFF622: 公開鍵"Ubuntu Debug Symbol Archive Automatic Signing Key (2016) <ubuntu-archive@lists.ubuntu.com>"をインポートしました
gpg: 処理数の合計: 1
gpg:               インポート: 1  (RSA: 1)
root@server:~#

コード名を調べる。xenialであることがわかる。
root@server:~# lsb_release -c|awk  '{print $2}'
xenial

コード名の"xenial"を入れたリポジトリを作成する。
root@server:~# vi /etc/apt/sources.list.d/ddebs.list
root@server:~# cat /etc/apt/sources.list.d/ddebs.list
deb http://ddebs.ubuntu.com/ xenial      main restricted universe multiverse
deb http://ddebs.ubuntu.com/ xenial-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ xenial-updates  main restricted universe multiverse
deb http://ddebs.ubuntu.com/ xenial-proposed main restricted universe multiverse

root@server:~# apt-get update
root@server:~# apt-get install linux-image-$(uname -r)-dbgsym
```



##12.2 crashコマンドのインストールと起動方法
crashコマンドの使い方は[「crashコマンドの使い方」](http://qiita.com/hana_shin/items/02d8da181c8287580613)を参照ください。

```
root@server:~# apt-get -y install crash
root@server:~# crash --version
crash 7.1.4

crashコマンドを実行する。
root@server:~# crash /usr/lib/debug/boot/vmlinux-4.4.0-21-generic /boot/System.map-4.4.0-21-generic

システムの状態を確認する。
crash> sys
  SYSTEM MAP: /boot/System.map-4.4.0-21-generic
DEBUG KERNEL: /usr/lib/debug/boot/vmlinux-4.4.0-21-generic (4.4.0-21-generic)
    DUMPFILE: /proc/kcore
        CPUS: 2
        DATE: Sun Sep 17 20:25:49 2017
      UPTIME: 00:52:42
LOAD AVERAGE: 0.50, 0.54, 0.37
       TASKS: 248
    NODENAME: server
     RELEASE: 4.4.0-21-generic
     VERSION: #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016
     MACHINE: x86_64  (2394 Mhz)
      MEMORY: 2 GB
```

##12.3 systemtapのインストール
systemtapの使い方は[「SystemTapの使い方」](http://qiita.com/hana_shin/items/9b265b4f9a51f98d0f4d)を参照ください。

```
root@server:~# apt-get install -y systemtap gcc
root@server:~# stap -V
Systemtap translator/driver (version 2.9/0.165, Debian version 2.9-2ubuntu2 (xenial))
Copyright (C) 2005-2015 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI LIBSQLITE3 NLS NSS TR1_UNORDERED_MAP

スクリプトを作成する。
root@server:~# vi tp.stp
root@server:~# cat tp.stp
probe kernel.function("ip_output@net/ipv4/ip_output.c")
{
  printf("TIME=%s\n",  tz_ctime(gettimeofday_s()))
}

スクリプトを実行する。
root@server:~# stap -vg tp.stp
Pass 1: parsed user script and 110 library script(s) using 117708virt/44180res/6596shr/37696data kb, in 290usr/50sys/340real ms.
Pass 2: analyzed script: 1 probe(s), 6 function(s), 1 embed(s), 0 global(s) using 197928virt/123320res/7480shr/117916data kb, in 1170usr/70sys/1277real ms.
Pass 3: translated to C into "/tmp/stapI6G0gv/stap_f057be4753d03b9f213541f28024aadf_5310_src.c" using 197928virt/123576res/7736shr/117916data kb, in 10usr/0sys/16real ms.
Pass 4: compiled C into "stap_f057be4753d03b9f213541f28024aadf_5310.ko" in 19720usr/3750sys/26960real ms.
Pass 5: starting run.
TIME=Sun Sep 17 20:35:34 2017 JST
TIME=Sun Sep 17 20:35:34 2017 JST
TIME=Sun Sep 17 20:35:34 2017 JST
-以下、略-
```

#13 アプリケーションのデバッグ方法
##13.1 coreファイルの採取設定

```
coreファイルサイズを確認する。0バイトになっている。
root@server:~# ulimit -c
0

coreファイルサイズを無限大に設定する。
root@server:~# ulimit -c unlimited
root@server:~# ulimit -c
unlimited

生成するcoreファイル名にプロセス名とPIDを含めるように設定する。
root@server:~# echo 'core.%e.%p' > /proc/sys/kernel/core_pattern

sleepプロセスを生成する。
root@server:~/core# sleep 600&
[1] 15914

sleepプロセスのPIDを確認する。PID=15914であることがわかる。
root@server:~/core# ps -C sleep
   PID TTY          TIME CMD
 15914 pts/1    00:00:00 sleep

sleepプロセス(PID=15914)にSIGSEGVを送信する。
root@server:~/core# kill -SIGSEGV 15914
root@server:~/core#
[1]+  Segmentation fault      (コアダンプ) sleep 600

ファイルを確認する。sleepのcoreファイルが生成されたことがわかる。
root@server:~/core# ls
core.sleep.15914
```

##13.2 シンボル情報のインストール
アプリケーションのシンボル情報のインストールは[ここ](https://doss.eidos.ic.i.u-tokyo.ac.jp/html/gdb_step_into_libraries.html)を参考にしました。

```
root@server:~/core# ls
core.sleep.16759
root@server:~/core# which sleep
/bin/sleep

gdbを起動する。sleepにシンボル情報が含まれていない旨のメッセージが表示される。
root@server:~/core# gdb /bin/sleep core.sleep.16759
-中略-
Reading symbols from /bin/sleep...(no debugging symbols found)...done

sleepが含まれているパッケージを調べる。coreutilsパッケージにsleepが含まれていることがわかる。
root@server:~/core# which sleep
/bin/sleep
root@server:~/core# dpkg -S /bin/sleep
coreutils: /bin/sleep

シンボル情報が含まれたcoreutilsパッケージを検索する。coreutils-dbgsym というパッケージであることがわかる。
root@server:~/core# apt-cache search coreutils
coreutils-dbgsym - debug symbols for package coreutils

coreutils-dbgsym パッケージをインストールする。
root@server:~/core# apt-get -y install coreutils-dbgsym

バックトレースを表示する。シンボル名が表示されていることがわかる。
(gdb) bt full
#0  0x00007f193f4512f0 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
No locals.
#1  0x00000000004040bf in rpl_nanosleep (requested_delay=requested_delay@entry=0x7fff704ffff0,
    remaining_delay=remaining_delay@entry=0x0) at lib/nanosleep.c:85
        limit = 2073600
        seconds = 600
        intermediate = {tv_sec = 600, tv_nsec = 0}
#2  0x0000000000403f18 in xnanosleep (seconds=seconds@entry=600) at lib/xnanosleep.c:51
        ts_sleep = {tv_sec = 600, tv_nsec = 0}
#3  0x000000000040169a in main (argc=<optimized out>, argv=<optimized out>) at src/sleep.c:145
        i = <optimized out>
        seconds = <optimized out>
        ok = <optimized out>
```

#14 カーネルを変更する方法
下記情報を参考にしました。
[grubでブートするカーネルを変更する方法](http://sweng.web.fc2.com/ja/linux/ubuntu/change-default-boot-kernel.html)
[Ubuntu 12.10のGRUB2でデフォルトカーネルを変更するにはどうしたらいいの？](http://syuu1228.hatenablog.com/entry/20130120/1358690996)
[Submenu Designation Examples](https://help.ubuntu.com/community/Grub2/Submenus#Submenu_Designation_Examples)

```
現在のカーネル版数を確認する。
root@server:~# uname -r
4.4.0-96-generic

GRUBの設定ファイルに指定できる文字列は''で囲まれた部分のようです。
root@server:~# less /boot/grub/grub.cfg
menuentry 'Ubuntu, with Linux 4.4.0-96-generic' --class ubuntu
menuentry 'Ubuntu, with Linux 4.4.0-96-generic (upstart)' --class ubuntu
menuentry 'Ubuntu, with Linux 4.4.0-96-generic (recovery mode)' --class ubuntu
menuentry 'Ubuntu, with Linux 4.4.0-21-generic' --class ubuntu
menuentry 'Ubuntu, with Linux 4.4.0-21-generic (upstart)' --class ubuntu
menuentry 'Ubuntu, with Linux 4.4.0-21-generic (recovery mode)' --class ubuntu

GRUB_HIDDEN_TIMEOUTを以下のように変更する。
root@server:~# vi /etc/default/grub
#GRUB_HIDDEN_TIMEOUT=0
GRUB_DEFAULT="Ubuntu, with Linux 4.4.0-21-generic"

GRUBの設定ファイルを更新する。しかし、Warningメッセージが表示(★)される。
root@server:~# update-grub
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Linux イメージを見つけました: /boot/vmlinuz-4.4.0-96-generic
Found initrd image: /boot/initrd.img-4.4.0-96-generic
Linux イメージを見つけました: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
★Warning: Please don't use old title `Ubuntu, with Linux 4.4.0-21-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-21-generic' (for versions before 2.00) or `gnulinux-advanced-0879c06f-f8f7-4639-b623-75033afdddec>gnulinux-4.4.0-21-generic-advanced-0879c06f-f8f7-4639-b623-75033afdddec' (for 2.00 or later)
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
完了

仮想マシンを再起動する。
root@server:~# shutdown -r now

カーネル版数を確認する。版数が変更されていないことがわかる。
root@server:~# uname -r
4.4.0-96-generic


Warningメッセージにしたがって、GRUB_DEFAULTを以下のように変更する。
root@server:~# vi /etc/default/grub
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_DEFAULT="Ubuntu, with Linux 4.4.0-21-generic"
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-21-generic"

GRUBの設定ファイルを更新する。
root@server:~# update-grub

仮想マシンを再起動する。
root@server:~# shutdown -r now

カーネル版数を確認する。4.4.0-21-genericに変更できたことがわかる。
root@server:~# uname -r
4.4.0-21-generic

```

#15 conntrackコマンドのインストール方法

```
root@server:~# apt install conntrack
root@server:~# conntrack --version
conntrack v1.4.3 (conntrack-tools)
```


#メモ

```
root@server:~# apt install ulogd
root@server:~# echo "255" > /proc/sys/net/netfilter/nf_conntrack_log_invalid

root@server:~# tail -f  /var/log/ulog/syslogemu.log
Sep 20 21:16:05 server nf_ct_tcp: invalid packet ignored in state SYN_RECV  IN= OUT= MAC= SRC=192.168.0.220 DST=192.168.0.30 LEN=44 TOS=00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=11111 DPT=1684 SEQ=1379058353 ACK=1891276105 WINDOW=29200 ACK SYN URGP=0 MARK=0
Sep 20 21:16:07 server nf_ct_tcp: invalid packet ignored in state SYN_RECV  IN= OUT= MAC= SRC=192.168.0.220 DST=192.168.0.30 LEN=44 TOS=00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=11111 DPT=1684 SEQ=1379058353 ACK=1891276105 WINDOW=29200 ACK SYN URGP=0 MARK=0
-以下、略-
```


#X 参考情報
[debian パッケージの作成方法](http://www.rain.hyarc.nagoya-u.ac.jp/~satoki/main/Linux/configure/make_deb.html)
[debianパッケージのつくり方](http://itpass.scitec.kobe-u.ac.jp/seminar/lecture/fy2009/100305/pub/)

[ネットワークの設定](https://help.ubuntu.com/lts/serverguide/network-configuration.html)
[Network Manager](https://help.ubuntu.com/community/NetworkManager)