- 投稿日:2020-11-04T23:50:35+09:00
ふつうの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 aaacat コマンドは引数なしだと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"); }人間が読める文字を格納する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 dcatコマンドの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); <------------------各行の先頭文字を消すつもりだったけど、ずれがずれを生むのでずれずれになった。なるほど。
いくらでも引数をたしてもいいという
...
$ 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はすっごい違うものという記憶は残ってた。
char i = 'a'
— くじ@uturned (@uturned0) October 10, 2020
char i[] = "abc"
こんな謎のルールを学んだ。single double quote大事なのね
あと今更ながらポインタを使う意味がわかった、遠くの変数書き換えるためなのねbyte単位で読むread()の問題
きれいにいけば日本語も表示できるが、ちょっとでもずれると文字化けする。
文字単位で拾えればこうはならない。それは、次のchapterで。ふう。やっとchapter 5 終わった。もう1時。おやすみなさい。本格的になってきた!
- 投稿日:2020-11-04T19:03:06+09:00
【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 updateSambaをインストールをします。
yum -y install samba②Sambaユーザの設定
Linux側及びSamba側にSambaユーザを追加します。
まずはLinux側にSambaユーザ(今回がtestsambaとした)を登録useradd testsamba passwd testsamba続いてpdbeditコマンドを利用して、Samba側にtestsambaユーザを登録(※)します。
pdbedit -a testsambaSambaユーザの一覧を確認します。
[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 nmb2.WinsowsマシンからSamba共有フォルダへアクセス
①Windows serverマシンへのアクセス
事前作成したEC2のWindows serverマシン側へローカルマシンからRDPを利用してアクセス(※)します。
※参考手順
リニューアル!Amazon EC2インスタンスを立ちあげてみよう!後編 ~Windows Server編~②共有フォルダへのアクセス
Windows serverマシン上のエクスプローラを起動し、Sambaの共有フォルダへアクセスをかけます。
アクセスする際の接続文字列が以下の形式となります。
\\SambaサーバのプライベートIPアドレス\testsamba
正常に接続されれば以下のように認証が求められるので、以下のように入力
User name: testsamba
Password: testsambaのパスワード(pdbedit実行時に入力したパスワード)認証がOKな場合、Sambaサーバの共有フォルダ/tmp/testsamba内に作成したテストファイルsharetestが表示される想定です。
3.Sambaのクライアント機能(LinuxマシンからWindows共有フォルダへのアクセス)
今度は逆にLinuxマシンからWindows共有フォルダへSambaのクライアント機能を利用したアクセスを試してみます。
①Windows共有フォルダの作成
Windows serverマシン側のC直下にwindows_share
という検証共有フォルダを作成します。
上記共有フォルダを右クリックし、
Give access to
⇒Spesific people
とクリック
共有許可する対象を選ぶコンソール移動するので、以下のようにEveryone
のRead/Write
権限を付与しShare
をクリックします。作成した共有フォルダwindows_share内にテストファイル
windows_sharetest
を作成します。②Sambaクライアントを利用してWindows共有フォルダへアクセス
Linux側マシンからSambaクライアントを利用して先ほど作成したWindows server側の共有フォルダへアクセスをしてみます。
まずはSambaクライアントのインストールyum -y install samba-clientsmbclientコマンドを利用してアクセスします。
-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からファイル共有してみた
- 投稿日:2020-11-04T18:40:51+09:00
【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.confDockerfile設定
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/apache2apacheコンテナの起動
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 apacheHTTPS接続が可能になっていればOK
https://localhost
※ ドメイン名は適宜変更
- 投稿日:2020-11-04T17:10:04+09:00
【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: trueDockerfile設定
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/apache2jenkins
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
※ ドメイン名は適宜変更
- 投稿日:2020-11-04T16:35:51+09:00
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 dockersudo なしに docker コマンドを実行可能にするのであれば、次のように対象のユーザーを docker グループへ追加
$ sudo usermod -aG docker $USER3.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-smiNvidia DriverとCUDA Versionが表示されれば完了。
- 投稿日:2020-11-04T15:32:16+09:00
完全に個人的なメモ
ものすごく個人的なメモです。
Linuxコマンドの忘れがちなものをメモしていきます。
フルパスの取得方法
$ find `pwd` -name "ファイル名.sh"shellスクリプトの書き方
test.sh# ---これはコメント----------- # bashのpathは which bash で取得する # ------------------------ #!/bin/bash echo hello-world実行権限を与える。
$ chmod +x deploy.sh
実行するには、
$ /testスクリプトのフルパス/test.sh
- 投稿日:2020-11-04T07:57:55+09:00
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がエラー確認や再送依頼などを行なっています。