20201104のLinuxに関する記事は7件です。

ふつうのLinuxプログラミングをやってみる その5

有名な本らしいので買ってみました
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミングをやってみる その1
https://qiita.com/uturned0/items/b9ae846f2aff5865c074
ふつうのLinuxプログラミングをやってみる その2
https://qiita.com/uturned0/items/56beac990cdd6f1059ed
ふつうのLinuxプログラミングをやってみる その3
https://qiita.com/uturned0/items/675092da8aa89c4b1ff0
その4
https://qiita.com/uturned0/items/8f5765cfc0f0be8a1981
その5
https://qiita.com/uturned0/items/ab97deb489c994a836da


chapter 5

file descripter はただのint = streamの番号,IDのようなもの

どのprocessも3つのストリームがあって、file descripterが既知のものに鳴っている

fd 0 = standard input = マクロ名 STDIN_FILENO = path: /dev/stdin
fd 1 = standard output = マクロ名 STDOUT_FILENO = path: /dev/stdout
fd 2 = standard errour output = マクロ名 STDERR_FILENO = path: /dev/stderr

標準入力の標準はデフォルトという意味

$ cat
aaa
aaa

cat コマンドは引数なしだとstdinをstdout煮出すだけの動きをする。ストリームをin-outつないでるだけ。

$ cat < .bashrc
# .bashrc
# Source global definitions
...

ファイルを与えた時、catは実はファイルをreadするということをしていない!! シェルが勝手にファイルの中身をstdinとしてcatに渡しているだけ。 catは入力がファイルだということを知らない そうだったんだ!!!!!すげぇ!!

STDERRがあるのは、pipeしてると次のprocessのstdinに入って、気付かないから。stderrは特別に、その外に表示することになってる。アタマイイ。stdoutは機械向け、stderrは人間向け。なるほど。

read(2)

$ man 2 read すると

名前
read - ファイルディスクリプタから読み込む

書式

   #include <unistd.h>

   ssize_t read(int fd, void *buf, size_t count);    <---プロトタイプ宣言

ssize_t は符号付き整数型、size_tは符号なし整数型、つまり int/longなんだけど、kenelが違うとint型の仕様が違ったりするので、その際を隠蔽してる。必ずssize_tを使う。

C 言語のプロトタイプとは

先に名前、返り値だけ指定しといて、後で中身を書くやり方のやーつ

/* プロトタイプ宣言 */
void hello(void);

int main(void){
  ...長い処理
}

/* hello関数をあとで宣言 */
void hello(void){
  printf("Hello, World!\n");
}

https://webkaru.net/clang/function-declaration-prototypes/

人間が読める文字を格納するchar配列の最後は '\0 にするのが慣習。printfがそう。しかしread()は違う。
read()→printf()するとヤバい。

この本のストリームとは

file descripterで表現され、read() write() を呼べるもののこと

fileをopenすると read/writeできるものが作られる。そこにはストリームがある。
pipe/network socketもストリームの仲間。

open(2)

$ man 2 open
名前
       open, creat - ファイルやデバイスのオープン、作成を行う

書式
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

openはpathにつながるストリームを作成し、そのストリームを指す file descripterを返す ほう。socketみたいなものを開いて、そのIDを返すのか。なるほど

2nd argのflagは O_RDONLY, O_WRONLY, O_RDWR 文字通りr・w・rw

書き込む場合(O_WRONLY or O_RDWR) は追加のflagを一緒に2nd argに入れられるぽい

O_CREAT if not exist, create a file
O_EXCL if exist return error
O_TRUNC if exist make the file empty
O_APPEND 追記していく

close()

ファイルを閉じる=ストリームを破棄する=close()
kernelがprocess終了時に全streamは破棄してくれる。プロセスが使える同時ストリーム数は制限がある。
close()したほうがよさげ。

cat コマンドを作る

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static void do_cat(const char *path);
static void die(const char *s);

int
main(int argc, char *argv[])
{
    int i;
    if (argc < 2) {
        fprintf(stderr, "%s: file name not given\n", argv[0]);
        exit(1);
    }
    for (i=1; i<argc; i++) {
        do_cat(argv[i]);
    }
    exit(0);
}

#define BUFFER_SIZE 2048

static void
do_cat(const char *path)
{
    int fd;
    unsigned char buf[BUFFER_SIZE];
    int n;

    fd = open(path, O_RDONLY);
    if (fd < 0) die(path);
    for (;;) {
        n = read(fd, buf, sizeof buf);
        if (n < 0) die(path);
        if (n == 0) break;
        if (write(STDOUT_FILENO, buf, n) < 0) die (path);
    }
    if (close(fd) < 0) die(path);
}

static void
die(const char *s)
{
    perror(s);
    exit(1);
}
コンパイル
$ gcc -Wall -O2 cat.c

実行
$ ./a.out
./a.out: file name not given

ファイル渡す
$ ./a.out /etc/passwd
##
# User Database
#
...

複数ファイル
$ ./a.out /etc/hosts /etc/resolv.conf
##
# Host Database
#
...
# macOS Notice
#
# This file is not consulted for DNS hostname resolution, address
...

エラー
$ ./a.out notexist
notexist: No such file or directory

おお〜〜〜動いた〜〜〜〜!!!

argc 引数の数。

argv[0] programの名前

For (;;) 泣いても喚いても繰り返せ

n==0 ファイルが終わったら。

$ man 2 read
RETURN VALUES
     If successful, the number of bytes actually read is returned.  Upon reading end-of-file, zero is returned.

ということなので、read()で0が来たらファイルの終わり。その続きに

 Otherwise, a -1 is returned and
     the global variable errno is set to indicate the error.

errorなら -1 がreturnとある. do_catの中のエラー処理はそんな漢字。

read(fd, buf, sizeof buf) の意味

fd = open()したfileのstream. stream IDぽいintが入ってる。open()がIDを作ってreturnしてくれる

buf = fdから入ってきたデータ(byte列)を貯めるバッファ。

sizeof buf = buf変数の長さ。最大でここまでreadする(bufに貯める)オプション
defineしてるBUFFER_SIZEにしても動くけど、bufとBUFFER_SIZEの関連がこの行だけではわからないので、sizeof buf のほうが良いコード。

n = read()が読み込んだサイズ。途中でファイル終わることもあるので。これをwrite()にわたす

bufは初期化されず、常に上書きされている

bufを初期化しないのに、ループでread()から詰め込んでイケてるのはなぜだろう。もしかしてbufは常に上書きされてて、でもwrite()するときに必要な n byteしか出力しないからバレてないんじゃないだろうか。

試した。

こういうファイルを作る

$ cat test.txt
abc
d

catコマンドのbuffer sizeを変更

#define BUFFER_SIZE 4  <--- abc[改行]の4バイトがバッファになるように

write()を1byte (n+1)多く出すようにする

        if (write(STDOUT_FILENO, buf, n+1) < 0) die (path);

実行したら、通り過ぎたはずの c が出てきた!

$ ./a.out test
abc
d
c$

1行目で入ったbufは きっと abc[改行]
2行目は d[改行] がread()されたはずで、でもbufには前のループのが残ってるのできっと d[改行]c[改行] になったんじゃないだろうか。n+1しか出してないので d[改行]c だけ出た。

        if (write(STDOUT_FILENO, buf, n+2) < 0) die (path);

↑ n+2 にしたら、予想通りcの後ろの改行もでました

$ ./a.out test
abc
d
c
$

perror()

よくわからんかった。errnoに合わせたエラーメッセージを標準出力に返す。stderrじゃないのね。
errnoがどこから来るのかよくわからん。die()すると、例えば read()のエラー EFAULT が謎の通路を通ってperror()に届くんだろうか。perror()はprogram名(argv[0]) と errnoから作ったエラーメッセージを出す。
perror(path) といって渡したpathは何も表示されない。謎すぎる。

lseek()

fdのcursor(file offset)を動かせる。試しにwrite()するたびにlseek +1 してみた。

        if (write(STDOUT_FILENO, buf, n) < 0) die (path);
        lseek(fd, +1, SEEK_CUR);            <------------------

各行の先頭文字を消すつもりだったけど、ずれがずれを生むのでずれずれになった。なるほど。

image.png

いくらでも引数をたしてもいいという ...

$ man ioctl
NAME
     ioctl -- control device

SYNOPSIS
     #include <sys/ioctl.h>

     int
     ioctl(int fildes, unsigned long request, ...);

第3引数の... は可変長引数で、好きな数だけ好きな型の引数を渡していい、という意味

練習問題 5.8

catが引数無しで来たらstdinを引くようにする

引数なしエラーのとこで do_catに "/dev/stdin" を渡すだけでよい。

main(int argc, char *arvg[])
{
    int i;
    if (argc < 2) {
        do_cat("/dev/stdin");
    }

結果

$ gcc -Wall -O2 cat.c && ./a.out test
abc
def
xyz
012

$ gcc -Wall -O2 cat.c && ./a.out
a
a
b
b
c
c
^C

最初シングルquoteで書いたらwarningが出て、double quotesにしたら直った。なんとなく最近読んだ これならわかる! C言語入門講座 第2版 が役に立った。何がどう違うのか忘れたけど、signel/doulbe quoteはすっごい違うものという記憶は残ってた。

byte単位で読むread()の問題

きれいにいけば日本語も表示できるが、ちょっとでもずれると文字化けする。
文字単位で拾えればこうはならない。それは、次のchapterで。

image.png

ふう。やっとchapter 5 終わった。もう1時。おやすみなさい。本格的になってきた!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Samba】Linux⇔Windowsマシン間相互のファイル共有

目標

Sambaサーバ及びSambaクライアントを利用して、Linuxマシン⇔Windowsマシン間相互でのファイル共有を実現する。

Sambaの基礎知識

Sambaの基礎知識に関しては、以下サイトが分かりやすかったです。
Sambaの基本を知っておこう

前提

・AWS EC2インスタンス2台(※1)(OSはAmazon Linux 2、及びMicrosoft Windows Server 2019(※2))が構築済みであること。

※1
上記EC2インスタンス双方において、Sambaで利用する以下のポート(本記事ではファイル共有のみしか実施しないため厳密には139番ポート、445番ポートのみ使用となります。)をセキュリティグループ上で空けておく(Linux教科書 LPICレベル2 Version4.5対応より)。
UDP 137番ポート:NetBIOS名前解決やブラウジング
UDP 138番ポート:NetBIOS名前解決やドメインログオン
TCP 139番ポート:ファイル共有(下記のMicrosoft Direct Hosting SMBを利用していない場合)
TCP 445番ポート:ファイル共有(Windows2000以降のマシンでMicrosoft Direct Hosting SMBを利用している場合)

※2
EC2をWindowsサーバとして構築する手順に関しては以下参考
リニューアル!Amazon EC2インスタンスを立ちあげてみよう!前編 ~Windows Server編~

利用環境

・Linuxマシン
仮想マシン: AWS EC2
OS(AMI): Amazon Linux 2 AMI (HVM), SSD Volume Type
ミドルウェア: Samba(Version 4.10.16)

・Windows Serverマシン
仮想マシン: AWS EC2
OS(AMI): Microsoft Windows Server 2019 Base

作業の流れ

項番 タイトル
1 Sambaサーバの構築
2 WinsowsマシンからSamba共有フォルダへアクセス
3 Sambaのクライアント機能(LinuxマシンからWindows共有フォルダへのアクセス)

手順

1.Sambaサーバの構築

①必要パッケージのインストール
事前作成したEC2のLinux側のマシンにOSログインし、ルートスイッチ及びパッケージのアップデートを実行

sudo su -
yum -y update

Sambaをインストールをします。

yum -y install samba

②Sambaユーザの設定
Linux側及びSamba側にSambaユーザを追加します。
まずはLinux側にSambaユーザ(今回がtestsambaとした)を登録

useradd testsamba
passwd testsamba

続いてpdbeditコマンドを利用して、Samba側にtestsambaユーザを登録(※)します。

pdbedit -a testsamba

Sambaユーザの一覧を確認します。

[root@ip-172-31-36-198 ~]# pdbedit -L
testsamba:1001:

③共有フォルダの作成
Sambaを利用して共有させるフォルダを作成します。
先ほど作成したtestsambaユーザにスイッチ後、共有フォルダとして/tmp/testsambaを作成します。
また共有テスト用のファイルもついでに作成します。

su - testsamba
mkdir /tmp/testsamba
touch /tmp/testsamba/sharetest

作成後、ルートユーザに戻ります。

exit

④Samba設定ファイル編集
Sambaの設定ファイル/etc/samba/smb.confを編集を行います。

vi /etc/samba/smb.conf

今回は認証時のパスワード暗号化プリンタ共有の無効化共有セクションtestsambaの追加を実施しました。
コメントが記載されているパラメータが更新、もしくは追加を行った箇所となります。

smb.conf
[global]
        # ワークグループ名はwindowsマシンと同一にしておく(標準はWORKGROUP)
        workgroup = WORKGROUP
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups

        # プリンタ共有を無効化
        load printers = no

        cups options = raw

        # パスワードの暗号化を有効化
        encrypt passwords = yes

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

# 共有セクション追加
[testsamba]
        comment = testshare
        path = /tmp/testsamba
        writable = yes

⑤Samba起動
Sambaを構成するプロセスsmbd及びnmbd(※)の起動→自動起動→ステータス確認を行います。
ステータス確認で状態がrunningであればOKです。

※Sambaを構成するサーバプロセス(Linux教科書 LPICレベル2 Version4.5対応より)

サーバプロセス 提供する機能
smbd ファイル共有、認証など
nmbd ブラウジング機能、NetBIOS名前検索、WINSサーバなど
winbindd WInbind機能
systemctl start smb
systemctl start nmb
systemctl enable smb
systemctl enable nmb
systemctl status smb
systemctl status nmb

2.WinsowsマシンからSamba共有フォルダへアクセス

①Windows serverマシンへのアクセス
事前作成したEC2のWindows serverマシン側へローカルマシンからRDPを利用してアクセス(※)します。
※参考手順
リニューアル!Amazon EC2インスタンスを立ちあげてみよう!後編 ~Windows Server編~

②共有フォルダへのアクセス
Windows serverマシン上のエクスプローラを起動し、Sambaの共有フォルダへアクセスをかけます。
アクセスする際の接続文字列が以下の形式となります。

\\SambaサーバのプライベートIPアドレス\testsamba

正常に接続されれば以下のように認証が求められるので、以下のように入力
User name: testsamba
Password: testsambaのパスワード(pdbedit実行時に入力したパスワード)

Capture.PNG

認証がOKな場合、Sambaサーバの共有フォルダ/tmp/testsamba内に作成したテストファイルsharetestが表示される想定です。

Capture.PNG

3.Sambaのクライアント機能(LinuxマシンからWindows共有フォルダへのアクセス)

今度は逆にLinuxマシンからWindows共有フォルダへSambaのクライアント機能を利用したアクセスを試してみます。

①Windows共有フォルダの作成
Windows serverマシン側のC直下にwindows_shareという検証共有フォルダを作成します。
Capture.PNG

上記共有フォルダを右クリックし、Give access toSpesific peopleとクリック
共有許可する対象を選ぶコンソール移動するので、以下のようにEveryoneRead/Write権限を付与しShareをクリックします。

Capture.PNG

作成した共有フォルダwindows_share内にテストファイルwindows_sharetestを作成します。

Capture.PNG

②Sambaクライアントを利用してWindows共有フォルダへアクセス
Linux側マシンからSambaクライアントを利用して先ほど作成したWindows server側の共有フォルダへアクセスをしてみます。
まずはSambaクライアントのインストール

yum -y install samba-client

smbclientコマンドを利用してアクセスします。
-Uオプションを利用してWindows Server側の管理ユーザであるAdministratorユーザとしてアクセスする必要があります。

smbclient -U Administrator //WindowsマシンのプライベートIPアドレス/windows_share

パスワード入力後、正常に認証されればsmbコンソールに移動するのでlsで共有フォルダ内のファイルを確認、
事前作成したwindows_sharetest.txtが確認できればOKです!

[root@ip-172-31-36-198 ~]# smbclient -U Administrator //172.31.40.93/windows_share
# Administratorのパスワードを入力(RDPでアクセスした際に利用したパスワード)
Enter SAMBA\Administrator's password:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Nov  4 08:14:44 2020
  ..                                  D        0  Wed Nov  4 08:14:44 2020
  windows_sharetest.txt               A        0  Wed Nov  4 08:14:33 2020

                7863807 blocks of size 4096. 4238018 blocks available
smb: \>

参考にさせて頂いた書籍及びサイト

・参考書籍
Linux教科書 LPICレベル2 Version4.5対応
・参考サイト
EC2にSambaを構築してWindowsからファイル共有してみた

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】Docker、apacheで自己証明書を作成

はじめに

DockerのApacheで自己証明書を作成する方法をメモ

環境情報

  • OS:Redhat 7.7
  • Docker:19.03.6-ce
  • docker-compose:1.27.4
  • apache:2.4.46

Docker環境構築

下記の記事を参照
【Linux】RedhatにDocker環境構築

docker-compose.yml設定

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf

Dockerfile設定

apache

FROM httpd:latest

RUN apt update \
    && apt install -y \
    git \
    gcc \
    make \
    build-essential \
    wget \
    curl \
    llvm \
    xz-utils \
    tk-dev \
    zlib1g-dev \
    libncurses5-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    libxmlsec1-dev \
    liblzma-dev \
    libpq-dev \
    libffi-dev

WORKDIR /usr/local/apache2

apacheコンテナの起動

docker-compose up -d apache

自己証明書を作成

apacheコンテナに入り、自己証明書を作成
詳細は下記記事を参照
【apache】自己証明書を作成

docker-compose.yml修正

・作成した自己証明書をvolumesに追加
・portsに「443」を追加

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
      - 443:443 <==追加
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./apache/conf/server.crt:/usr/local/apache2/conf/server.crt <==追加
      - ./apache/conf/server.key:/usr/local/apache2/conf/server.key <==追加

各種ファイルの設定

./apache/conf/httpd.conf

・・・
LoadModule ssl_module modules/mod_ssl.so <==追加
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so <==追加

・・・
↓↓↓↓↓↓↓↓↓↓追加↓↓↓↓↓↓↓↓↓↓
Include conf/extra/httpd-ssl.conf 
<IfModule ssl_module>
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin
</IfModule>
↑↑↑↑↑↑↑↑↑↑追加↑↑↑↑↑↑↑↑↑↑

apacheコンテナの最新化

docker-compose up -d apache

HTTPS接続が可能になっていればOK
https://localhost
※ ドメイン名は適宜変更

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Linux】Dockerでjenkins環境構築

はじめに

Dockerでjenkins環境構築する方法をメモ

環境情報

  • OS:Redhat 7.7
  • Docker:19.03.6-ce
  • docker-compose:1.27.4
  • apache:2.4.46
  • jenkins:2.264

Docker環境構築

下記の記事を参照
【Linux】RedhatにDocker環境構築

docker-compose.yml設定

version: '3'

services:
  apache:
    build: apache
    container_name: apache
    ports:
      - 80:80
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./apache/conf/modules.conf:/usr/local/apache2/conf/modules.conf
      - ./apache/conf/proxy.conf:/usr/local/apache2/conf/proxy.conf
  jenkins:
    build: jenkins
    container_name: jenkins
    volumes:
      - ./jenkins/jenkins_home:/var/jenkins_home
    environment:
      - JENKINS_OPTS=--prefix=/Jenkins/ --sessionTimeout=1440
      - TZ=Asia/Tokyo
    privileged: true

Dockerfile設定

apache

FROM httpd:latest

RUN apt update \
    && apt install -y \
    git \
    gcc \
    make \
    build-essential \
    wget \
    curl \
    llvm \
    xz-utils \
    tk-dev \
    zlib1g-dev \
    libncurses5-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libssl-dev \
    libxml2-dev \
    libxmlsec1-dev \
    liblzma-dev \
    libpq-dev \
    libffi-dev

WORKDIR /usr/local/apache2

jenkins

FROM jenkins/jenkins:lts

WORKDIR /

USER root

RUN apt-get update \
    && apt-get install -y \
    gcc \
    g++ \
    expect \
    make \
    file \
    chromium \
    chromium-driver \
    libpq-dev \
    libssl-dev \
    libbz2-dev \
    libffi-dev \
    zlib1g-dev \
    liblzma-dev

WORKDIR /var/jenkins_home

EXPOSE 8080

各種ファイルの設定

./apache/conf/httpd.conf

・・・
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so

Include conf/modules.conf <==追加

・・・

IncludeOptional conf/proxy.conf <==追加

./apache/conf/modules.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

./apache/conf/proxy.conf

# jenkins
<Location "/Jenkins">
   <IfModule proxy_module>
      ProxyPass http://jenkins:8080/Jenkins
      ProxyPassReverse http://jenkins:8080/Jenkins
   </IfModule>
</Location>

Jenkins起動確認

下記URLでjenkinsにアクセスできればOK

http://localhost/Jenkins
※ ドメイン名は適宜変更

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

NVIDIA Docker 環境の作り方

はじめに

2020/11/04時点での NVIDIA Docker 環境の作り方をメモ。
いつの間にかCUDAが認識されなくなっていたため、ドライバーから入れ直すことに。

USER@HOST:~$nvidia-smi
Wed Nov  4 14:41:54 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.64       Driver Version: 430.64       CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| 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:01:00.0  On |                  N/A |
|  0%   35C    P8    12W / 275W |     62MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1609      G   /usr/lib/xorg/Xorg                            59MiB |
+-----------------------------------------------------------------------------+

古い環境を消す

# 現在のCUDAをアンインストール
$ sudo apt purge cuda*
$ sudo apt purge nvidia-cuda-*
$ sudo apt purge libcuda*
# 完全に削除
$ sudo apt-get purge nvidia*
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ sudo rm -rf /usr/local/cuda*

本題

以下3手順で、CUDA、Docker、nvidia-docker2がインストールできる。尚、今まではNvidia Driverは別で入れていたが、CUDAを入れれば対応するDriverも一緒にインストールされる。

1. 最新CUDAドライバのインストール

CUDA Toolkit の Web サイトに従ってインストール

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
$ sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/ /"
$ sudo apt-get update
$ sudo apt-get -y install cuda #(※バージョン指定する場合はcuda-10-2という風に書く)

2. Dockerのインストール

Docker公式のインストール方法に従ってインストール

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

インストール後、docker サービスの開始と、自動起動を設定

$ sudo systemctl start docker && sudo systemctl enable docker

sudo なしに docker コマンドを実行可能にするのであれば、次のように対象のユーザーを docker グループへ追加

$ sudo usermod -aG docker $USER

3.nvidia-docker2 パッケージのインストール

公式のインストール方法に従ってインストール

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

再起動後、動作確認

$ sudo reboot
$ nvidia-smi

Nvidia DriverとCUDA Versionが表示されれば完了。

参考
NVIDIA Docker って今どうなってるの? (20.09 版)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

完全に個人的なメモ

ものすごく個人的なメモです。

Linuxコマンドの忘れがちなものをメモしていきます。

フルパスの取得方法

$ find `pwd` -name "ファイル名.sh"

shellスクリプトの書き方

test.sh
# ---これはコメント-----------
# bashのpathは which bash で取得する
# ------------------------

#!/bin/bash
echo hello-world

実行権限を与える。
$ chmod +x deploy.sh
実行するには、
$ /testスクリプトのフルパス/test.sh

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TCP/IPとは、わかりやすく解説

TCP/IPとは

-「インターネットの世界で標準として使われるプロトコル」のことです。
-「TCP」と「IP」はセットで表現されることが多いですが、それぞれ別々の通信プロトコルです。

そもそもプロトコルとは? 

 ネットワークを通じてコンピューターがやりとりするための約束事のことです。例えば、日本語しか話せないAさんと、英語しか話せないBさんがいるとします。AさんがBさんにそのまま日本語で話しかけてもBさんには全く何を話しているのかわからず情報伝達はできないと思います。
 この場合だと、両者が同じ言語という「約束事」を共有してないと情報を伝達することはできません。他にも、手紙でやりとりをする、電話をかけたり、受けたりするなど、全部共通の約束事が定められています。
 コンピューターのネットワークもそれと同じことが言えます。「どんなケーブルを使って、どんな形式でデータを送り、それをどうやって受け取り、どのように応答するか」など共通の約束事が定められています。
この約束事のことを「プロトコル」と言います。

IPとは

 IPは経路の制御を行い、ネットワークからネットワークに通信データを送り届ける役割をしています。「Internet Protocol(インターネットプロトコル)」の頭文字をとって「IP」です。手紙と同じで通信データを届けるには、「送り元」と「宛先」が必要です。IPによるネットワークでは、コンピューターやネットワーク機器を識別するために、「IPアドレス」という番号を割り当てて管理しています。これがインターネット上の「送り元」や「宛先」あたる住所のようなものです。

TCPとは

 しかしIPは一方的に通信データを送りつける(コネクションレス型の通信)だけなので、データ通信の中身に何が入っているかなど、通信品質の保証はされていません。それを補う役割をしているのがTCPです。TCPはデータのまとまりを受け取るとすぐにデータが破損していないかなどのエラーを確認して、間違っている場合は、データをもう一度送ってもらうように依頼します。このように受け取ったデータをチェックしているので、データの信頼性は高くなりますが、その分スピードが遅くなるという特徴があります。

まとめ

・TCP/IPは「世界で標準として使われるプロトコル」で、TCPとIPは別々のプロトコルです。
・プロトコルは、コンピューターネットワークにおける共通の約束事のことです。
・IPはネットワークからネットワークにデータを送る役割をしています。
・IPだけでは、データの品質保証がされていないのでTCPがエラー確認や再送依頼などを行なっています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む