- 投稿日:2019-11-24T21:23:49+09:00
cronとrtcwakeでLinuxの自動起動及び自動シャットダウン
概要
Ubuntuで録画サーバを動かしていると電気代がバカにならないので、
使わない時間帯(自分の場合は3時~20時)に合わせて、自動起動と自動シャットダウンする方法について調べてみた。今回は以下の2つのコマンドを使います。
crontab -e
分(0-59) 時(0-23) 日(1-31) 月(1-12) 曜日(0-7) コマンド*でワイルドカード指定が可能
rtcwake
sudo rtcwake -m [モード] -s [復帰までの秒数]-m off シャットダウン
-m disk 休止
-m mem サスペンド設定
今回はcronでrtcwakeコマンドをスケジュール実行させました。
# 3時にシャットダウンし、20時に起動させる場合 0 3 * * * sudo rtcwake -m off -s 61200
- 投稿日:2019-11-24T18:33:07+09:00
jetson nanoのmanがない
nVIDIA DEVELOPER Forumsの「Where are the man pages?」より
ファイル
/etc/dpkg/dpkg.cfg.d/excludes
のmanとdocの行をコメントアウトして対象のパッケージをre-インストール。
- 投稿日:2019-11-24T16:04:01+09:00
シェルスクリプトのちょっと実用的な数行の関数(日時 #2)
日時
前回に引き続きシェルスクリプトのちょっとした関数で、日時の続きです。
日時をUNIX時間に変換する
UNIX 時間は、UTC の 1970年1月1日からの経過秒数(エポック秒)です。整数値なので経過時間の計算や比較がしやすくなります。
# $1 日時を表す文字列 function datetime_to_epoch() { date -d "${1}" +'%s' }現在の日時をUNIX時間で出力する
「
date +'%s'
」に名前を付けてスクリプトの可読性を良くするための関数です。function epoch_now() { date +'%s' }使用例(タイムアウトの処理)
ループ 1回ごとに現在時刻と制限時刻を比較して継続/終了の判定をする例です。UNIX 時間なので加算と比較が簡単にできます。
TIMEOUT_SECONDS=10 # タイムアウトの秒数 # 現在時刻にタイムアウトの秒数を加算して制限時刻を得る。 limit_time=$(( $(epoch_now) + ${TIMEOUT_SECONDS} )) # 制限時刻まで処理を続ける。 while (( $(epoch_now) <= ${limit_time} )) do do_something sleep 1 doneUNIX時間を日時に変換
逆変換の
@
も忘れがちで、可読性も低いので関数にします。# $1 日時を表す文字列 # $2 書式指定文字列(省略可 省略時は'yyyy-MM-dd hh:mm:ss'で出力する) function epoch_to_datetime() { date -d "@${1}" +"${2:-%F %T}" }日時の差分計算
前回の「日時の加算/減算」に対して、今回は 2つの日時の差分を求める関数です。端数は切り捨てられます。
# $1 出力する差分の単位 {day|hour|minute|second} # $2 日時を表す文字列 # $3 日時を表す文字列 $2 < $3で正の値、$2 > $3で負の値を出力する function diff_datetime() { # UNIX時間に変換して、2つの日時の差分を秒単位で求める。 local formula=$(( $(datetime_to_epoch "${3}") - $(datetime_to_epoch "${2}") )) case "${1}" in second ) ;; minute ) formula+=" / 60" ;; hour ) formula+=" / 3600" ;; day ) formula+=" / ( 3600 * 24 )" ;; * ) return 1 ;; esac echo "${formula}" | bc }月初の日付
可読性のために、前回の「日時の書式設定」を使用します。
まず書式'%Y-%m-01'
を使って強制的に 1日の 0時にしてから、指定の書式があればフォーマットして出力します。# $1 日時を表す文字列 # $2 書式指定文字列(省略可 省略時は'yyyy-MM-dd'で出力する) function first_day_of_month() { local first_day=$(format_datetime "${1}" '%Y-%m-01') format_datetime "${first_day}" "${2:-%F}" }月末の日付
前回の「日時の加算/減算」を使用します。
月末は日が 28 〜 31 の間で変動するので、月初のように日の強制変換ができません。そのためまず翌月の月初を取得してから、その前日を求めて当月の月末にします。# $1 日時を表す文字列 # $2 書式指定文字列(省略可 省略時は'yyyy-MM-dd'で出力する) function last_day_of_month() { # 月初の1か月後 = 翌月の月初 local next_1st_day=$(add_datetime "$(first_day_of_month "${1}")" 1 month) # 翌月の月初の前日 = 当月の月末 add_datetime "${next_1st_day}" -1 day "${2:-%F}" }
- 投稿日:2019-11-24T15:14:19+09:00
Amazon Linux (EC2)でdirenvをセットアップする
direnvとは?
direnv
とは、ディレクトリごとに環境変数を定義することができるツール(コマンド)です。
つまり、他のディレクトリに影響を及ぼさない変数を定義できるということです。direnv
によって定められた環境変数はカレントディレクトリ(自分が今いるディレクトリ)でのみ有効になります。通常の環境変数はプロジェクト全体に作用することが一般的ですが、
direnv
ではディレクトリごとに設定できるので、より細かく環境変数を設定したい場合などに非常に有効です。今回はAmazon Linux(EC2インスタンス)にデプロイするときに
direnv
コマンドが入っておらず困ったので、そのインストール方法を残しておきます。お手元のMacOSに
direnv
を入れたい場合などは、他のページをご覧になるとわかりやすいですが、当ページでも基本的にやっていることは同じなので一部参考になさってください。今回の環境は以下になります。
Amazon Linux
CentOS 6direnvのインストール
ローカルのMacOSなどでhomebrewが入っていれば
brew
コマンドを使ってこのように簡単にインストールすることができます。$ brew install direnvAmazon Linuxにhomebrewが入っている場合は上記の方法でインストールすれば良いです。(その方が簡単!)
もし、brew
が入っていないよという方は以下のようにすればhomebrewを入れることなくdirenv
を無事にインストールできます。$ cd /var/www/html $ sudo git clone https://github.com/direnv/direnv $ cd direnv $ sudo make installこの
sudo make install
の時点でbash: go: コマンドが見つかりません
となった場合、それはAmazon Linuxにgo
が入っていないだけですので、yum
で入れてあげましょう。$ sudo yum install golangこれで
go
が入るはずです。バージョンを確認します。$ go version go version go1.12.8 linux/amd64確かに入っていますね。
これで先ほどの
bash: go: コマンドが見つかりません
のエラーは解消されているはずですので、もう一度試しましょう。$ cd /var/www/html/direnv $ sudo make installこれで
direnv
のインストールができました
あとは.bashrc
あるいは.zshrc
に以下を1行記載しておきましょう。$ sudo vim ~/.bashrc // 末尾などに記載 eval "$(direnv hook bash)"あとは
.bashrc
の変更を読み込めばOKです。
source
コマンドで.bashrc
の変更を読み込みましょう。$ source ~/.bashrcこれで
direnv
が入ります。念のため、バージョンを確認しておきましょう。$ direnv version 2.20.1無事に
direnv
をインストールできました
これ以降は/var/www/html/direnv/*
は不要なディレクトになりますので、削除しても構いません。$ cd /var/www/html $ sudo rm -r direnv/
direnv
を実際に使ってみる
direnv
の一番基本的な使用方法を紹介しておきます。
まず環境変数を定義したいプロジェクトproject
に移動します。
環境変数はディレクトリごとに定義すると冒頭で言いましたが、今回はproject
のルートディレクトリ/
で管理してみます。// 環境変数を定義したいあなたのディレクトリへ移動します。 $ cd /var/www/html/project direnv: error .envrc is blocked. Run `direnv allow` to approve its content.何やら怪しいエラーを吐いていますが、なんてことはありません。エラー文の指示通りに
$ direnv allowとしてあげましょう。
今後もこういったエラーを吐くことがありますが、その度にdirenv allow
を呪文のように唱えればOKです。さて、このディレクトリに
.envrc
というファイルを新しく作成して、このファイルに環境変数を定義します。$ echo export ENV_USERNAME=hogehoge >> .envrc $ echo export ENV_PASSWORD=hugahuga >> .envrcこれで
.envrc
に環境変数を定義できているはずです。
.envrc
ファイルの中身はこのようになっているはずですexport ENV_USERNAME=hogehoge export ENV_PASSWORD=hugahugaまた、コマンドラインから
.envrc
の中身を確認することも可能です。$ echo ${ENV_USERNAME-nope} hogehoge // OK (nopeの場合は設定に不備があります) $ echo ${ENV_PASSWORD-nope} hugahuga // OK (nopeの場合は設定に不備があります)上記のようになれば環境変数を定義できています。
実際に、このディレクトリに改めて移動すると、環境変数が有効になっていることが確認できます。$ cd ~ // 環境変数が無効化 direnv: unloading $ cd /var/www/html/project // 環境変数が有効化 direnv: loading .envrc direnv: export +ENV_USERNAME +ENV_PASSWORD
.envrc
は絶対にcommitしない
.envrc
にはパスワードなどの機密情報を記載することが一般的です。
これはgitないしはGihHubなどを使用する際の汎用的な注意点ですが、 パスワードなどの情報が記載してあるファイルは絶対にcommitしない ように注意しましょう。
これを防ぐためには、例えば.gitignore
に.envrc
を追記してあげれば良さそうですね。
- 投稿日:2019-11-24T13:54:33+09:00
KVMでおうちKubernetes
ぷりぷりあぷりけーしょんずインフラ担当による ぷりぷりあぷりけーしょんず Advent Calendar 2019 の3日目
1.目標
これを作ります。
2.環境
ホストOS
- メモリ:16G
- OS:Ubuntu18.04.2
- KVM:
$ virsh version Compiled against library: libvirt 4.0.0 Using library: libvirt 4.0.0 Using API: QEMU 4.0.0 Running hypervisor: QEMU 2.11.1ゲストOS(Master,Worker01,Worker02)
- メモリ:4G
- OS:Ubuntu18.04.2
- Kubernetes:1.15.3
3.仮想マシンの作成
3.1.必要パッケージのインストール
$ sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils libosinfo-bin libguestfs-tools virt-top
3.2.仮想マシンの作成
3.2.1.インスタンスイメージの作成
sudo virt-install \ --name master \ --ram 4096 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/master.img,size=20,format=qcow2 \ --os-type linux \ --os-variant ubuntu18.04 \ --network bridge=virbr0 \ --graphics none \ --console pty,target_type=serial \ --location 'http://jp.archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/' \ --extra-args 'console=ttyS0,115200n8 serial3.2.2.仮想マシンのコンソールへアクセスする設定
最終的には仮想マシンへSSHで接続しますが、SSHやNWの基本設定の操作をするために下記の手順を踏みます。
$ sudo virsh shutdown master
$ sudo guestmount -d master -i /mnt
$ sudo ln -s /mnt/lib/systemd/getty@.service /mnt/etc/systemd/system/getty.target.wants/getty@ttyS0.service
$ sudo umount /mnt
3.2.3.仮想マシンの諸設定
仮想マシンのIPアドレスを手動で設定します
ホストOSで以下を実行
$ sudo virsh start master --console
ゲストOSへログイン後以下を実行
$ sudo su -
# vi /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: ens2: dhcp4: false addresses: - 192.168.122.2/24 gateway4: 192.168.122.1 nameservers: addresses: - 192.168.122.1
# netplan apply
Kubernetesを利用可能にする
# swapoff -a
# vi /etc/fstab
## 以下の行をコメントアウト /swapfile none swap sw 0 0
# vi /etc/hosts
# 作成した仮想マシンの情報を追記 # IPアドレスは各自読み替えてください 192.168.122.2 master 192.168.122.3 node01 192.168.122.4 node02
# echo net.bridge.bridge-nf-call-iptables = 1 >> /etc/sysctl.conf
# echo net.bridge.bridge-nf-call-ip6tables = 1 >> /etc/sysctl.conf
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
またこの際にホストOSから仮想マシンへSSHするユーザを作成したり、SSHのための公開鍵のコピーを行なってください。
3.2.4.仮想マシンへDocker,Kubernetesのインストール
上記に引き続き仮想マシンへログインした状態で作業してください。
公式サイトにある手順を実施していますが、バージョンを明示するため冗長ですが手順を示します。
Docker
# apt-get 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 -
# apt-key fingerprint 0EBFCD88
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# apt-get update
# apt-get install docker-ce=5:18.09.9~3-0~ubuntu-bionic docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic containerd.io
Kubernetes
# apt-get update && sudo apt-get install -y apt-transport-https curl
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt-get install -y kubelet kubeadm kubectl
# apt-mark hold kubelet kubeadm kubectl
3.3.仮想マシンを複製
ここまでの手順で作成したMaster用仮想マシンを雛形として、Worker用の仮想マシンを作成します。
$ sudo virsh shutdown master
$ sudo virt-clone --original master --name node01 --file /var/lib/libvirt/images/node01.img
これでWorker用仮想マシンが作成されたので3.2.3.の
IPアドレスの手動設定
だけして、仮想マシンの作成は終了です。4.Kubernetesクラスタ作成
Masterノード
Master用仮想マシンへログインし、以下のコマンドを実行します。
--pod-network-cidr
オプションはPodの所属するネットワークの指定に利用します。Calicoのデフォルトが192.168.0.0/16
でKVMのネットワークとバッティングするため10.x.x.x/16
で設定すると良いでしょう。
$ sudo kubeadm init --apiserver-advertise-address=192.168.122.2 --pod-network-cidr=10.64.0.0/16
(前略) To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.122.2:6443 --token 0bno9n.2h84n6b0nhl71iyy \ --discovery-token-ca-cert-hash sha256:5fc061867c95d29841675ec575af7787a84316167a5b92e73b7f7a483579c100コマンドの結果にある、
mkdir~chown
までのコマンドを実行することでkubectl
によるKubernetesの操作が可能になります。Workerノード
Masterノードで実行したコマンドの結果の最終行にあるコマンドを各Workerノードで実行します。
$ sudo kubeadm join 192.168.122.2:6443 --token 0bno9n.2h84n6b0nhl71iyy --discovery-token-ca-cert-hash sha256:5fc061867c95d29841675ec575af7787a84316167a5b92e73b7f7a483579c100
クラスタの確認
Masterノードで下記のコマンドを実行してNodeの状態を確認します。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION master NotReady master 101s v1.15.3 node01 NotReady <none> 21s v1.15.3 node02 NotReady <none> 5s v1.15.3CNIを導入していないのでNodeのStatusが
NotReady
ですが、kubectlでNodeの情報を取得できていることがわかります。5.Calicoのインストール
Calicoとは
DockerでデプロイしたコンテナはそのDockerのあるホスト上でのみ通信可能です。(緑矢印)
複数のホスト上でDockerを構築した場合、コンテナが外方向で通信可能な範囲は他のホストのインターフェイスまでになります。(青矢印)
ネットワークの異なる他のホストのコンテナへはアクセスできません。(紫矢印)
Calicoを利用することで、Kubernetesクラスタ作成時に指定したpod-network-cidrのネットワーク内でコンテナ(Pod)間の通信が可能になります。
コンテナのIPアドレスの共有はetcdとBGPを利用します。
etcdのインストール
Calicoの設定情報やIPや各コンテナのIPを保存するためのetcdPodをデプロイします。
$ wget https://docs.projectcalico.org/v3.5/getting-started/kubernetes/installation/hosted/etcd.yaml
$ kubectl apply -f etcd.yaml
Calicoのインストール
$ wget https://docs.projectcalico.org/v3.5/getting-started/kubernetes/installation/hosted/calico.yaml
$ vi calico.yaml
IPIPモードをOFFに、Calicoの利用するネットワークの設定にpod-network-cidrで指定した値を書き込みます。
217 - name: CALICO_IPV4POOL_IPIP 218 value: "off" 225 # The default IPv4 pool to create on startup if none exists. Pod IPs will be 226 # chosen from this range. Changing this value after installation will have 227 # no effect. This should fall within `--cluster-cidr`. 228 - name: CALICO_IPV4POOL_CIDR 229 value: "10.64.0.0/16"
$ kubectl apply -f calico.yaml
configmap/calico-config created secret/calico-etcd-secrets created daemonset.extensions/calico-node created serviceaccount/calico-node created deployment.extensions/calico-kube-controllers created serviceaccount/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created clusterrole.rbac.authorization.k8s.io/calico-node created clusterrolebinding.rbac.authorization.k8s.io/calico-node created
$ kubectl get pods -A
Calicoのコンポーネントがデプロイされていることがわかります。
またCalicoをデプロイするまではステータスがPendingであった、
coredns
PodもRunningになっています。NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-etcd-4m6k2 1/1 Running 0 73s kube-system calico-kube-controllers-5d57bd4b96-4bj8s 1/1 Running 1 100s kube-system calico-node-jmsmd 1/1 Running 2 100s kube-system calico-node-mhlnk 1/1 Running 1 100s kube-system calico-node-v9ll2 1/1 Running 1 100s kube-system coredns-5c98db65d4-j2h6b 1/1 Running 0 39m kube-system coredns-5c98db65d4-x2shs 1/1 Running 0 39m kube-system etcd-master 1/1 Running 0 38m kube-system kube-apiserver-master 1/1 Running 0 38m kube-system kube-controller-manager-master 1/1 Running 0 38m kube-system kube-proxy-2xggm 1/1 Running 0 38m kube-system kube-proxy-j9j9m 1/1 Running 0 38m kube-system kube-proxy-p6xnw 1/1 Running 0 39m kube-system kube-scheduler-master 1/1 Running 0 38m6.Pod間通信の確認
冒頭にある通り、NginxPodを利用してPod間通信の確認をしていきます。
Nginxのデプロイ
$ kubectl run my-nginx --image=nginx --replicas=2 --port=80
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/my-nginx created
$ kubectl get pods -o wide
Worker01,Worker02のそれぞれにNginxがデプロイされています。
Podの持つIPアドレスがCalicoで指定したネットワークになっていることも確認できます。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-nginx-756fb87568-f9bvd 1/1 Running 0 17h 10.64.196.130 node01 <none> <none> my-nginx-756fb87568-gpg99 1/1 Running 0 17h 10.64.140.64 node02 <none> <none>疎通確認
curl用Podのデプロイ
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty --rm
別ターミナルでMasterノードへログイン後
$ kubectl get pods
を実行するとcurl用Podがデプロイされたことがわかります。今回はWorker02にデプロイされました。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES curl-6bf6db5c4f-vfwfd 1/1 Running 0 47s 10.64.140.65 node02 <none> <none> my-nginx-756fb87568-f9bvd 1/1 Running 0 17h 10.64.196.130 node01 <none> <none> my-nginx-756fb87568-gpg99 1/1 Running 0 17h 10.64.140.64 node02 <none> <none>疎通確認
[ root@curl-6bf6db5c4f-vfwfd:/ ]$ curl -I 10.64.196.130
HTTP/1.1 200 OK Server: nginx/1.17.6 Date: Sun, 24 Nov 2019 07:38:15 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT Connection: keep-alive ETag: "5dd3e500-264" Accept-Ranges: bytes
[ root@curl-6bf6db5c4f-vfwfd:/ ]$ curl -I 10.64.140.64
HTTP/1.1 200 OK Server: nginx/1.17.6 Date: Sun, 24 Nov 2019 07:42:30 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT Connection: keep-alive ETag: "5dd3e500-264" Accept-Ranges: bytes同一ホスト(Worker02)のPodはもちろん、異なるホスト(Worker01)への疎通についても確認できました。
Calicoの確認
Calicoの説明箇所で
etcd
とBGP
を利用していると書きましたが、それの確認をしてみます。etcdctlのインストール
calico-etcdのバージョン確認
$ curl http://10.96.232.136:6666/version | jq .
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 44 100 44 0 0 11000 0 --:--:-- --:--:-- --:--:-- 14666 { "etcdserver": "3.3.9", "etcdcluster": "3.3.0" }etcdctlのインストール
$ ETCD_VER=v3.3.9
$ GOOGLE_URL=https://storage.googleapis.com/etcd
$ DOWNLOAD_URL=${GOOGLE_URL}
$ curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o etcd-${ETCD_VER}-linux-amd64.tar.gz
$ tar zxvf etcd-v3.3.9-linux-amd64.tar.gz
$ sudo mv etcd-v3.3.9-linux-amd64/etcdctl /usr/local/bin/
etcdctlのセットアップ
calico-etcdがVersion3を利用しているため、etcdctlでもVersion3を利用するように設定します。
--endpointsオプションには先ほどデプロイしたetcd.yamlにある
ClusterIP
を指定します。
$ alias etcd='ETCDCTL_API=3 etcdctl --endpoints=10.96.232.136:6666'
$ etcd version
etcdctl version: 3.3.9 API version: 3.3calico-etcdの確認
下記のコマンドでetcdに格納されているキーの一覧を取得可能です。
$ etcd get / --prefix --keys-only
先ほどデプロイしたNginxPodの情報についても格納されていることがわかります(JSONは整形してあります)。
$ etcd get /calico/resources/v3/projectcalico.org/workloadendpoints/default/node01-k8s-my--nginx--756fb87568--f9bvd-eth0
{ "kind": "WorkloadEndpoint", "apiVersion": "projectcalico.org/v3", "metadata": { "name": "node01-k8s-my--nginx--756fb87568--f9bvd-eth0", "generateName": "my-nginx-756fb87568-", "namespace": "default", "uid": "e2b350ab-0df7-11ea-a8fd-525400f19390", "creationTimestamp": "2019-11-23T13:48:09Z", "labels": { "pod-template-hash": "756fb87568", "projectcalico.org/namespace": "default", "projectcalico.org/orchestrator": "k8s", "projectcalico.org/serviceaccount": "default", "run": "my-nginx" } }, "spec": { "orchestrator": "k8s", "node": "node01", "containerID": "0baf28fb5c448b6850091691ad79c713f665e4915862c4d7713304414f02c210", "pod": "my-nginx-756fb87568-f9bvd", "endpoint": "eth0", "ipNetworks": [ "10.64.196.130/32" ], "profiles": [ "kns.default", "ksa.default.default" ], "interfaceName": "cali4ecc9d1d445", "mac": "ae:61:8a:0a:7b:4d" } }Calicoについてはまだまだ理解が浅いので断言はできませんが、これらの情報を利用してPod間の通信を可能にしているものと思われます。(たぶんね)
7.まとめ
ここまでで構築した環境があれば、Kubernetes上に適当なアプリケーションをデプロイするもサービスメッシュを実現するも、なんでも可能になります!
さらにこの記事で構築した環境については
12/11or19
のIstio構築に続きます!参考URL
https://tech.uzabase.com/entry/2017/08/07/172411
https://thinkit.co.jp/article/14638
https://docs.projectcalico.org/v3.5/getting-started/kubernetes/
https://www.slideshare.net/okinawaopenlabs/20180119-calicopj-calicobgp
- 投稿日:2019-11-24T11:32:00+09:00
Oracle LinuxでZabbix4.0環境構築
Oracl LinuxでZabbix環境を構築する手順を記載します。DBはMySQL8.0、PHP7.2で構築しています。Oracle Linux独自の手順はリポジトリの箇所くらいかと思います。
Zabbixサーバを構築してそこにZabbixエージェントも設定します。またJavaアプリケーションを監視する場合、zabbix-java-gatewayが必要になるので最後にインストール、設定しています。
またZabbixDBについてバックアップスクリプトとリストアテストを別記事で紹介しています。
前提
・Oracle Linux Server release 7.6で構築。
・OS初期設定が完了していること(yum update,selinux無効化,firewalld無効化、timezone設定など)。
・必要なポートを開放しておくこと。
Zabbixサーバ → Zabbixエージェント 10050
Zabbixエージェント → Zabbixサーバ 10051Zabbixサーバ構築手順
※rootのコマンドには行頭に # が、root以外は $ が付いています。
MySQL8.0
リポジトリ設定
# curl -o /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7 # curl -o /etc/yum.repos.d/public-yum-ol7.repo http://yum.oracle.com/public-yum-ol7.repo # vi /etc/yum.repos.d/public-yum-ol7.repo ※以下を変更 [ol7_MySQL80] enabled=0 ⇒ 1 [ol7_developer_EPEL] enabled=0 ⇒ 1 [ol7_developer_php72] enabled=0 ⇒ 1インストール
# yum install mysql-community-server mysql-community-devel設定ファイル作成
# cp -p /etc/my.cnf /etc/my.cnf.org # ll /etc/my.cnf* # vi /etc/my.cnf ※以下を記載 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 default_password_lifetime = 0 skip-character-set-client-handshake character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 default-authentication-plugin=mysql_native_password log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid innodb_dedicated_server = ON innodb_io_capacity = 1000 innodb_io_capacity_max = 4000 innodb_max_dirty_pages_pct = 90※default-authentication-plugin について
mysql8.0デフォルトの認証方式、caching_sha2_passwordはzabbixにまだ対応していないです。
そのため以下2つのどちらかが必要となります。
1,my.cnfに以下の設定を記載(今回の手順はこちら)。
default-authentication-plugin=mysql_native_password
2,SQLでzabbixユーザだけネイティブ認証に変更。
alter user zabbix@'localhost' identified with mysql_native_password by 'パスワード';※innodb関連の設定について
・innodb_dedicated_server
自動的に以下innodbのメモリ、パラメータ設定をする
innodb_buffer_pool_size
innodb_log_file_size
innodb_flush_method・innodb_io_capacity
innodb_io_capacityが小さいとバックグラウンド処理がたまってしまう。
以下指標があるがとりあえず1000、maxを4000としておく。
デフォルト値:200
RAID:500 ~ 1000
SSD:2000 ~ 5000
IO-Drive2:10000 ~ 50000・innodb_max_dirty_pages_pct
InnoDBバッファプールを占めるダーティな領域(更新された領域)が90%を超えると、
強制的に(他の処理をブロックして)チェックポイントが行われる。
最適値が不明なのでとりあえずデフォルトの90にしておく。データディレクトリ作成
# mkdir -p /var/lib/mysql起動設定
# systemctl start mysqld # systemctl status mysqld # systemctl enable mysqld確認
# mysql --version初期パスワード確認
# grep 'A temporary password' /var/log/mysqld.log 例: JD2IdIJ34v#Z初期設定 (パスワードは例)
# mysql_secure_installation →Enter password for user root:JD2IdIJ34v#Z (上記表示されたパスワード入力) →New password:(変更後のパスワード入力) →Re-enter new password:(変更後のパスワード入力) →Change the password for root ? ((Press y|Y for Yes, any other key for No) :N →Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y →Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y →Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y →Reload privilege tables now? (Press y|Y for Yes, any other key for No) : YDB作成
mysql -uroot -p mysql> CREATE DATABASE zabbix character set utf8 collate utf8_bin;DBユーザ作成
mysql> create user zabbix@'localhost' identified by 'パスワード'; mysql> grant all on zabbix.* to zabbix@'localhost'; mysql> flush privileges; mysql> quitPHP
※ OracleLinuxの用意するPHP7.2では「zabbix-web-mysql」が入らないため、REMIリポジトリからPHP7.2を取得。
EPEL,REMI
# rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm # rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmリポジトリ有効化 (PHP7.3も有効化できるようになっているので、/etc/yum.repos.d/remi-php73.repoの[remi-php73]を試してもいいかも。)
# vi /etc/yum.repos.d/remi-php72.repo ※以下変更 [remi-php72] enabled=0 ⇒ 1emi-safeリポジトリ無効 (これを無効にしないとPHPインストールを邪魔するらしいので念の為無効化)
# vi /etc/yum.repos.d/remi-safe.repo ※以下変更 [remi-safe] enabled=1 ⇒ 0インストール
※PHPのバージョン7.2.XXのいくつかから、php-mbstringのインストールに鬼車5(正規表現のライブラリ)が 必要になるためインストールしておく。 # yum --enablerepo=remi install oniguruma5 # yum install php php-gd php-bcmath php-xml php-mbstring php-pecl-mysql確認
# php -vZabbix4.0
リポジトリ
# rpm -ivh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpmインストール
# yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent zabbix-get sendmailデータ流し込み
流し込むデータ(zabbix-server-mysql-4.X.X)のバージョン確認 # ls -ld /usr/share/doc/zabbix-server-mysql* 4.X.Xの箇所を編集 # cd /usr/share/doc/zabbix-server-mysql-4.X.X パスワード入力流し込み(1,2分かかる) # zcat create.sql.gz | mysql -u zabbix -p zabbix設定
# cp -p /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.org # vi /etc/zabbix/zabbix_server.conf ※以下編集 # DBPassword= ↓ DBPassword=<ZabbixDBのパスワード> # DBHost=localhost ↓ DBHost=localhost ※DBNameとDBUserはデフォのまま確認
# egrep "^DBPassword=|^DBHost=|^DBName=|^DBUser=|^DBPassword" /etc/zabbix/zabbix_server.confphp.ini設定
# cp -p /etc/php.ini /etc/php.ini.org # sed -i 's/\;date\.timezone\ \=/date\.timezone\ \=\ Asia\/Tokyo/g' /etc/php.ini # grep "^date.timezone" /etc/php.iniApache設定
# cp -p /etc/httpd/conf.d/zabbix.conf /etc/httpd/conf.d/zabbix.conf.org # sed -i 's/<IfModule mod_php5\.c>/<IfModule mod_php7\.c>/g' /etc/httpd/conf.d/zabbix.conf # sed -i -e "s/# php_value date.timezone Europe\/Riga/php_value date.timezone Asia\/Tokyo/g" /etc/httpd/conf.d/zabbix.conf # egrep "mod_php|date.timezone" /etc/httpd/conf.d/zabbix.conf起動、自動起動設定
# systemctl start zabbix-server # systemctl enable zabbix-server # systemctl start httpd # systemctl enable httpd・ブラウザでインストール作業
http://ZabbixサーバのGIP/zabbix/
⇒ Zabbixの初期設定はこちらを参考に。メールサービス起動
# systemctl start sendmail # systemctl enable sendmailZabbixエージェント設定
zabbix-agent設定
# vi /etc/zabbix/zabbix_agentd.conf ※ 環境に合わせて変更。 Server=ZabbixサーバのIP(ここでは127.0.0.1のままでよい) ServerActive=ZabbixサーバのIP(ここでは127.0.0.1のままでよい) Hostname=このサーバのホスト名(zabbixコンソール上でホスト名を記載するときはここと一致させること。)監視用設定変更
※こいつは僕の好みも入ってます。# sed -i -e "s/# RefreshActiveChecks=120/RefreshActiveChecks=120/g" /etc/zabbix/zabbix_agentd.conf # sed -i -e "s/# AllowRoot=0/AllowRoot=1/g" /etc/zabbix/zabbix_agentd.conf # sed -i -e "s/# EnableRemoteCommands=0/EnableRemoteCommands=1/g" /etc/zabbix/zabbix_agentd.conf # sed -i -e "s/# =3/Timeout=3/g" /etc/zabbix/zabbix_agentd.conf ※"HostnameItem","HostMetadata"など設定すればコンソール上でホストを追加しなくても、ホストをzabbixサーバに自動登録することができる(https://qiita.com/rotekxyz/items/79d289853145c855cd47 )。 どういう運用にするかは運用者に任せるので、ここでは設定しない。サービス再起動、自動起動設定
# systemctl enable zabbix-agent # systemctl start zabbix-agent # systemctl status zabbix-agentJMX監視設定
おまけ的なものですが、TomcatなどJavaアプリケーションを監視する場合、zabbix-java-gatewayというものが必要になりますのでインストールしておきます。
zabbix-java-gatewayインストール
# yum install zabbix-java-gateway # systemctl start zabbix-java-gateway # systemctl enable zabbix-java-gateway設定編集
# vi /etc/zabbix/zabbix_server.conf ※以下項目を修正 JavaGateway=127.0.0.1 JavaGatewayPort=10052 StartJavaPollers=3サービス再起動
# systemctl restart zabbix-server # systemctl restart zabbix-java-gateway監視項目の設定
ダッシュボード上でZabbixサーバに対し以下標準テンプレートを設定する。
・Template OS Linux
・Template Module ICMP Pingメール送信テスト
こちらを参考に、自分の個人アドレスを使ってメール配信設定をする。Zabbixサーバのzabbix-agent停止してみて、メール通知がされるかを確認する。
- 投稿日:2019-11-24T11:31:42+09:00
ZabbixDBについてバックアップスクリプトとリストアテスト
ZabbixDBバックアップ関連について、バックアップスクリプトの配置とリストアテストについて記載します。
Oracle LinuxでZabbixを構築した後の記事となります。バックアップスクリプトの配置
※以下Zabbixサーバでの作業です。
MySQLのZabbixユーザにRELOAD権限付与
mysql -uroot -p mysql> GRANT RELOAD ON *.* TO 'zabbix'@'localhost'; mysql> flush privileges; mysql> quitスクリプトを以下ディレクトリに配置
mkdir -p /usr/local/bin/ZABBIX_MYSQL_BACKUP/作成したディレクトリに、以下zabbix-mysql-backup.shというファイル名で配置します。
割と即席で作りましたが、スクリプトに失敗した場合メール送信するようにしています。サーバがmailコマンドでメール送信できることが前提ですが、必要なければ削除してOKかと。
またZabbixDBユーザのパスワードを平文で記載したくないため、暗号化の方法を後述しています。#!/bin/bash ###################################################################### # # [処理概要] # MySQLのzabbixDBをdumpしてバックアップディレクトリに転送。 # dumpをtarで圧縮し、dump自体は削除。圧縮ファイルは3世代残す。 # # [引数] # なし # ###################################################################### ###################################################################### # バージョン 作成/更新者 更新日 変更内容 #--------------------------------------------------------------------- # 001-01 yu araki YYYY/MM/DD 新規作成 ###################################################################### ###################################################################### # 事前処理 ###################################################################### #--------------------------------------------------------------------- # 変数定義 #--------------------------------------------------------------------- # バックアップディレクトリtgzファイル数カウント用 BK_FILE_COUNT=0 # 削除するファイルの数カウント DELETE_FILE_COUNT=0 # 実行結果格納フラグ RESULT_FLAG=0 # 日付 TODAY=`date "+%Y%m%d"` # タイムスタンプ NOW=`date "+%Y-%m-%d %H:%M:%S"` # このスクリプトのファイル名 SCRIPT_NAME=$(basename $0) # このスクリプトのファイルパス SCRIPT_PATH="/usr/local/bin/ZABBIX_MYSQL_BACKUP/${SCRIPT_NAME}" # スクリプト実行ホスト名 HOST_NAME=$(hostname) # バックアップ保持期間(日) readonly PERIOD=3 # ローカルバックアップ格納ディレクトリ readonly BACKUP_DIR="/backup/mysql" # データベースバックアップファイル名 readonly BACKUP_DATABASE_FILE="zabbix_mysql_dump_${TODAY}.sql" # 圧縮後のバックアップファイル名 readonly BACKUP_TAR_FILE="zabbix_mysql_backup_${TODAY}.tgz" # バックアップログディレクトリ readonly BK_LOG_DIR="/var/log/mysql_backup" # バックアップログファイル名 readonly BACKUP_LOG="${BK_LOG_DIR}/zabbixdb_backup.log" # バックアップエラーログファイル名 readonly BACKUP_ERROR_LOG="${BK_LOG_DIR}/zabbixdb_backup_error.log" ## Zabbix DB用変数 # DBユーザ名 readonly DB_USER="zabbix" # DB名 readonly DB_NAME="zabbix" # DBパスワード readonly DB_PASSWD=$(openssl rsautl -decrypt -inkey ~/.ssh/mysql_rsa -in /usr/local/bin/ZABBIX_MYSQL_BACKUP/mysql_user_password.rsa) ## メール送信用変数 # 送信元アドレス readonly FROM="zabbix-mysql-backup@monitor.com" # 送信先アドレス readonly TO="送信先アドレスを記載" # メールタイトル readonly SUBJECT="【zabbix mysql db】backup_error " ###################################################################### # 関数定義 ###################################################################### #--------------------------------------------------------------------- # バックアップログ出力 #--------------------------------------------------------------------- function fnc_output_scriptlog() { (echo "$SCRIPT_NAME: $1 $NOW" >>$BACKUP_LOG) 2>/dev/null return $? } #--------------------------------------------------------------------- # アラートメール送信関数 #--------------------------------------------------------------------- function fnc_send_mail() { echo -e "$1 \nscript_path: $SCRIPT_PATH \nhostname: $HOST_NAME" | mail -s $SUBJECT -r $FROM $TO return $? } ###################################################################### # 開始処理 ###################################################################### # 開始ログ出力 echo $TODAY start daily mysql backup process. >> $BACKUP_LOG # バックアップディレクトリ存在確認 mkdir -p $BACKUP_DIR # バックアップログディレクトリ存在確認 mkdir -p $BK_LOG_DIR ###################################################################### # メイン処理 ###################################################################### #--------------------------------------------------------------------- # MySQLのZabbixDB ローカルバックアップ #--------------------------------------------------------------------- # バックアップファイル存在確認 FIND_FILE_COUNT=$(find $BACKUP_DIR -type f -name $BACKUP_TAR_FILE | wc -l) # 当日分tgzファイルが存在しない場合 if [ $FIND_FILE_COUNT -eq 0 ]; then #MySQLローカルデータバックアップ MYSQL_PWD=$DB_PASSWD mysqldump --single-transaction --default-character-set=binary --flush-logs --events --quick -u${DB_USER} ${DB_NAME} >"${BACKUP_DIR}/${BACKUP_DATABASE_FILE}" 2>> $BACKUP_ERROR_LOG #ログ出力 if [ "$?" = "0" ];then echo $NOW Mysql database backup completed. >> $BACKUP_LOG echo $NOW start compression of backup sql file backup. >> $BACKUP_LOG else # ログ出力、エラーメール送信 for i in fnc_output_scriptlog fnc_send_mail ;do ${i} "Mysql database backup failed."; done # エラーフラグ指定 RESULT_FLAG=1 fi #バックアップファイル圧縮 cd $BACKUP_DIR ; tar czvf ${BACKUP_TAR_FILE} ${BACKUP_DATABASE_FILE} 2>> $BACKUP_ERROR_LOG #ログ出力 if [ "$?" = "0" ];then echo $NOW compression of backup sql is completed. delete the backup file before compression. >> $BACKUP_LOG #圧縮前のファイル削除 rm -f ${BACKUP_DIR}/${BACKUP_DATABASE_FILE} 2>> $BACKUP_ERROR_LOG else # ログ出力、エラーメール送信 for i in fnc_output_scriptlog fnc_send_mail ;do ${i} "compression of backup sql is failed."; done #圧縮前のファイル削除 rm -f ${BACKUP_DIR}/${BACKUP_DATABASE_FILE} 2>> $BACKUP_ERROR_LOG # エラーフラグ指定 RESULT_FLAG=1 fi # 既に当日分のtgzファイルが存在する場合 else #ログ出力 echo $NOW because today backup exists, skip backup process. >> $BACKUP_LOG fi #--------------------------------------------------------------------- # tgzファイルが3世代より多く存在する場合の処理 #--------------------------------------------------------------------- # バックアップ完了確認 if [ $RESULT_FLAG -eq 0 ]; then # バックアップディレクトリ内tgzファイルカウント BK_FILE_COUNT=$(ls -l $BACKUP_DIR/zabbix_mysql_backup_*.tgz | wc -l) 2>> $BACKUP_ERROR_LOG DELETE_FILE_COUNT=`expr $BK_FILE_COUNT - $PERIOD` 2>> $BACKUP_ERROR_LOG # 3世代より多く存在する場合 if [ $DELETE_FILE_COUNT -gt 0 ]; then # tgzファイル削除 cd $BACKUP_DIR ; rm -f $(ls -lt zabbix_mysql_backup_*.tgz | tail -${DELETE_FILE_COUNT} | awk '{ print $9;}') 2>> $BACKUP_ERROR_LOG # ログ出力 echo $NOW delete the three days before files from backup directory. >> $BACKUP_LOG else # ログ出力 echo $NOW there were no files of three days before in backup directory. >> $BACKUP_LOG fi else # バックアップが未完の場合、エラーとして終了 echo $TODAY zabbix mysql backup process has not finished. >> $BACKUP_LOG exit 1 fi ###################################################################### # 終了処理 ###################################################################### #終了ログ出力 echo $TODAY finished daily backup process. >> $BACKUP_LOG exit 0スクリプト権限付与
chmod +x /usr/local/bin/ZABBIX_MYSQL_BACKUP/zabbix-mysql-backup.shZabbixDBユーザのパスワード暗号化
スクリプトにDBユーザのパスワードを平文で記載するのが嫌なため、暗号化させます。
移動
cd /usr/local/bin/ZABBIX_MYSQL_BACKUP/パスワード暗号化用の鍵を生成
ssh-keygen -t rsa -f ~/.ssh/mysql_rsarsa作成
echo 'ZabbixDBユーザのパスワード' | openssl rsautl -encrypt -inkey ~/.ssh/mysql_rsa > mysql_user_password.rsarsaの情報でログインできるか確認
mysql -u zabbix -p`openssl rsautl -decrypt -inkey ~/.ssh/mysql_rsa -in mysql_user_password.rsa`リストアテスト
上記スクリプトでとったバックアップを使いリストアテストをします。
解凍
cd /backup/mysql/ tar -xzvf mysql_backup_YYYYMMDD.tgzZabbixDBを削除
mysql -uroot -p drop database zabbix;⇒Zabbixコンソール上でDBエラーが表示されることを確認
ZabbixDBを再作成
CREATE DATABASE zabbix character set utf8 collate utf8_bin;リストア
mysql -u zabbix -pパスワード -D zabbix --default-character-set=binary < mysql_dump_YYYYMMDD.sql⇒Zabbixコンソール上で動作が問題ないことを確認。
- 投稿日:2019-11-24T10:58:02+09:00
Diginnosタブレットにlinuxを載せ替える①
Diginnos Windowsタブレットにlinuxを載せる
すこし(?)前のwindowsタブレットにlinuxをのせたい
非常に安い割に液晶がきれいで買ったものの動作がもっさりしすぎて眠っていたそもそも動作する保証がないため、いろいろ試行錯誤する日記のような記録のつもり
ハードウェアスペック
型番 DG-D10IW3 液晶 10.1型ワイド 1920x1200 光沢 プロセッサー型番 Atom x5-Z8300 動作周波数 定格 1.44GHz/ バースト 1.88GHz コア数 / スレッド数 4 / 4 メモリ 2GB 内部ストレージ 32GB eMMC バッテリー駆動時間 約7.5時間 (JEITA2.0) 薄さ 9.6mm 32bitのwindowsが紐付けられていたが、64bitCPUが入っていた
しかも4コア4スレッドって、、、、やること(予定)
- windowsのライセンス・ソフトウェア情報を退避する(バックアップする)
- linuxを入れてみる?
- ハードウェアとの互換性を確認する
きっと何回もやり直すんだろうなーと。。。
最終目標
- linuxが正常に起動する
- 動画が見れる
- pdf等の文章が見れる
- wifi・タッチパネル等のハードが最低限使える
windowsライセンスの退避
windows ライセンスはデジタルライセンス認証ができるらしい
自身のマイクロソフトアカウントと紐付けることで、条件付きではあるが移行や再インストールができるらしいやりかたは。。。
いろんな人が乗っけているのでここでは割愛するとりあえずwindowsのライセンスさえ抑えておけばどうとでもなるのでその他は特に何もしない
今回はここまで
次回はArchLinuxをいれたいなー
以上
- 投稿日:2019-11-24T09:15:16+09:00
見様見真似でlinux の仮想環境をVisual BOXで作ったド初心者メモ
ついに!!
休日に一緒に勉強を教えてくれる友達ができた!!!\(^o^)/3人でなんかアプリ作りながら勉強しようぜ!
って話してて
その友達にまず言われたのが「とりあえずLinuxの環境作りましょうか!」
!?
Windowsしか使ったことないし、
そもそもLinuxって何者!?
ってレベルで、名前は聞いたことある、別のOSなんでしょ?
Windowsにお別れを告げないといけないってこと?
待ってくれ心の準備が、、なんて思ってたら全然そんなことなくて
仮想の環境を作って
そこにリモートデスクトップみたいな感じで繋ぐだけらしい...!安心して
教えてもらうことに。横で教えてもらいながらなので、すごい速度で進んでいく。
すごい。できる人と勉強するのってすごい!ただ教えてもらいながらすると、進行速度が上がる分、
「今自分が何してるのか」
「なんでそんなことするのか」
整理できないまま、環境だけができていく。。このままじゃあ、自分が次誰かに教える番は一生こない。。
もっかいおんなじことができない。ってことで忘れないうちにここにメモすることにしました!
時間がないので取り合ず殴り書き&スクショペタペタです!
自分のためのメモなので、、多少の分かりにくさはご了承ください...!<使用するツール(ツールであってる?笑)>
Virtual BOX
https://www.oracle.com/virtualization/technologies/vm/downloads/virtualbox-downloads.htmlubuntu
https://jp.ubuntu.com/download<ツールについて簡単に解説>
●Virtualbox(バーチャルボックス)は、使用しているPCに仮想環境を構築して、他のOSをインストールすることができる仮想化ソフトです。
つまり、Windows使ってる人もMac使ってる人も、これを使えば、パソコンの中でパラレルワールドみたいなところを作って別のOSを使うことができるんです!
●ubuntuはLinuxの数あるディストリビューションのひとつ
ディストリビューションとはLinuxの種類のこと!
LinuxのUserになるぜ!と言っても
いろんな特徴を持ったやつがいて選ばないといけないんですね~ポケモントレーナーになるぜ!っていっても
アチャモ、ミズゴロー、キモリからまずは選ばないといけないみたいな感じですかねその中でもubuntuはとにかく初心者に使いやすいディストリビューション!
最初のジム戦は岩タイプだからキモリが使いやすいみたいな感じですかね?笑分かりにくいですね、すみません。
よくわからない方は侍さん見てください。めちゃくちゃ分かりやすいです。
→ubuntuとは?
https://eng-entrance.com/what-is-ubuntu<全体の作業の流れ>
①Virtualboxをダウンロード、インストール(リンクは上に!)
②ubuntuをダウンロード(リンクは上に!)
③Virtualboxの設定→ストレージ→空→右の青いDVDアイコン→ダウンロードしたubuntuのファイルを選択!
④起動!これでLinuxの仮想環境ができます!
仮想の環境でubuntuの設定がたくさんあるんですが、
スクショとってなかったので説明が難しい。笑また時間があったら追記します!
番外編
lenovoのUserさんの場合、
これだけだと④で起動できずエラーになってしまいます。。
→解決方法はこちら!
https://support.lenovo.com/jp/ja/solutions/ht500006