プログラミングとかLinuxとかの備忘録

プログラミング、Linuxでハマった箇所や環境構築のメモ

Debian9へdockerリポジトリを追加し最新のDocker環境を構築する

dockerのインストール

Get Docker CE for Debian | Docker Documentationのとおり、リポジトリを追加してインストールする。

$ sudo apt update
$ sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
OK

$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

$ sudo apt update
$ sudo apt -y install docker-ce docker-ce-cli containerd.io

docker-composeのインストール

リポジトリがなさそうなので直接インストールする。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

いろいろと設定

ユーザをdockerグループに追加し、dockerデーモンを自動起動するように設定する。

$ sudo gpasswd -a vild124 docker
Adding user vild124 to group docker

$ sudo systemctl enable docker
$ sudo reboot

Debian Stretchインストール後の設定メモ

リポジトリの設定

リポジトリのリストからcdromを削除する。
sudoが使えないのでsuしてから作業する。

$ su

# sed -i -e 's/^deb cdrom/# deb cdrom/' /etc/apt/sources.list

一応アップデートしておく

# apt update
# apt -y upgrade

sudoの有効化

sudoのコマンドのインストール

$ su
# apt -y install sudo 

ユーザをsudoグループに追加し、sudoできるようにする。

# gpasswd -a ユーザ名 sudo

ログインし直すとsudoできるようになる。

IPの固定

staticに変更し、IPアドレス等を追加。

$ sudo vim /etc/network/interfaces
#iface eth0 inet dhcp
iface eth0 inet static
address         192.168.1.5
network         192.168.1.0
netmask         255.255.255.0
broadcast       192.168.1.255
gateway         192.168.1.1
dns-nameservers 192.168.1.1

$ sudo ifdown eth0 && sudo ifup eth0

Ubuntu18.04でソフトウェアRAIDを組む

Ubuntu18.04でmdadmソフトウェアRAIDを組んでデータストレージとして使う

構成

ディスクの確認

/dev/sdc~/dev/sdfまでのHDD4本でRAID10を作る。

$ sudo parted -l | grep /dev/sd
Disk /dev/sda: 2000GB
Disk /dev/sdb: 240GB
Disk /dev/sdc: 1000GB
Disk /dev/sdd: 1000GB
Disk /dev/sde: 1000GB
Disk /dev/sdf: 1000GB

ファイルシステムの作成

まずHDD4本に対してpartedでパーティションを作成する。
(参考: LinuxでHDDのパーティションテーブル作成とフォーマット方法
また、RAIDのフラグをオンにする。

$ sudo parted /dev/sdc
(parted) mklabel gpt Y
(parted) mkpart ext4 0% 100%
(parted) set 1 raid on

次に、ファイルシステムを作成する

$ sudo mkfs -t ext4 /dev/sdc1

これを/dev/sdc~/dev/sdfの4本に対して実行。

RAIDアレイの構築

下記コマンドで、RAID10を4本のHDDで構築できる。
ファイルシステムを作成していないとそのHDDが出力に出力されない

$ sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[cdef]1
mdadm: /dev/sdc1 appears to contain an ext2fs file system
       size=976760832K  mtime=Thu Jan  1 00:00:00 1970
mdadm: /dev/sdd1 appears to contain an ext2fs file system
       size=976760832K  mtime=Tue Feb 26 06:19:05 2019
mdadm: /dev/sde1 appears to contain an ext2fs file system
       size=976760832K  mtime=Thu Jan  1 00:00:00 1970
mdadm: /dev/sdf1 appears to contain an ext2fs file system
       size=976760832K  mtime=Thu Jan  1 00:00:00 1970
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

構築経過は下のコマンドで確認できる。3時間ちょっとかかりそう。

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid10 sdf1[3] sde1[2] sdd1[1] sdc1[0]
      1953257472 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      [>....................]  resync =  0.3% (5872256/1953257472) finish=197.5min speed=164280K/sec
      bitmap: 15/15 pages [60KB], 65536KB chunk

unused devices: <none>

mdadmを設定する

$ sudo bash -c  'mdadm -Es | grep md/0 >> /etc/mdadm/mdadm.conf'

RAIDアレイの初期化

RAIDアレイを確認する

$ sudo parted -l
Error: /dev/md0: unrecognised disk label
Model: Linux Software RAID Array (md)
Disk /dev/md0: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags:

パーティションを作成(不要?)

$ sudo parted /dev/md0
(parted) mklabel gpt
(parted) mkpart ext4 0% 100%
(parted) quit

フォーマット

$ sudo mkfs -t ext4 /dev/md0
mke2fs 1.44.1 (24-Mar-2018)
Found a gpt partition table in /dev/md0
Proceed anyway? (y,N) y
Creating filesystem with 488314368 4k blocks and 122085376 inodes
Filesystem UUID: ac9462a0-e789-475e-86a6-55e4abb4ffc6
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

マウント(テスト)

$ sudo mount /dev/md0 /mnt

自動マウント

UUIDを確認

$ sudo blkid | grep /dev/md0
/dev/md0: UUID="ac9462a0-e789-475e-86a6-55e4abb4ffc6" TYPE="ext4"

/etc/fstabを編集

$ sudo vim /etc/fstab
UUID=ac9462a0-e789-475e-86a6-55e4abb4ffc6   /mnt    ext4    defaults,noatime    0 0

LinuxでUUIDでHDDをマウントする

UbuntuCentOS上でのUUID確認と/etc/fstabでの自動マウント方法

UUIDの確認

CentOS7でもUbuntu18.04でも、blkidの出力をgrepすればUUIDを確認できる。

$ sudo blkid | grep /dev/sdd1

CentOSの場合はUUID="..."の部分が必要

$ sudo blkid | grep /dev/sda1
/dev/sda1: UUID="eda3624c-15a5-4871-931e-5fbcaedcdfac" TYPE="ext4"

Ubuntuの場合はPARTUUID="..."の部分が必要

$ sudo blkid | grep /dev/sdd1
/dev/sdd1: PARTLABEL="ext4" PARTUUID="dd120623-d167-43d5-a372-ba77b4b4f15c"

コマンドでマウントする

UUID="..."PARTUUID="..."の部分をそのまま使用して

$ sudo mount -t ext4 UUID="..." /mnt

とか

$ sudo mount -t ext4 PARTUUID="..." /mnt

でマウントできる

自動マウント

自動マウントする場合は/etc/fstabにUUID="..."PARTUUID="..."の部分をそのまま使って書く。

$ sudo vim /etc/fstab
UUID="..."     /mnt/hdd    ext4    defaults    0 0
PARTUUID="..." /mnt/hdd    ext4    defaults    0 0

Ubuntu18.04でnvidia-dockerを動かす

Ubuntu16.04でnvidia-dockerを動かすのUbuntu18.04版。

構成

初期設定

インストール時に
- IPの固定 - SSHサーバの自動起動 は設定済みなのでアップデートのみ行う。

$ sudo apt update
$ sudo apt -y upgrade

CUDA

確認

以下のコマンドで,何も出てこないことを確認する

$ sudo dpkg -l | grep nvidia
$ sudo dpkg -l | grep cuda

Nvidiaドライバのインストール

リポジトリ(Proprietary GPU Drivers : “Graphics Drivers” team)
を登録して,ドライバをインストールする
途中で,secure bootを無効にするかを聞かれたが,無効にせずに続行した

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update

$ sudo apt search nvidia | egrep '^nvidia-[0-9]+/'
nvidia-304/bionic 304.137-0ubuntu2 amd64
nvidia-331/bionic-updates 340.107-0ubuntu0.18.04.2 amd64
nvidia-340/bionic-updates 340.107-0ubuntu0.18.04.2 amd64
nvidia-346/bionic 352.63-0ubuntu3 amd64
nvidia-352/bionic 361.45.11-0ubuntu4 amd64
nvidia-361/bionic 367.57-0ubuntu5 amd64
nvidia-367/bionic 375.82-0ubuntu3 amd64
nvidia-375/bionic 384.111-0ubuntu1 amd64
nvidia-384/bionic 390.87-0ubuntu0~gpu18.04.2 amd64
nvidia-387/bionic 390.87-0ubuntu0~gpu18.04.2 amd64
nvidia-390/bionic 390.87-0ubuntu0~gpu18.04.2 amd64

$ sudo apt -y install nvidia-390

再起動し,GPUが認識されているかを確認

$ sudo reboot

$ nvidia-smi
Fri Feb 22 04:36:58 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.87                 Driver Version: 390.87                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:41:00.0 Off |                  N/A |
|  0%   38C    P5    27W / 250W |      0MiB / 11156MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

dockerのインストール

docker-engine, docker-ce, docker-eeのいずれかのパッケージが依存関係として必要なので、Ubuntu公式リポジトリdocker.ioではnvidia-dockerを実行できない。
Get Docker CE for Ubuntu | Docker Documentation の通りにインストールする

$ sudo apt -y remove docker docker-engine docker.io containerd runc

$ sudo apt -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt update

$ sudo apt -y install docker-ce docker-ce-cli containerd.io
$ sudo gpasswd -a <ユーザ名> docker

$ sudo systemctl start docker
$ sudo systemctl enable docker

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nvidia-dockerのインストール

GitHub - NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUsの通りにインストールする

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu18.04/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt update

$ sudo apt -y install nvidia-docker2
$ sudo pkill -SIGHUP dockerd

テスト

$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
Fri Feb 22 04:42:24 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.87                 Driver Version: 390.87                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:41:00.0 Off |                  N/A |
|  0%   37C    P5    34W / 250W |      0MiB / 11156MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Ubuntuで不要になったリポジトリを削除する

sudo apt updateするといろいろとエラーが出るようになったので、使っていないnvidia-dockerのリポジトリを削除する。
ついでに、Nvidiaのグラフィックドライバのリポジトリも削除する

nvidia-dockerの削除

まずnvidia-docker2自体を削除する

$ sudo apt remove --purge nvidia-docker2
$ sudo apt -y autoremove

リポジトリリストを削除する

$ cd /etc/apt/sources.list.d
$ ls 
graphics-drivers-ubuntu-ppa-xenial.list       nvidia-docker.list
graphics-drivers-ubuntu-ppa-xenial.list.save  nvidia-docker.list.save

$ sudo rm nvidia-docker.list nvidia-docker.list.save

GPGキーを削除する

$ sudo apt-key list
/etc/apt/trusted.gpg
--------------------
...
pub   4096R/F796ECB0 2017-09-28
uid                  NVIDIA CORPORATION (Open Source Projects) <cudatools@nvidia.com>
...

$ sudo apt-key del F796ECB0
OK

これでapt-key listNvidiaのキーが表示されなくなる

updateしてみてもエラーが出なくなるはず

$ sudo apt update
Hit:1 http://jp.archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://jp.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]                            
Get:3 http://jp.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]                                                
Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]                                                   
Hit:5 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu xenial InRelease       
Get:6 https://download.docker.com/linux/ubuntu xenial InRelease [66.2 kB]         
Get:7 http://security.ubuntu.com/ubuntu xenial-security/main amd64 DEP-11 Metadata [67.9 kB]
Get:8 http://security.ubuntu.com/ubuntu xenial-security/main DEP-11 64x64 Icons [67.1 kB]
Get:9 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 DEP-11 Metadata [116 kB]
Get:10 http://security.ubuntu.com/ubuntu xenial-security/universe DEP-11 64x64 Icons [173 kB]
Get:11 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 DEP-11 Metadata [2,464 B]
Fetched 818 kB in 2s (312 kB/s)     
Reading package lists... Done
Building dependency tree       
Reading state information... Done

graphics-driversの削除

追加時にコマンド

$ sudo add-apt-repository ppa:graphics-drivers/ppa

でppaを使って追加したので

$ sudo add-apt-repository --remove ppa:graphics-drivers/ppa

だけで削除できる。

updateしてもちゃんと消えている

$ sudo apt update
Hit:1 http://jp.archive.ubuntu.com/ubuntu xenial InRelease
Get:2 http://jp.archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]                           
Get:3 http://jp.archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]                                   
Hit:4 https://download.docker.com/linux/ubuntu xenial InRelease                                                  
Hit:5 http://security.ubuntu.com/ubuntu xenial-security InRelease                                                
Fetched 216 kB in 0s (274 kB/s)
Reading package lists... Done
Building dependency tree       
Reading state information... Done

OpenVPNの"No server certificate verification method has been enabled"を解決する

DockerでOpenVPNサーバを動かす で構築したOpenVPNサーバに接続する時に接続はできるが下の警告が出るので、出ないように設定したい。

警告内容

WARNING: No server certificate verification method has been enabled.
See http://openvpn.net/howto.html#mitm for more info.

解決方法

メッセージに出ていたURLのページ(2x HOW TO | OpenVPN)を見てみる

  • remote-cert-tls server
    • OpenVPN 2.0以下の場合はこの設定をクライアントファイルに追加する?
  • ns-cert-type server
    • それ以外のバージョン?ではこの設定をクライアントファイルに追加する?

特にサーバ側の設定は必要なさそう。

ns-cert-type server

OpenVPNサーバのバージョンが2.4.6なのでこっちを試してみる。

クライアントの*.ovpnファイルの適当な位置にns-cert-type serverを追加

client
dev tun
proto udp
ns-cert-type server
...省略

接続してみると

WARNING: -ns-cert-type is DEPRECATED. Use --remote-cert-tls instead.

が表示されて接続できなくなった。

remote-cert-tls server

*.ovpnファイルの

ns-cert-type server

remote-cert-tls server

に書き換えて接続すると警告がなくなって接続できるようになった。