OSの講義の11.xの問題を解く
これが正解だぜ(どや)みたいなノリでは書いてないです、ただの平均的な技術力を持っているB2が解いているだけ
課題の取り組みをブログで書いてもいいという許可をもらった上で記事を書いてます
最新の課題内容であることや、答えが正しいかどうかは保証しません
このブログの情報で読者に何らかの不都合が生じても著者は責任は取らないです
11.1 VMの課題 (2022年度)
問題
このページの問題を解く
学科サーバ 上の KVM に自分の仮想マシンを作る 二つの方法 KVMのcommand line interfaceである virsh の wrapper ie-virsh を使う (1) 自分の手元のPCで、仮想マシンのimageを qcow2 で作り、それを upload する (2) Server(amaneなど)で、Fredoraのdvd imageから boot する Server上のKVMからの Fedoraのinstall Level 1 VNC または ssh で仮想マシンへの login し動作を確認する Level 2 web server を起動し、 外部から curl でアクセスできることを確認する。 Hugoでサイトを作成する absible VNCたは virsh console で IPv6を確認して、amane 上とかから password抜きで ssh できるようにする。
(2) Server(amaneなど)で、Fredoraのdvd imageから boot する
- amaneにssh
$ mkdir /mnt/ie-virsh/e20/e205723
(amane)$ qemu-img create -f qcow2 /mnt/ie-virsh/e20/e205723/e205723-os-11-1.qcow2 20G
(amane)e205723-os-11-1.qcow2
というファイルが先程mkdirで作成したディレクトリに生成されるe205723-os-11-1.qcow2
というファイル名のos-11-1
の部分に注目
$ ie-virsh define os-11-1
(amane)os-11-1
という名前のVMを作成する- qcow2ファイルを作成するときに
$ qemu-img create -f qcow2 /mnt/ie-virsh/e20/e205723/e205723-xxxx.qcow2 20G
を実行していたら、$ ie-virsh define xxxx
と実行しなければならない
$ ie-virsh start os-11-1
(amane)- VMを起動する
$ ie-virsh attach-disk os-11-1 /home/open/Fedora/Fedora-Server-dvd-x86_64-37_Beta-1.5.iso
(amane)/home/open/Fedora/Fedora-Server-dvd-x86_64-37_Beta-1.5.iso
というディスクイメージをos-11-1にマウントする
$ ie-virsh vncdisplay os-11-1
(amane)- ローカルPCのターミナルを使う
$ ssh -L 10024:localhost:59xx -N amane
(local pc)- VNC Viewerを起動
- VNC Viewerを起動したら
localhost:10024
を入力すると、VNCディスプレイが見れる - uefi shellが立ち上がるので速攻で
exit
を入力する- ↓こんな画面になる
- Boot Managerを十字キーでカーソル操作して選択
UEFI QEMU DVD-ROM QM00007
を選択Install Fedora 37
を選択- インストーラーが起動する
- ここで
Attempting to reconnect to VNC Server...
と出たら、「Options > General > Picture qualityをMediumとかAutomatic以外にするといける」って優秀な後輩が言ってた、Yoshisaurの環境ではなかった - 言語設定をする(英語)
- Rootユーザー、ユーザー作成、ディスクの設定をする
- Rootユーザー
- Rootユーザーにsshログインできるようにするのはあまりベストではないけどね
- ユーザー作成
- ディスクの設定
- Rootユーザー
- ここで
- Begin InstallationをクリックしてFedoraのインストールを開始する
- 時間計測をした結果、5分7秒だった
- qcow2の大きさを示す
/mnt/ie-virsh/e20/e205723/e205723-os-11-1.qcow2
にqcow2ファイルが置かれている$ ls -l /mnt/ie-virsh/e20/e205723/e205723-os-11-1.qcow2; date
- 出力:
-rw-r--r-- 1 libvirt-qemu kvm 3546677248 Feb 8 14:06 /mnt/ie-virsh/e20/e205723/e205723-os-11-1.qcow2 Wed Feb 8 02:38:29 PM JST 2023
- 出力:
- Rebootする
- 再起動しなかったらamaneで
$ ie-virsh start os-11-1
を実行
- 再起動しなかったらamaneで
- コンソールログインしたら
ysano
(ユーザー作成のスクリーンショットを参考)と入力 - パスワードを入力
Level 1:「VNC または ssh で仮想マシンへの login し動作を確認する」
- 現段階でVNCを使い続けて作業をするとコピーペーストができないので、sshでログインできるようにする
- akatsukiでVMにipを付与してもらう
- 11.2の「Fedora を akatsuki に登録する」で出てくる作業なので忘れずに!
- amaneで
$ ie-virsh domiflist os-11-1
を実行してMACアドレスを取得しよう - akatsukiに行き、IPアドレス申請方法を参考にVMにipを付与してもらう
- ローカルPCのssh configを書く
$ vim ~/.ssh/config
(local pc)- 以下を追記
Host fedora HostName 10.0.4.125 User ysano ProxyJump amane
$ ssh-copy-id fedora
(local pc)- `$ ssh fedora "date; ls -ld" (local pc)
- これが無事に実行できたらLevel 1は大丈夫だと感じる
Sat Nov 26 11:02:44 PM JST 2022 drwx------. 3 ysano ysano 74 Nov 26 23:01 .
Level 2: 「web server を起動し、 外部から curl でアクセスできることを確認する」
- このサイトを参考に作業をする
- VM上で作業をする
$ sudo dnf install hugo
(VM)- hugoのインストール
$ hugo new site yoshisaur-blog
(VM)$ cd !$
(VM)$ git init
(VM)$ git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke
(VM)$ echo "theme = 'ananke'" >> config.toml
(VM)$ hugo server -D
(VM)- ローカルPCで
$ ssh -L 8080:localhost:1313 -N fedora
(local pc) localhost:8080
を見る$ curl localhost:8080 > curl_result.txt
(local pc)- 最終的には
curl_result.txt
の中身をkono先生のメールに貼り付けて提出する
- 最終的には
absible
- 公開鍵認証方式でのsshログインはLevel 1で既に達成している
$ brew install ansible
$ echo fedora ansible_ssh_user=ysano ansible_ssh_private_key_file=~/.ssh/id_rsa > hosts
ysano
の部分は各自のユーザー名
$ ansible fedora -i hosts -m ping
- ↓が帰ってきたらクリア(でいいでしょ?)
fedora | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
- 11.2の「Ansibleのping」で出てくる作業なので忘れずに!
11.2 ansibleの課題 (2022年度)
問題
このページの問題を解く
fedora に password 抜きで ssh できるようにする Fedora を akatsuki に登録する Ansibleのping Ansibleのplaybook
fedora に password 抜きで ssh できるようにする
11.1で既に行った、「忘れずに!」で文字検索をこの記事にかけると出るかも
Fedora を akatsuki に登録する
11.1で既に行った、「忘れずに!」で文字検索をこの記事にかけると出るかも
Ansibleのping
11.1で既に行った、「忘れずに!」で文字検索をこの記事にかけると出るかも
Ansibleのplaybook
- ansible を使って nginx を設定すると書いてあるが、すぐそばにあるリンクはwordpressサーバーを立てるAnsibleのplaybookなので、自作する必要がある
- なので作った
- ansible-playbook-hugo-nginx
- レポジトリのREADME.mdを読めば使い方がわかる
- README.mdの通りに作業をしたあとに、
$ curl http://localhost:8080
などを実行してアクセスできることを確認する- 作業ログとCurlコマンドの結果をメールに出すといいと思う
11.2(2022年度)の感想
- ansibleは便利だ、覚えておくと役に立つときが来そう
- ansible難しかった...
11.3 Containerの課題
問題
このページの問題を解く
daru上で singularity を使う GPU があるかどうかを確認する vimを入れる rust を入れてみる daru 上で slum を使う daru 上で podman を使う podman でなにか動かす
daru 上で singularity を使う
- ~/.ssh/configに以下の設定を追加する
Host daru HostName daru.ie.u-ryukyu.ac.jp User e2057xx ProxyJump chatan
- すでに設定されているだろうけど一応、chatanの設定はこの記事に書かれている
$ ssh daru
$ mkdir 11_2
$ cd !$
$ singularity pull --docker-login ubuntu:20.04
$ singularity shell --nv ubuntu_20.04.sif
GPU があるかどうかを確認する
$ nvidia-smi
Sat Feb 5 18:33:06 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.156.00 Driver Version: 450.156.00 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100S-PCI... Off | 00000000:3B:00.0 Off | 0 | | N/A 37C P0 36W / 250W | 0MiB / 32510MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
- Ctrl-dでコンテナからログアウトする
Vimを入れる
- 中身が以下のようなtest.defというファイルを作る
- Dockerfileのようなものである
BootStrap: docker From: ubuntu:20.04 %post apt-get update apt-get -y upgrade apt-get -y install build-essential vim
$ singularity build --fakeroot test.sif test.def
- test.defファイルからtest.sifファイルを生成する
$ singularity shell test.sif
- test.sifからコンテナを生成してログイン
$ which vim
/usr/bin/vim
- vimが入っていることを確認できた
- Ctrl-dでコンテナからログアウトする
rustを入れる
$ singularity shell --fakeroot --writable test.sif
- test.sifからコンテナを作ってログインする
$ apt-get update
$ apt-get install rustc
$ mkdir rust; cd rust ; cargo new hello_world --bin
- rustというディレクトリが作られてhello_worldというパッケージが作られる
- rustcパッケージがちゃんと入っていることを確認
- Ctrl-dでコンテナからログアウトする
- 一旦ログアウトするとrustcパッケージが消え去り、cargoコマンドなどが使えなくなる
- Singularityのコンテナは構築後に動的にパッケージが追加できない
$ singularity build --sandbox --fakeroot test/ test.def
- --sandboxオプションは環境を動的に変更できるようにする(Dockerライクになる)
$ singularity shell --fakeroot --writable test
- もう一度rustcをインストールする
$ apt-get update
$ apt-get install rustc
- Ctrl-dで抜ける
$ singularity shell --fakeroot --writable test
- 再度ログイン
$ which cargo
- /usr/bin/cargo
- コンテナからログアウトした後でも、動的に加えたパッケージが残っていることが確認できた
daru上でslumを使う
$ singularity pull pytorch.sif docker://pytorch/pytorch:latest
$ git clone https://github.com/pytorch/examples.git
- 中身が以下のmnist.sbatchというファイルを作成する
#!/bin/bash #SBATCH --job-name mnist #SBATCH --output logs/%x-%j.log #SBATCH --error logs/%x-%j.err #SBATCH --nodes 1 #SBATCH --gpus tesla:1 date singularity exec --nv pytorch_latest.sif python examples/mnist/main.py date
$ sbatch mnist.sbatch
- slurmでJobを投げる
- 課題ページでは、ジョブ情報を確認する命令がなかったが一応、squeueコマンドでジョブ情報を表示させたら何もジョブがない状態だった
- GPUを使っても使わなくても同じ結果になりました
以下はオプション
daru上でpodmanを使う
$ rm -rf ~/.local
$ sudo podman run hello-world
Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
podmanでなにか動かす(オリジナリティが必要)
- イメージの作成or取得 -> イメージからコンテナを作成という流れ
- イメージは「Dockerfileから生成する」または「docker image pull
: のようなコマンドを実行する」のが考えられる。 - 以下のようなDockerfileを用意する
- マルチステージビルドを使う
- Stage1でGolangコンパイラがシングルバイナリファイルを生成して、Stage2でGoのファイル、コンパイル環境を持たないubuntu環境でStage1のシングルバイナリファイルを実行する
#Stage 1 FROM golang AS build01 RUN mkdir workspace COPY ./hello_world.go /workspace/ WORKDIR /workspace RUN go build hello_world.go #Stage 2 FROM ubuntu RUN mkdir workspace COPY --from=build01 workspace/hello_world /workspace WORKDIR /workspace ENTRYPOINT ["./hello_world"]
- 以下のようなhello_world.goを用意
package main import "fmt" func main() { fmt.Println("Hello, World!") }
$ podman image build -f ./Dockerfile -t ubuntu:golang_hello .
$ podman container run -it ubuntu:golang_hello
- Hello, World!が出力された
11.3の感想
- Singularityで学科のGPU使えるの神
- ただ動的にコンテナ内のパッケージを自由に管理するDockerとは違って、sandboxオプションを使わないと動的に追加したパッケージをログアウトした状態で使えないのは初めて知った、あくまで検証環境として使うのが良さそう
11.4 Cloudの課題
このページの問題を解く