- 投稿日:2019-08-29T22:33:45+09:00
Transparent Huge Pageの無効化
THP(Transparent Huge Page)とは
THPはOSが動的にHugePageを割り当てる機能。
ページとは
メモリは、ページという単位で管理を行う。
1ページの容量は4KBとなる。HugePageとは
HugePageは、通常のページに比べて大きな容量を持つページ。
HugePageの1ページの容量は2MB。HugePageを利用するメリットとして、
1ページの容量が大きいので、ページ数を削減される
→ ページ表エントリへのアクセスする回数が減る
→ 性能向上を図ることが可能となる。
THP(Transparent Huge Page)とは
THPはOSが動的にHugePageを割り当てる機能。
THPではOSにより自動的に大規模ページが、
プロセスに割り当てられるため、大規模ページは手動で予約する必要がないHuge page サイズは下記で確認可能
$ cat /proc/meminfo | grep "Hugepagesize"$ echo never > /sys/kernel/mm/transparent_hugepage/enabledredis.log
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
- 投稿日:2019-08-29T17:37:08+09:00
Windows10でLinux仮想環境構築(VirtualBox + Vagrant)
Windows環境にて、自然言語処理および機械学習のため、
Linux開発環境が必要となり、それが一通り形となったので忘備録としてまとめます。この記事の対象者
- Windowsユーザー
- Linuxの開発環境が必要
- GCPやAWSでLinuxを使用する前に、同一環境をLocalで仮想化したい。
環境
- ホストOS:Windows10 Pro 32bit , 64bit
- ゲストOS:Ubuntu-18.04
- VirtualBox:5.2.32
- Vagrant:2.2.5
VirtualBoxをインストール
https://www.virtualbox.org/wiki/Download_Old_Builds_5_2
「Windows hosts」からダウンロード
VirtualBox 6.0.10がリリースされていますが、本記事では安定稼働している5.2ビルドを使用します。
Vagrantをインストール
https://www.vagrantup.com/downloads.html
「Windows」>「32-bit | 64bit」からインストーラーをダウンロード
現行の最新版「2.2.5」を使用しています。(2019年8月29日時点)
Vagrantについて
こちらの記事が非常に参考になります。
https://qiita.com/ozawan/items/160728f7c6b10c73b97eVagrantの事前設定
好きな場所にフォルダを作成し、Vagrantfile(起動用ファイル)を作成します。
今回はCドライブ直下に、Vagrant専用のフォルダを作成します。# Cドライブ直下にフォルダ作成 cd C:// mkdir Vagrant cd Vagrant # インスタンス起動用フォルダを作成 mkdir instance1 cd instance1 # 共有フォルダ作成 mkdir workspace # Vagrantfile作成 vagrant initVagrantのboxのGuest Additionsの自動アップデートをしてくれるライブラリをインストールします。
cd instance1 vagrant plugin install vagrant-vbguestこちらの記事を参照
https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85Proxy環境で作業する際、必要となるライブラリをインストールします。(Proxy環境のみ)
cd instance1 vagrant plugin install vagrant-proxyconfこちらの記事を参照
https://qiita.com/kota344/items/304979feaf965afffb1a仮想環境の作成
initコマンドにより、Vagrantfileが作成されたので
以下の内容で上書きします。# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # プロキシ設定(プロキシ環境のみ) if Vagrant.has_plugin?("vagrant-proxyconf") puts '- Proxy Setting ----------------------------------' config.proxy.http = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.https = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.no_proxy = "localhost,127.0.0.1" puts '--------------------------------------------------' end config.vm.box = "bento/ubuntu-18.04" config.vm.network "forwarded_port", guest: 8888, host: 8888 config.vm.provider :virtualbox do |vb| vb.customize [ "modifyvm", :id, "--memory", "4096", "--vram", "256", "--clipboard", "bidirectional", "--accelerate3d", "on", "--hwvirtex", "on", "--nestedpaging", "on", "--largepages", "on", "--ioapic", "on", "--pae", "on", "--paravirtprovider", "kvm", ] end config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace" # 初期構築スクリプト config.vm.provision :shell, :inline => <<-EOS # Ubuntuの最新パッケージ情報を取得 sudo apt update -y # apt-getをアップデート sudo apt-get upgrade -y # Ubuntuの日本語環境をインストール sudo apt-get install ubuntu-defaults-ja -y # タイムゾーンを日本時間に変更 sudo timedatectl set-timezone Asia/Tokyo # デフォルトのエディタを nano から vim に変更 sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic') EOS endプロキシの設定
{user}{password}{proxy_ip_or_domain}{proxy_port}などは適宜環境に応じて書き換えてください。
もしプロキシ環境でない場合は、以下の部分は不要ですので削除します。# プロキシ設定(プロキシ環境のみ) if Vagrant.has_plugin?("vagrant-proxyconf") puts '- Proxy Setting ----------------------------------' config.proxy.http = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.https = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.no_proxy = "localhost,127.0.0.1" puts '--------------------------------------------------' endインストールするOSの設定
仮想環境にインストールしたいOSのVagrant Boxを設定します。
インストールできるOSは、こちらのサイトから探せます。
https://app.vagrantup.com/config.vm.box = "bento/ubuntu-18.04"今回は、ubuntu18.04を使用していきます。
仮にawslinuxをインストールしたい場合は、「config.vm.box = 」以降を以下のURL先の通りに書き換えればOKです。
https://app.vagrantup.com/mvbcoding/boxes/awslinuxフォワードポートの設定
以下の設定をしておくと、仮想環境(ゲストOS)の8888ポートにてJupyter notebookなどでサーバーを立てて接続待ちしている際、ホスト側からブラウザなどで「http://localhost:8888 」と入力することで、仮想環境にアクセスできます。
config.vm.network "forwarded_port", guest: 8888, host: 8888ゲストOSからnode.jsなどでサーバーを立てて、ホスト側からアクセスしたいときなどもこの設定が使えるようです。
Vagrantのネットワークの詳しいイメージとしては、こちらの記事がわかりやすかったです。
https://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11仮想環境に割り当てるリソースについて
割り当てるメモリーなどは、以下のように設定できます。
config.vm.provider :virtualbox do |vb| vb.customize [ "modifyvm", :id, "--memory", "4096", "--vram", "256", "--clipboard", "bidirectional", "--accelerate3d", "on", "--hwvirtex", "on", "--nestedpaging", "on", "--largepages", "on", "--ioapic", "on", "--pae", "on", "--paravirtprovider", "kvm", ] endメモリーは環境に応じて使える容量も変わってくるので、環境に応じて割り当てを調整してください。
本記事では4GB割り当てています。"--memory", "4096",仮想環境のIP設定
仮想環境のIPアドレスです。ホスト側から仮想環境に、ssh接続をする際に使用します。
config.vm.network "private_network", ip: "192.168.33.10"共有フォルダの設定
共有フォルダに設定します。以下の設定をすることで仮想環境からworkspaceフォルダを参照することができます
config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"参考:https://qiita.com/tbpgr/items/67125ea883409ae5fd51
初期構築スクリプト
初回のインストールのみ起動するスクリプトです。Ubuntu日本語化やタイムゾーンの設定、apt-getなどのアップデートをバッチ処理で実行できます。
Ubuntu以外のOSで実行する場合は、必要に応じて書き換えてください。# 初期構築スクリプト config.vm.provision :shell, :inline => <<-EOS # Ubuntuの最新パッケージ情報を取得 sudo apt update -y # apt-getをアップデート sudo apt-get upgrade -y # Ubuntuの日本語環境をインストール sudo apt-get install ubuntu-defaults-ja -y # タイムゾーンを日本時間に変更 sudo timedatectl set-timezone Asia/Tokyo # デフォルトのエディタを nano から vim に変更 sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic') EOSインスタンスの起動、再起動、終了
vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境が起動します。
インスタンスの起動
vagrant up再起動
vagrantfileの書き換えた内容を設定を反映する際によく使います
vagrant reloadインスタンスの終了
vagrant haltインスタンスの終了はVirtualBoxのGUIからもできます。
注意事項
①VirtualBoxのGUIからインスタンスを起動せず、 かならず「vagrant up」「vagrant reload」で起動すること。
Vagrantの仕様上、「vagrant up」(起動)もしくは「vagrant reload」(再起動)で仮想環境を起動したときのみ、
Vagrantfileの設定が反映されます。②仮想環境の設定は、かならずVagrantfileで行うこと。
Vagrantで仮想環境を起動した際、すべてVagrantfileの設定で上書きされます。
なので、Vagrantを使用する際、VirtualBoxのGUIから設定しないほうが無難です。インスタンスへの接続
vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境にssh接続できます。
※初回起動は時間がかかるので、すべての処理が終わってから接続することvagrant sshちなみに、筆者は「TeraTerm」を利用してssh接続しています。
ホストは「192.168.33.10」(「config.vm.network "private_network"」で設定したIPアドレス)
VagrantでインストールしたOSのユーザーとパスワードは、デフォルトでは「vagrant」です。
秘密鍵は「C:\Vagrant\instance1\.vagrant\machines\default\virtualbox\private_key」にあります。
他は初期設定のままで使えます。動作確認
ssh接続後、vagrant@vagrantフォルダに接続されますので、以下のコマンドを入力して共有フォルダが認識されているかを確認します。
cd C\:\\Vagrant\\instance1\\workspace/workspace/ touch test.txt「cd C」と入力した時点でTabキーを押せば、予測変換でフォルダ名が出てきます。
touchで新規作成したtest.txtを、Windows(ゲストOS)から確認できれば環境構築は終了です。以上
- 投稿日:2019-08-29T17:37:08+09:00
windows10でLinux仮想環境構築
Windows環境にて、自然言語処理および機械学習のため、
Linux開発環境が必要となり、それが一通り形となったので忘備録としてまとめます。この記事の対象者
- Windowsユーザー
- Linuxの開発環境が必要
- GCPやAWSでLinuxを使用する前に、同一環境をLocalで仮想化したい。
環境
- ホストOS:Windows10 Pro 32bit , 64bit
- ゲストOS:Ubuntu-18.04
- VirtualBox:5.2.32
- Vagrant:2.2.5
VirtualBoxをインストール
https://www.virtualbox.org/wiki/Download_Old_Builds_5_2
「Windows hosts」からダウンロード
VirtualBox 6.0.10がリリースされていますが、本記事では安定稼働している5.2ビルドを使用します。
Vagrantをインストール
https://www.vagrantup.com/downloads.html
「Windows」>「32-bit | 64bit」からインストーラーをダウンロード
現行の最新版「2.2.5」を使用しています。(2019年8月29日時点)
Vagrantについて
こちらの記事が非常に参考になります。
https://qiita.com/ozawan/items/160728f7c6b10c73b97eVagrantの事前設定
好きな場所にフォルダを作成し、Vagrantfile(起動用ファイル)を作成します。
今回はCドライブ直下に、Vagrant専用のフォルダを作成します。# Cドライブ直下にフォルダ作成 cd C:// mkdir Vagrant cd Vagrant # インスタンス起動用フォルダを作成 mkdir instance1 cd instance1 # 共有フォルダ作成 mkdir workspace # Vagrantfile作成 vagrant initVagrantのboxのGuest Additionsの自動アップデートをしてくれるライブラリをインストールします。
cd instance1 vagrant plugin install vagrant-vbguestこちらの記事を参照
https://qiita.com/isaoshimizu/items/e217008b8f6e79eccc85Proxy環境で作業する際、必要となるライブラリをインストールします。(Proxy環境のみ)
cd instance1 vagrant plugin install vagrant-proxyconfこちらの記事を参照
https://qiita.com/kota344/items/304979feaf965afffb1a仮想環境の作成
initコマンドにより、Vagrantfileが作成されたので
以下の内容で上書きします。# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # プロキシ設定(プロキシ環境のみ) if Vagrant.has_plugin?("vagrant-proxyconf") puts '- Proxy Setting ----------------------------------' config.proxy.http = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.https = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.no_proxy = "localhost,127.0.0.1" puts '--------------------------------------------------' end config.vm.box = "bento/ubuntu-18.04" config.vm.network "forwarded_port", guest: 8888, host: 8888 config.vm.provider :virtualbox do |vb| vb.customize [ "modifyvm", :id, "--memory", "4096", "--vram", "256", "--clipboard", "bidirectional", "--accelerate3d", "on", "--hwvirtex", "on", "--nestedpaging", "on", "--largepages", "on", "--ioapic", "on", "--pae", "on", "--paravirtprovider", "kvm", ] end config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace" # 初期構築スクリプト config.vm.provision :shell, :inline => <<-EOS # Ubuntuの最新パッケージ情報を取得 sudo apt update -y # apt-getをアップデート sudo apt-get upgrade -y # Ubuntuの日本語環境をインストール sudo apt-get install ubuntu-defaults-ja -y # タイムゾーンを日本時間に変更 sudo timedatectl set-timezone Asia/Tokyo # デフォルトのエディタを nano から vim に変更 sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic') EOS endプロキシの設定
{user}{password}{proxy_ip_or_domain}{proxy_port}などは適宜環境に応じて書き換えてください。
もしプロキシ環境でない場合は、以下の部分は不要ですので削除します。# プロキシ設定(プロキシ環境のみ) if Vagrant.has_plugin?("vagrant-proxyconf") puts '- Proxy Setting ----------------------------------' config.proxy.http = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.https = "http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}/" config.proxy.no_proxy = "localhost,127.0.0.1" puts '--------------------------------------------------' endインストールするOSの設定
仮想環境にインストールしたいOSのVagrant Boxを設定します。
インストールできるOSは、こちらのサイトから探せます。
https://app.vagrantup.com/config.vm.box = "bento/ubuntu-18.04"今回は、ubuntu18.04を使用していきます。
仮にawslinuxをインストールしたい場合は、「config.vm.box = 」以降を以下のURL先の通りに書き換えればOKです。
https://app.vagrantup.com/mvbcoding/boxes/awslinuxフォワードポートの設定
以下の設定をしておくと、仮想環境(ゲストOS)の8888ポートにてJupyter notebookなどでサーバーを立てて接続待ちしている際、ホスト側からブラウザなどで「http://localhost:8888 」と入力することで、仮想環境にアクセスできます。
config.vm.network "forwarded_port", guest: 8888, host: 8888ゲストOSからnode.jsなどでサーバーを立てて、ホスト側からアクセスしたいときなどもこの設定が使えるようです。
Vagrantのネットワークの詳しいイメージとしては、こちらの記事がわかりやすかったです。
https://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11仮想環境に割り当てるリソースについて
割り当てるメモリーなどは、以下のように設定できます。
config.vm.provider :virtualbox do |vb| vb.customize [ "modifyvm", :id, "--memory", "4096", "--vram", "256", "--clipboard", "bidirectional", "--accelerate3d", "on", "--hwvirtex", "on", "--nestedpaging", "on", "--largepages", "on", "--ioapic", "on", "--pae", "on", "--paravirtprovider", "kvm", ] endメモリーは環境に応じて使える容量も変わってくるので、環境に応じて割り当てを調整してください。
本記事では4GB割り当てています。"--memory", "4096",仮想環境のIP設定
仮想環境のIPアドレスです。ホスト側から仮想環境に、ssh接続をする際に使用します。
config.vm.network "private_network", ip: "192.168.33.10"共有フォルダの設定
共有フォルダに設定します。以下の設定をすることで仮想環境からworkspaceフォルダを参照することができます
config.vm.synced_folder "C:\\Vagrant\\instance1", "C:\\Vagrant\\instance1\\workspace"参考:https://qiita.com/tbpgr/items/67125ea883409ae5fd51
初期構築スクリプト
初回のインストールのみ起動するスクリプトです。Ubuntu日本語化やタイムゾーンの設定、apt-getなどのアップデートをバッチ処理で実行できます。
Ubuntu以外のOSで実行する場合は、必要に応じて書き換えてください。# 初期構築スクリプト config.vm.provision :shell, :inline => <<-EOS # Ubuntuの最新パッケージ情報を取得 sudo apt update -y # apt-getをアップデート sudo apt-get upgrade -y # Ubuntuの日本語環境をインストール sudo apt-get install ubuntu-defaults-ja -y # タイムゾーンを日本時間に変更 sudo timedatectl set-timezone Asia/Tokyo # デフォルトのエディタを nano から vim に変更 sudo update-alternatives --set editor $(update-alternatives --list editor | grep 'vim.basic') EOSインスタンスの起動、再起動、終了
vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境が起動します。
インスタンスの起動
vagrant up再起動
vagrantfileの書き換えた内容を設定を反映する際によく使います
vagrant reloadインスタンスの終了
vagrant haltインスタンスの終了はVirtualBoxのGUIからもできます。
注意事項
①VirtualBoxのGUIからインスタンスを起動せず、 かならず「vagrant up」「vagrant reload」で起動すること。
Vagrantの仕様上、「vagrant up」(起動)もしくは「vagrant reload」(再起動)で仮想環境を起動したときのみ、
Vagrantfileの設定が反映されます。②仮想環境の設定は、かならずVagrantfileで行うこと。
Vagrantで仮想環境を起動した際、すべてVagrantfileの設定で上書きされます。
なので、Vagrantを使用する際、VirtualBoxのGUIから設定しないほうが無難です。インスタンスへの接続
vagrantflieがあるフォルダで、以下のコマンドを入力すると仮想環境にssh接続できます。
※初回起動は時間がかかるので、すべての処理が終わってから接続することvagrant sshちなみに、筆者は「TeraTerm」を利用してssh接続しています。
ホストは「192.168.33.10」。(「config.vm.network "private_network"」で設定したIPアドレス)
VagrantでインストールしたOSのユーザーとパスワードは、デフォルトでは「vagrant」です。
秘密鍵は「C:\Vagrant\instance1.vagrant\machines\default\virtualbox\private_key」にあります。
他は初期設定のままで使えます。動作確認
ssh接続後、vagrant@vagrantフォルダに接続されますので、以下のコマンドを入力して共有フォルダが認識されているかを確認します。
cd C\:\\Vagrant\\instance1\\workspace/workspace/ touch test.txt「cd C」と入力した時点でTabキーを押せば、予測変換でフォルダ名が出てきます。
touchで新規作成したtest.txtを、Windows(ゲストOS)から確認できれば環境構築は終了です。おまけ
pipをインストール
# pipをインストール sudo apt-get install python3-pippipenvをインストール
sudo pip3 install pipenvpipenv プロジェクトを作成
#プロジェクト作成 mkdir py_project cd py_project # パッケージのインストール # lockファイルは頻繁にタイムアウトの原因になるので断腸の思いでskip pipenv install pandas numpy matplotlib --skip-lock # 仮想環境を開く pipenv shellpipenv仮想環境を削除
cd py_project pipenv --rmpipenvのコマンド 参考
https://qiita.com/RW_876/items/ce42026884f1383e21da以上
- 投稿日:2019-08-29T13:38:56+09:00
PATHを通すの意味を理解する
-
環境構築などでよく出てくる「PATHを通す」。
なんとなくコピペでやっていたがいつのまにかごちゃごちゃに。
しばらく環境構築でハマってるので、「まあ動いたからいいや」ではなくある程度理解できるまで学んでみる。*こちらの記事が大変参考になります。pathのことを理解してない人は本記事を読むよりこちらを読んだ方がためになります
押さえどころ
「PATHを通す」の意味に関しては3つ重要なところを押さえておけば理解できる。
- 環境変数
- 設定ファイル
- PATH
その1 -環境変数-
環境変数とはコンピューターが持っている変数。
名前から拒絶感があるがこれは避けては通れない。
じゃあ具体的に環境変数とは何か例えばこれは変数
A = "AppleのA" B = "BananaのB" C = "ChocolateのC"変数Aをコンピューターで使いたい!っていう時にコンピューターに環境変数として登録すれば変数Aを参照できる。
このコンピューターに登録した変数が環境変数。その2 -設定ファイル-
次は環境変数をコンピューターに登録する方法。
まずコンソールで登録する場合はこんな感じ$ export A="AppleのA"
export A="AppleのA
でEnterを押しても何も出てこない。
環境変数に登録されているか見てみる。
確認方法は$ printenv A=りんごのA ... ... ...または
$ echo $A AppleのAちゃんと登録されている。
printenv
は一覧で表示してくれる。
export
で登録し
printenv
で一覧表示し
echo
で変数を確認する。別に難しいことではない。
ただ、コンソールを閉じると登録した変数が消えてしまう。
そこで永続的に保存するために設定ファイルに書く。
設定ファイルは
.bash_profile
.bashrc
のどちらかに書く。*この二つがわからなくて両方に書いていた、、
.bash_profile
ログイン時に1回、実行される
具体的な用途は
- 環境変数を設定する(export する変数)
.bashrc
シェル起動時に1回、実行される。
具体的な用途は
- 環境変数でない変数を設定する (export しない変数)
- エイリアスを定義する
- シェル関数を定義する
- コマンドライン補完の設定をするここら辺はまた別記事に詳しく書いていく。
今回は環境変数を設定してPathを通すので.bash_profile
コンソールで.bash_profileを開く
$vi .bash_profile
*vimの使い方は別記事で書くかわからないのでこちらの記事を参考に.bash_profileを開いたらコードを書く。
export A="AppleのA"コンソールで確認
echo $Aしかし何も表示されない。
.bash_profileを書き込んだあとは
source
コマンドで実行していく。source コマンドは実は、環境をリロードするためのものではない。
ファイルに書かれた内容を 忠実にコマンドとして実行していくものなのだ。$source .bash_profileもう一度確認
$echo $A りんごのAこれで環境変数を永続的に設定できるようになった。
その3 -PATH-
ここまできたら「PATHを通す」の意味をすぐ理解できる。
重要なのがPATHも環境変数の一部ということ
printenv
で確認するとその中にPATHも入っていることがわかる。PATHには
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinこんな感じで値が入っていて:で区切られている。
見やすくするとこんな感じ。/usr/local/bin /usr/bin /bin /usr/sbin /sbin移動してみる。
$ cd usr/binするとよく使っている
cd
コマンドだったりgit
コマンドだったりが置かれている。
git
コマンドを使うたびにわざわざgit
を操作するプログラムが置かれているusr/bin
まで行ってコマンドを実行するのはとんでもなく面倒臭い。そこでPATHを通して経路を作り自分がどのディレクトリにいようともプログラム名だけで実行できるようにすることがPathを通すということ。
PATHが通っているからホーム画面にいても
cd
コマンドが使えるしわざわざプログラムが置いてある場所に行かなくてもよくなる。実際に環境変数を設定してPATHを通してみる。
Pythonのバージョン管理、複数のバージョンを使い分けるコマンドラインツール、pyenvにPATHを通す。
-> デフォルトシェルでPython3系を使いたい! → pyenvを使ってみるまずコンソールで
pyenv
にPATHが通っている確認$ pyenv version pyenv: command not found当然PATHが通っていないからそんなコマンドはないよと言われる。
.bash_profile
を開き登録するexport PYENV_ROOT="\$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:\$PATH"\$マークは環境変数を参照している。
\$HOMEはホームディレクトリを指す。
この場合は環境変数PYENV_ROOT
を設定し環境変数PATHの前に追加して上書きしている。
source
を実行$ source .bash_profile確認
$ pyenv version 3.7.0 (set by /Users/kazuppp/.pyenv/version)PATHが通った!
まとめ
- 環境変数はコンピューターが使える変数。
- 環境変数を登録しても設定ファイルに記述しないとコンソールを閉じた時に使えないので設定ファイルに書き永続化させる。
- 設定した環境変数をPATHに追加し上書きすることでPATHが通る。
- PATHは経路を作りプログラム名だけでプログラムを実行できる。
*環境変数を登録すると書いているが環境変数を設定するの方が正しいかもしれない。
参考記事
- 投稿日:2019-08-29T12:49:39+09:00
Linuxユーザーが最もシンプルにラズパイ起動SDカードを作る方法
はじめに
ラズパイ起動方法は公式サイトにも詳しく載っていますし、いろいろな本やWebサイトでたくさん紹介されています。
ところが、最も簡単と言われているNOOBSは実はSDカードとの相性問題があってうまく起動しない場合があったりします。
それならばとSDカードにraspbianの起動イメージを書き込もうと思っても、多くのツールはWindows向けだったり、Linuxでは導入が面倒だったりします。
結局、Linuxユーザーはコマンドラインでやるのが一番確実で早いと感じたので手順をメモしておきます。環境
- ホストPC:Ubuntu 18.04.2
- Raspberry Pi 2 Model B
- Raspbian Buster (Release date:2019-07-10)
Raspbianを入手
公式サイトからdesktop and recommended softwareをダウンロード。
その気になればwgetとかのコマンドでできますが、最新バージョンを確認しつつダウンロードするにはブラウザでやったほうが早いので、意地を張らずにブラウザでダウンロードします。SHAが一致することを確認
以前、ダウンロード時にデータが狂っていたのが原因でOSが起動しなかったことがありました。
そのときは原因特定に1日かかりました。。。SHA確認大事です。エラーは起きるものです。$ sha256sum 2019-07-10-raspbian-buster-full.zip 2bd0613ec8739b6fa4274ea186ec859046f79e6aee4b8c6af0acb6d88f3f533a 2019-07-10-raspbian-buster-full.zipSDカードのデバイス名を確認
ダウンロードしたイメージを書き込むために、ホストPCでSDカードがどのように認識されているかを確認します。
SDカード挿入前と挿入後にlsbsk
を実行します。挿入後に増えた項目がSDカードのデバイスを指しています。
下記の例でパーティションが別れているのは、このSDカードを以前にもラズパイに使っていたからです。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ---略--- mmcblk0 179:0 0 14.5G 0 disk ├─mmcblk0p1 179:1 0 43.2M 0 part /media/***/boot └─mmcblk0p2 179:2 0 14.4G 0 part /media/***/rootfsパーティションがマウントされている場合は、アンマウントします。
$ umount /media/***/boot $ umount /media/***/rootfsこんな感じになります。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ---略--- mmcblk0 179:0 0 14.5G 0 disk ├─mmcblk0p1 179:1 0 43.2M 0 part └─mmcblk0p2 179:2 0 14.4G 0 partSDカードに書き込む
zipファイル展開とSDカードへの書き込みをまとめて行います。ofオプションに、上で調べたSDカードのデバイス名を指定します。
結構時間かかるので気長に待ちます。$ unzip -p 2019-07-10-raspbian-buster-full.zip | sudo dd of=/dev/mmcblk0 conv=fsync 12566528+0 レコード入力 12566528+0 レコード出力 6434062336 bytes (6.4 GB, 6.0 GiB) copied, 1369.22 s, 4.7 MB/sまとめ
これでラズパイOSイメージをSDカードに書き込むことができました。あとはSDカードをラズパイに挿して電源を入れ、画面に従ってラズビアンの初期設定をすればOKです。
ラズパイに限らず、初心者でも簡単に扱えるようにいろいろな便利ツールが用意されています。もちろんそれのおかげでとても楽ができることも多いですが、どこかで躓いてしまうと何が原因なのかさっぱりわからなくなってしまいますね。そんな時はエンジニアたるもの初心に戻ってコマンドラインで地道にやるのが、結局は一番の近道になることもありますね。
- 投稿日:2019-08-29T12:49:39+09:00
Linuxユーザーがラズパイ起動SDカードを作る最もシンプルな方法
はじめに
ラズパイ起動方法は公式サイトにも詳しく載っていますし、いろいろな本やWebサイトでたくさん紹介されています。
ところが、最も簡単と言われているNOOBSは実はSDカードとの相性問題があってうまく起動しない場合があったりします。
それならばとSDカードにraspbianの起動イメージを書き込もうと思っても、多くのツールはWindows向けだったり、Linuxでは導入が面倒だったりします。
結局、Linuxユーザーはコマンドラインでやるのが一番確実で早いと感じたので手順をメモしておきます。環境
- ホストPC:Ubuntu 18.04.2
- Raspberry Pi 2 Model B
- Raspbian Buster (Release date:2019-07-10)
Raspbianを入手
公式サイトからdesktop and recommended softwareをダウンロード。
その気になればwgetとかのコマンドでできますが、最新バージョンを確認しつつダウンロードするにはブラウザでやったほうが早いので、意地を張らずにブラウザでダウンロードします。SHAが一致することを確認
以前、ダウンロード時にデータが狂っていたのが原因でOSが起動しなかったことがありました。
そのときは原因特定に1日かかりました。。。SHA確認大事です。エラーは起きるものです。$ sha256sum 2019-07-10-raspbian-buster-full.zip 2bd0613ec8739b6fa4274ea186ec859046f79e6aee4b8c6af0acb6d88f3f533a 2019-07-10-raspbian-buster-full.zipSDカードのデバイス名を確認
ダウンロードしたイメージを書き込むために、ホストPCでSDカードがどのように認識されているかを確認します。
SDカード挿入前と挿入後にlsbsk
を実行します。挿入後に増えた項目がSDカードのデバイスを指しています。
下記の例でパーティションが別れているのは、このSDカードを以前にもラズパイに使っていたからです。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ---略--- mmcblk0 179:0 0 14.5G 0 disk ├─mmcblk0p1 179:1 0 43.2M 0 part /media/***/boot └─mmcblk0p2 179:2 0 14.4G 0 part /media/***/rootfsパーティションがマウントされている場合は、アンマウントします。
$ umount /media/***/boot $ umount /media/***/rootfsこんな感じになります。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT ---略--- mmcblk0 179:0 0 14.5G 0 disk ├─mmcblk0p1 179:1 0 43.2M 0 part └─mmcblk0p2 179:2 0 14.4G 0 partSDカードに書き込む
zipファイル展開とSDカードへの書き込みをまとめて行います。ofオプションに、上で調べたSDカードのデバイス名を指定します。
結構時間かかるので気長に待ちます。$ unzip -p 2019-07-10-raspbian-buster-full.zip | sudo dd of=/dev/mmcblk0 conv=fsync 12566528+0 レコード入力 12566528+0 レコード出力 6434062336 bytes (6.4 GB, 6.0 GiB) copied, 1369.22 s, 4.7 MB/sまとめ
これでラズパイOSイメージをSDカードに書き込むことができました。あとはSDカードをラズパイに挿して電源を入れ、画面に従ってラズビアンの初期設定をすればOKです。
ラズパイに限らず、初心者でも簡単に扱えるようにいろいろな便利ツールが用意されています。もちろんそれのおかげでとても楽ができることも多いですが、どこかで躓いてしまうと何が原因なのかさっぱりわからなくなってしまいますね。そんな時はエンジニアたるもの初心に戻ってコマンドラインで地道にやるのが、結局は一番の近道になることもありますね。
- 投稿日:2019-08-29T09:56:45+09:00
Ubunru Server 2台間でファイル同期(lsyncd + rsync + sshd)
背景
2台のLinuxサーバーでファイル同期させて冗長化やバックアップに利用するメモです。
動作環境
- OS:Ubunru Server 16.04LTS
- OS:Ubunru Server 18.04LTS
- sshd
- rsync
- lsyncd
同期設定のポリシー
2台のサーバー間を双方向で同期する方法と、バックアップの様に片側同期する方法があります。
今回は後者の片側同期に設定します。
双方向同期の場合はファイル削除時の動作を設計時に考慮しないと思わぬデータ消失に繋がり注意が必要です。rsyncサービスデーモン(rsyncd)
ネットで検索するとrsyncdを使用するページが出てきますが、その場合はサービスポートTCP 873番を経由します。
しかし昔ながらのIPアドレス範囲をallow/denyで制限したり、暗号化無しの平文パスワード利用と今時のセキュリティ的にはよくありません。
閉域網のセキュリティが確保された内部のサブネットで、転送速度のパフォーマンス重視の場合などで検討しましょう。今回は使用しません。rsyncコマンドをsshd経由で暗号化して公開鍵認証した安全な経路が利用できますので、外部のインターネット経由したサーバー間でも安全な同期が可能です。
sshサービスデーモン(sshd)経由を利用するので一般的なsshd設定が利用可能です。sshユーザー設定
各サーバーに適当なアカウント「rsync」を作成します。
各サーバー共通$ sudo adduser rsyncsudoグループに追加します。
各サーバー共通$ sudo gpasswd -a rsync sudo「rsync」ユーザーに切り替えてパスフレーズ無しのssh鍵ペアを作成します。
コメントの-Cオプションにサーバーホスト名も付けておくと区別し易いね。サーバー1(node1)側$ su rsync $ ssh-keygen -t ed25519 -C "rsync@node1" -N ""サーバー2(node2)側$ su rsync $ ssh-keygen -t ed25519 -C "rsync@node2" -N ""ssh鍵を互いのサーバーへ登録します。
方法は色々ありますがssh-copy-idコマンドが簡単。サーバー1(node1)側$ ssh-copy-id -i .ssh/id_ed25519 rsync@node2サーバー2(node2)側$ ssh-copy-id -i .ssh/id_ed25519 rsync@node1実際にパスフレーズ無しの公開鍵認証で接続出来るか、互いのサーバーで確認します。
サーバー1(node1)側$ ssh -i .ssh/id_ed25519 rsync@node2サーバー2(node2)側$ ssh -i .ssh/id_ed25519 rsync@node1rsyncコマンドをsudo経由でパスワード入力無しで実行する設定(サーバー2 node2側)
サーバー2(node2)側$ sudo visudo/etc/sudoersrsync ALL=(ALL) NOPASSWD: /usr/bin/rsyncパスフレーズ無しのssh鍵であってもsudoコマンド実行時にはアカウントのパスワード入力を要求されますので、特定コマンド(この場合はrsync)だけパスワード要求を無効化します。
これでrsyncコマンドをsudo経由で実行出来るので、ファイルの書き換え時にパーミッション制限でのエラーを回避出来ます。lsyncサービスデーモン(lsyncd)設定
同期元サーバー1(node1)側へインストールして設定する。ちなみに双方向で同期する場合は両方へインストールします。
サーバー1(node1)側$ sudo apt-get install lsyncd設定ファイルを作成します。
サンプルファイルが、「/usr/share/doc/lsyncd/examples/lsyncd.conf.lua」とかにありますので参考に。/etc/lsyncd/lsyncd.conf.luasettings = { logfile = "/var/log/lsyncd.log", statusFile = "/tmp/lsyncd.stat", insist = 1, statusInterval = 10 } sync_base = { default.rsync, delete = running, init = false, rsync = { archive = true, rsync_path = "sudo /usr/bin/rsync", rsh = "/usr/bin/ssh -i /home/rsync/.ssh/id_ed25519 -o StrictHostKeyChecking=no" } } sync{ sync_base, source="/home/rsync/test1/", target="rsync@node2:/home/rsync/test1/"} sync{ sync_base, source="/etc/test2/", target="rsync@node2:/etc/test2/"}設定オプションは以下の様になります。
- statusInterval:インターバル・デフォルト10秒
- delete = running:同期時のみ削除可
- init = false:起動時は同期を反映しない
- archive = true:rsyncの-aオプションと同等
- rsync_path = "sudo /usr/bin/rsync":rsyncコマンドをsudo経由で実行
最後のsyncの2行で監視するディレクトリと同期先を2箇所指定しています。複数ある場合は同じ様に追加設定します。
lsyncサービスデーモン(lsyncd)の再起動
サーバー1(node1)側$ sudo systemctl restart lsyncd動作確認
適当な空ファイルを作成して、サーバー2(node2)側に反映するか確認してみます。
サーバー1(node1)側$ touch /home/rsync/test1/test1.txtサーバー2(node2)側$ ls -l /home/rsync/test1/sudo経由なのでシステムファイルも同期出来ます。
サーバー1(node1)側$ sudo touch /etc/test2/test2.txtサーバー2(node2)側$ ls -l /etc/test2/動作検証にログファイルが確認出来ます。
サーバー1(node1)側$ sudo tail /var/log/lsyncd.log
- 投稿日:2019-08-29T09:56:45+09:00
Ubuntu Server 2台間でファイル同期(lsyncd + rsync + sshd)
背景
2台のLinuxサーバーでファイル同期させて冗長化やバックアップに利用するメモです。
動作環境
- OS:Ubuntu Server 16.04LTS
- OS:Ubuntu Server 18.04LTS
- sshd
- rsync
- lsyncd
同期設定のポリシー
2台のサーバー間を双方向で同期する方法と、バックアップの様に片側同期する方法があります。
今回は後者の片側同期に設定します。
双方向同期の場合はファイル削除時の動作を設計時に考慮しないと思わぬデータ消失に繋がり注意が必要です。rsyncサービスデーモン(rsyncd)
ネットで検索するとrsyncdを使用するページが出てきますが、その場合はサービスポートTCP 873番を経由します。
しかし昔ながらのIPアドレス範囲をallow/denyで制限したり、暗号化無しの平文パスワード利用と今時のセキュリティ的にはよくありません。
閉域網のセキュリティが確保された内部のサブネットで、転送速度のパフォーマンス重視の場合などで検討しましょう。今回は使用しません。rsyncコマンドをsshd経由で暗号化して公開鍵認証した安全な経路が利用できますので、外部のインターネット経由したサーバー間でも安全な同期が可能です。
sshサービスデーモン(sshd)経由を利用するので一般的なsshd設定が利用可能です。sshユーザー設定
各サーバーに適当なアカウント「rsync」を作成します。
ユーザーアカウントでシステムファイル操作のパーミッション権限はsudoで対応します。各サーバー共通$ sudo adduser rsyncsudoグループに追加します。
各サーバー共通$ sudo gpasswd -a rsync sudo「rsync」ユーザーに切り替えてパスフレーズ無しのssh鍵ペアを作成します。
コメントの-Cオプションにサーバーホスト名も付けておくと区別し易いね。サーバー1(node1)側$ su rsync $ ssh-keygen -t ed25519 -C "rsync@node1" -N ""サーバー2(node2)側$ su rsync $ ssh-keygen -t ed25519 -C "rsync@node2" -N ""ssh鍵を互いのサーバーへ登録します。
方法は色々ありますがssh-copy-idコマンドが簡単。サーバー1(node1)側$ ssh-copy-id -i .ssh/id_ed25519 rsync@node2サーバー2(node2)側$ ssh-copy-id -i .ssh/id_ed25519 rsync@node1実際にパスフレーズ無しの公開鍵認証で接続出来るか、互いのサーバーで確認します。
サーバー1(node1)側$ ssh -i .ssh/id_ed25519 rsync@node2サーバー2(node2)側$ ssh -i .ssh/id_ed25519 rsync@node1rsyncコマンドをsudo経由でパスワード入力無しで実行する設定(サーバー2 node2側)
サーバー2(node2)側$ sudo visudo/etc/sudoersrsync ALL=(ALL) NOPASSWD: /usr/bin/rsyncパスフレーズ無しのssh鍵であってもsudoコマンド実行時にはアカウントのパスワード入力を要求されますので、特定コマンド(この場合はrsync)だけパスワード要求を無効化します。
これでrsyncコマンドをsudo経由で実行出来るので、ファイルの書き換え時にパーミッション制限でのエラーを回避出来ます。lsyncサービスデーモン(lsyncd)設定
同期元サーバー1(node1)側へインストールして設定する。ちなみに双方向で同期する場合は両方へインストールします。
サーバー1(node1)側$ sudo apt-get install lsyncd設定ファイルを作成します。
サンプルファイルが、「/usr/share/doc/lsyncd/examples/lsyncd.conf.lua」とかにありますので参考に。/etc/lsyncd/lsyncd.conf.luasettings = { logfile = "/var/log/lsyncd.log", statusFile = "/tmp/lsyncd.stat", insist = 1, statusInterval = 10 } sync_base = { default.rsync, delete = running, init = false, rsync = { archive = true, rsync_path = "sudo /usr/bin/rsync", rsh = "/usr/bin/ssh -i /home/rsync/.ssh/id_ed25519 -o StrictHostKeyChecking=no" } } sync{ sync_base, source="/home/rsync/test1/", target="rsync@node2:/home/rsync/test1/"} sync{ sync_base, source="/etc/test2/", target="rsync@node2:/etc/test2/"}設定オプションは以下の様になります。
- statusInterval:インターバル・デフォルト10秒
- delete = running:同期時のみ削除可
- init = false:起動時は同期を反映しない
- archive = true:rsyncの-aオプションと同等
- rsync_path = "sudo /usr/bin/rsync":rsyncコマンドをsudo経由で実行
最後のsyncの2行で監視するディレクトリと同期先を2箇所指定しています。複数ある場合は同じ様に追加設定します。
lsyncサービスデーモン(lsyncd)の再起動
サーバー1(node1)側$ sudo systemctl restart lsyncd動作確認
適当な空ファイルを作成して、サーバー2(node2)側に反映するか確認してみます。
サーバー1(node1)側$ touch /home/rsync/test1/test1.txtサーバー2(node2)側$ ls -l /home/rsync/test1/sudo経由なのでシステムファイルも同期出来ます。
サーバー1(node1)側$ sudo touch /etc/test2/test2.txtサーバー2(node2)側$ ls -l /etc/test2/動作検証にログファイルが確認出来ます。
サーバー1(node1)側$ sudo tail /var/log/lsyncd.log