- 投稿日:2021-08-29T23:58:59+09:00
インストールを自動化する Ansible を Windows にインストールする
概要 Ansible は、Linux サーバーに各種ソフトウェアやファイルをインストールする作業を 自動化するソフトウェアです。 しかし、Ansible 自体を Windows にインストールするインストーラーは 提供されていません。また、Windows ユーザーが Ansible を試す方法は、 ネットを探してもほとんど見つかりません。 そこで、Ansible が入った仮想マシン(VM) を Windows にインストールする手順を Windows のリセット状態から1つ1つ丁寧に紹介したいと思います。 なお、途中で Vagrant 用プロジェクトをダウンロードする手順があります。 インストール手順をなるべく自動化するために使っています。 自動化できるようになると、ハードウェアやネットワークの知識がない人でも VM に入ったサービスを使うことや物理サーバーを増やすことができるようになり、 分業することができるようになります。 対象システム あらかじめ用意する必要があるのは、以下のとおりです。 Windows 10 21H1 64bit (多少古いバージョンでもよい) 以下の手順でインストールするソフトウェアは、以下のとおりです。 すべてのバージョンは、執筆時点の最新版です。 この記事が古くなったら、以下で説明する手順では失敗するかもしれませんがご了承ください。 ホストOS(Windows) Visual Studio Code 1.59.1 VirtualBox 6.1.26 Vagrant 2.2.18(コードで VirtualBox の VM を自動的に作るソフトウェア) Ansible Local プロビジョナー(Ansible をインストールおよび実行をする Vagrant のプラグイン) Vagrant や Ansible の設定ファイル Git 2.33.0.2 (bash および SSH 関連のコマンドを使うため) コントロール ノード (VirtualBox の VM。名前は control) CentOS7 Ansible Ansible の設定ファイル(ホストOSと共有) マネージド ノード (VirtualBox の VM。名前は node1) CentOS7 Ansible でインストールするソフトウェアやファイル Windows で Visual Studio Code を開きつつ、Ansible を Linux で動かすために、 ホストOS と コントロール ノード を分けています。 ただし、この構成でなければ Ansible が使えないというわけではありません。 ホストOS は mac でもできると思いますが試していません。 物理サーバーにインストールする方法については本記事の対象外です。 最後の参考サイトを参照してください。 Ansible とは Ansible をよく知らない方のために、Ansible とは何かを説明します。 インストールするだけなら読み飛ばしていただいても構いません。 Ansible は、Linux サーバーに各種ソフトウェアやファイルをインストールする作業を 自動化することを目的にしたソフトウェアです。 インストールする処理を Ansible の Playbook ファイルのタスクに書きます。 Playbook ファイルは YAML 形式で書きますが、 他のスクリプトと同様に上から下へタスクを実行します。 タスクの実行は、コントロール ノード から SSH でログインした マネージド ノード の中で行われます。 SSH でログインすることさえできれば Ansible で様々なタスクを実行できるのですが、SSH でログインできるように する設定は Ansible とは別に行う必要があります。 タスクには マネージド ノード の中で実行するコマンドに相当する モジュールを指定します。 RPM パッケージをインストールするモジュールや ファイルをリモートコピーするモジュールなど 非常に多くのモジュールが用意されています。 シェルのコマンドを直接実行するモジュールもあるため、 とりあえずシェルのコマンドで Playbook を作り、 後で適切なモジュールに置き換えると効率的に開発できるでしょう。 インストール済みのソフトウェアに関するタスクはスキップします。 このため、インストール済みの状態から再びインストールするとエラーになる インストーラーを使っても Ansible はエラーになりません。 インストールしていない状態でもインストール済みの状態でも、 Ansible を実行した後はインストール済みの状態で正常終了します。 このように前提条件が異なっていても結果が同じになる性質を冪等性と呼び、 Ansible のタスクに指定できるモジュールのほとんどは冪等性を持っています。 ただし、シェルのコマンドを直接実行するモジュールを使うと、 そのタスクは冪等性を持っていない可能性があります。 後で直接コマンドを実行しないモジュールに置き換えるか適切な条件を設定すれば、 冪等性を持った Playbook にすることができます。 Vagrant とは Vagrant をよく知らない方のために、Vagrant とは何かを説明します。 インストールするだけなら読み飛ばしていただいても構いません。 Vagrant は VirtualBox や VMWare player などの仮想マシン(VM) を扱うソフトウェアに対して、コードで操作することで、 自動的に VM を作るソフトウェアです。 コードで操作できるようになると VM の構成情報 (VM の数、メモリーサイズ、IPアドレスなど)はコードの中に入ります。 コードをコピーすることで VM の構成の全体または一部を再利用することや、 Git などでバージョン管理することができるようになります。 VM は物理的なハードウェアの中に作ることができる仮想的なハードウェアです。 本番で別の物理サーバーで動かすシステムを開発をするときに使います。 システムの構成要素に、ネットワークから来たリクエストに応答するサーバーがあるときに 必要になります。 VM を Docker コンテナーに置き換えて開発や運用をすることもできますが、 Vagrant は VM だけを扱います。 Docker を使う場合、Vagrant のコードや Ansible の全部または一部コードは、 Dockerfile や docker-compose.yml に置き換わります。 Vagrant には Ansible Local プロビジョナーのプラグインがあります。 Ansible の Playbook を実行する Vagrant のコードを書くと、 Ansible Local プロビジョナーが自動的に VM に Ansible をインストールして Playbook を実行します。 本書の方法ではダミーの Playbook を実行することで、 Ansible を自動的にインストールしています。 インストール手順 手順は多いですが、とくに前提とする知識や考慮すべきことはないので、 そのまま進めていくことができます。 言葉による説明が読みにくい場合は、 本書の最後に書いてある構造化文書による手順書を参照しながら進めていくこともできます。 VirtualBox をインストールします https://www.virtualbox.org/ をブラウザーで開き、Download VirtualBox 6.1 ボタンを押し、 Windows hosts をクリックするとダウンロードが始まります。 ダウンロードしたファイルを開いてインストールします。 インストール オプションはデフォルトで構いません。 ドライバーをインストールするか聞かれたときはインストールすることを選びます。 後に書かれた手順の途中で VM が起動できない問題が発生したときは、次の点について具体的な方法をネットで検索してください。 お使いの PC(ホストOS)の BIOS に仮想化(Virtualization)の機能をオンまたはオフを 選ぶ項目がある場合、オンに設定する必要があります Hyper-V は無効にする必要があります Vagrant をインストールします https://www.vagrantup.com/downloads.html をブラウザーで開き、Windows タブの 64-bit をクリックするとダウンロードが始まります。 ダウンロードしたファイルを開いてインストールします。 インストール オプションはデフォルトで構いません。 インストールが完了したら PC を再起動します。 Git for Windows をインストールします https://git-scm.com/ をブラウザーで開き、Downloads for Windows ボタンを押すとダウンロードが始まります。 ダウンロードしたファイルを開いてインストールします。 インストールするときは、9回 Next を押すと表示される Configuring the line ending conversions を Checkout as-is, commit as-is に設定することをお勧めします。 他のインストール オプションはデフォルトで構いません。 Visual Studio Code をインストールします https://code.visualstudio.com/ をブラウザーで開き、ダウンロードして、実行します。 インストール オプションはすべてデフォルトで構いません。 インストールが完了したら、Visual Studio Code を起動して タスクバーにピン止めすることをオススメします。 Visual Studio Code の端末が使うシェルを bash に変更します Visual Studio Code のメニュー Terminal >> New Terminal で端末を開き、+の右の↓ をクリックして表示されるメニューの Select Default Profile を選び、Git bash を選びます。 PowerShell を使っている既存の端末は、ゴミ箱 ボタンを押して閉じます。 後で使う code コマンドを使えるようにするため、 Visual Studio Code を一度終了して、再起動します。 ホストOSがプロキシがあるLANにいるとき、プロキシの設定をします もし、社内などプロキシがあるLANにいるときは、プロキシの設定をします。 設定に必要な プロキシ サーバー の URL はネットワーク管理者などにお問い合わせください。 家庭内などプロキシがないときは、この設定は不要です。 Visual Studio Code のメニュー Terminal >> New Terminal で端末(bash)を開き、下記のコマンドを入力します。 echo ${http_proxy} もし、プロキシサーバーの URL が表示されたら下記の手順は不要です。 下記のコマンドの一部を、所属している LAN の プロキシ サーバー の URL に変更して実行します。 echo "export http_proxy=\"http://__ProxyDomain__:__ProxyPortNum__\"" >> ~/.bashrc echo "export https_proxy=\"http://__ProxyDomain__:__ProxyPortNum__\"" >> ~/.bashrc echo "export no_proxy=\"localhost,127.0.0.1,control,node1\"" >> ~/.bashrc 変更箇所: `http://__ProxyDomain__:__ProxyPortNum__` 変更後の例: `http://proxy.example.com:8080` または `http://10.100.100.100:8080` 上記コマンドを実行したら、bash を開きなおします。 下記の警告は無視できます。 WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile. vbguest プラグインをインストールします vbguest プラグインは Vagrant から Ansible Local プロビジョナーを インストールおよび実行をする Vagrant のプラグインです。 端末(bash)で下記のコマンドを入力します。 もし、端末が開いていない時は、 Visual Studio Code のメニュー Terminal >> New Terminal で開きます。 vagrant plugin install vagrant-vbguest プロジェクト フォルダーをダウンロードして開きます VM を作り、Ansible 自体をインストールする Vagrant プロジェクトをダウンロードします。 このプロジェクトには、Vagrant のコードと Ansible のシンプルな Playbook を含みます。 端末(bash)で下記のコマンドを入力します。 cd ~/Desktop git clone https://github.com/Takakiriy/multi_vm_ansible.git 端末(bash)で下記のコマンドを入力します。 code ~/Desktop/multi_vm_ansible もし、code コマンドが見つからない場合は、Visual Studio Code を再起動してください。 Visual Studio Code 内で上記のコマンドを入力したら、 コマンドを入力した Visual Studio Code を閉じます。 新しく開いた Visual Studio Code の Terminal >> New Terminal メニューを 選びます。 プロジェクトに含まれる主なファイル ファイル名 内容 playbook-0.yml Ansible をインストールするためのダミー Playbook playbook.yml Ansible が実行する内容。サンプルとして、マネージド ノード にファイルを作成するタスクが入っています run_playbook.sh Ansible の Playbook を実行します upload_SSH_keys.sh コントロール ノード から マネージド ノード に SSH 接続できるようにします Vagrantfile Vagrant が作成する VM の内容 仮想マシンを作って起動します 端末(bash)で下記のコマンドを入力します。 このコマンドは、Vagrantfile の内容に従って VM を作ります。 vagrant up 初回は約 10分かかります。 コントロール ノード に Ansible Local プロビジョナーをインストールするために、 何も処理しない playbook-0.yml ファイルを実行します。 Vagrant プロジェクトがあるフォルダーは、 VM の /vagrant/ フォルダーと共有します。 実行ログの例: Unmounting Virtualbox Guest Additions ISO from: /mnt ==> control: Checking for guest additions in VM... ==> control: Configuring and enabling network interfaces... ==> control: Mounting shared folders... control: /vagrant => C:/Users/user1/Desktop/multi_vm_ansible ==> control: Running provisioner: ansible_local... control: Installing Ansible... control: Running ansible-playbook... PLAY [control] ***************************************************************** TASK [Gathering Facts] ********************************************************* ok: [control] TASK [dummy] ******************************************************************* ok: [control] => { "msg": "Ansible ready" } PLAY RECAP ********************************************************************* control : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Visual Studio Code から SSH で VM にログインできるように設定します Visual Studio Code の拡張機能 ボタンを押して、Remote Development 拡張機能 をインストールします。 Remote Development のビューで REMOTE EXPLORER のプルダウンから SSH Targets を選びます。 端末(bash)で下記のコマンドを入力します。 vagrant ssh-config SSH の接続に必要な設定が表示されるのでコピーします。 コピー先は、下記のコマンドで開くファイルです。 既存の別のサーバーの設定があるときは消さないでください。 code ~/.ssh/config Remote Development のビューにカーソルを合わせて、 右上に表示される リロード ボタン を押します。 表示された control にマウスカーソルを合わせると フォルダーのボタンが表示されるのでそれをクリックします。 新しい Visual Studio Code のウィンドウが開きます。 そのウィンドウは、control に SSH でリモート接続した Visual Studio Code です。 初めて接続するときは、プラットフォームを聞かれるので Linux を選びます。 control の Visual Studio Code で、 File >> Open Folder ... メニューを選び、 /vagrant/ フォルダーを開きます。 再び新しい Visual Studio Code のウィンドウが開きます。 今まで開いていた control の Visual Studio Code は閉じます。 新しいウィンドウは、control ノードの /vagrant/ フォルダーを開いた Visual Studio Code です。 そのウィンドウで Terminal >> New Terminal メニューを選び、 シェルを開けることを確認します。 このシェルは、SSH で接続されたシェルです。 [vagrant@localhost vagrant]$ と表示されます。 開けたら Visual Studio Code を閉じます。 コントロール ノード から マネージド ノードに SSH 接続できるようにします ホストOS の Visual Studio Code の端末(bash)で下記のコマンドを入力します。 ./upload_SSH_keys.sh 途中でこのサーバーに接続して良いか聞かれたときは yes を入力します。 シェルスクリプト upload_SSH_keys.sh は、 SSH の接続に必要な各種設定と接続テストをしています。 コントロール ノード に秘密鍵をコピーします その公開鍵を マネージド ノード にコピーします ホスト名を登録します コントロール ノード から マネージド ノードに SSH 接続できることをテストします 実行の様子: $ ./upload_SSH_keys.sh ~/.ssh/known_hosts cat: /c/Users/user1/.ssh/known_hosts: No such file or directory # test connection and set known_host @control The authenticity of host '[localhost]:2259 ([127.0.0.1]:2259)' can't be established. ED25519 key fingerprint is SHA256:OyAt+LkHfQOnkxDEJ2JhI+MTWKvOgg9ou/l2C21ltIs. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[localhost]:2259' (ED25519) to the list of known hosts. connected to (@control) # test connection and set known_host @node1 The authenticity of host '[localhost]:2251 ([127.0.0.1]:2251)' can't be established. ED25519 key fingerprint is SHA256:Ndr0xuMRTa6a9OKa15VI3HmQtCFwty81RDeadb/ibhw. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '[localhost]:2251' (ED25519) to the list of known hosts. connected to (@node1) # make private key @control private_key 100% 1706 603.4KB/s 00:00 -rw-r--r--. 1 vagrant vagrant 1706 Aug 29 04:13 /home/vagrant/.ssh/id_rsa # chmod private key @control -rw-------. 1 vagrant vagrant 1706 Aug 29 04:13 /home/vagrant/.ssh/id_rsa # add host name @control 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.33.51 node1 # get public key @host ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCymXRpjm0PZfc2CHSi+Ilelm2BSfwigfXIWRleNPH66y+y46B8tENLDtwlVlMcv/p55HOelg+VwJ4P3udX80VABGWRKW/+VvEaZU5rdeCU82q95WyZOfV2WUwtwtEV81lcpKIsigDp1leR1eWmp8xucGbjLiZJ1i3WDCjgb7cYq49CIUpETHRdLqPFnsKOram3wRUOhD93kxVDma6d73E1b9XxoOm72EU2K0lQpejcjZuS/hZ8PCgca1kzM8wq6L6StOYlOugm/rorZDOMIXXEQddj2FUl27ORqCZn5b6YQr7ludd72AJE3ARVkRwRQGlm0Yasc8zqK99tph+jErF9 vagrant # set authorized_keys @node1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsdsticBkUTm3ndmUuu1bdxuyw5guXo7FmpjwWoa1lGIX4pIBtSh+2VfcpEnShT4rl1mxRjHDXJT6lNqIW7BYMHeC61GLafKVkrQeXkwEpiQBvx2gYd6gO/zkrNAd6JwI13D/iNqxHKohylDI1A64DsBSHgZS8QV1BYWJSAl5iUxct2aA04jq0+LKU4WteQcZjCU03TTIYKYzXfQ8OhvUd7JNJvI3IUgpkolJz8keidKZdmfNmNzrjGhu51KdDZnn0iMfOe8rAgwzdKcRnYIbP4m9oBifZeFecWeuHFLOUP6hbNn+MRao8h/s07drlQNXkhUnZqwV8PgnT35gz6eOB vagrant ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCymXRpjm0PZfc2CHSi+Ilelm2BSfwigfXIWRleNPH66y+y46B8tENLDtwlVlMcv/p55HOelg+VwJ4P3udX80VABGWRKW/+VvEaZU5rdeCU82q95WyZOfV2WUwtwtEV81lcpKIsigDp1leR1eWmp8xucGbjLiZJ1i3WDCjgb7cYq49CIUpETHRdLqPFnsKOram3wRUOhD93kxVDma6d73E1b9XxoOm72EU2K0lQpejcjZuS/hZ8PCgca1kzM8wq6L6StOYlOugm/rorZDOMIXXEQddj2FUl27ORqCZn5b6YQr7ludd72AJE3ARVkRwRQGlm0Yasc8zqK99tph+jErF9 vagrant # test connection and set known_host @control Warning: Permanently added 'node1,192.168.33.51' (ECDSA) to the list of known hosts. control connected to node1 $ ホストOS から SSH 経由で コントロール ノード の Ansible を実行します ホストOS の Visual Studio Code の端末(bash)で下記のコマンドを入力します。 ./run_playbook.sh playbook.yml に書かれたすべてのタスクを実行します。 付属の playbook.yml は マネージド ノード node1 に ~/tmp_visiting_card ファイルを作るだけですが、 通常の playbook.yml はインストールを行ます。 実行の様子: $ ./run_playbook.sh Using /etc/ansible/ansible.cfg as config file PLAY [node1] ******************************************************************* TASK [Gathering Facts] ********************************************************* ok: [node1] TASK [make visiting card] ****************************************************** --- before +++ after @@ -1,6 +1,6 @@ { - "atime": 1630211877.1403475, - "mtime": 1630211877.1403475, + "atime": 1630211959.23235, + "mtime": 1630211959.23235, "path": "tmp_visiting_card", - "state": "file" + "state": "touch" } changed: [node1] => {"changed": true, "dest": "tmp_visiting_card", "gid": 1000, "group": "vagrant", "mode": "0664", "owner": "vagrant", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 0, "state": "file", "uid": 1000} PLAY RECAP ********************************************************************* node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 バックアップ・リストア手順 Ansible がインストールできたら、その状態の VM をバックアップするとよいでしょう。 バックアップがあれば、開発する Playbook が正しく動作するようになるまで VM をリストアしてやりなおすことができます。 また、正常に動くタスクがある程度増えたときも VM をバックアップするとよいでしょう。 VM をバックアップします SSH 接続している Visual Studio Code を閉じます。 VirtualBox マネージャーを開いて、Ctrl キーを押しながら VM を複数選択し、 右クリックして、閉じる >> 電源オフ を選びます。 下記のフォルダーをバックアップにコピーします。 各 VM のフォルダー (~/VirtualBox VMs/____) Vagrant プロジェクトの .vagrant フォルダー VM を削除します VirtualBox マネージャーを開いて、Ctrl キーを押しながら VM を複数選択し、 右クリックして、除去 >> すべてのファイルを削除 を選びます。 VM をバックアップからリストアします 下記のフォルダーを削除して、バックアップからコピーします。 各 VM のフォルダー (~/VirtualBox VMs/____) Vagrant プロジェクトの .vagrant フォルダー もし、VirtualBox マネージャーに VM が表示されていないときは、 VirtualBox マネージャー >> 仮想マシン >> 追加 で復帰します。 起動手順 コントロール ノード の電源を入れます ホストOS の Vagrant プロジェクトのフォルダーを Visual Studio Code で開き、 端末(bash)で下記のコマンドを入力します。 control_only=1 vagrant up control_only=1 の環境変数の設定によって、コントロール ノード (@control) だけ Vagrant から起動します control_only=1 は、このプロジェクトの Vagrantfile が定義した固有の設定です コントロール ノード だけを対象にすることで、 コントロール ノード の起動の完了を待たずに、マネージド ノードの起動を始めることができます 先に VirtualBox マネージャーから起動した VM は共有フォルダーが使えなくなります マネージド ノード の電源を入れます VirtualBox マネージャーを開いて、VM (@node1) を右クリックして、起動 >> ヘッドレス起動 を選びます。 もし、複数の マネージド ノード があるときは、Ctrl キーを押しながら VM を複数選択してから 起動します。 デバッグ手順 Ansible を実行した Playbook のうち、問題が発生した1つのタスクだけ実行することで、 効率よくデバッグができます。 1つのタスクだけ実行するときは、コントロール ノード に SSH でログインする必要があります。 Visual Studio Code で コントロール ノード を開きます リモートのフォルダーを Visual Studio Code で開く(ログインする)ときは、 リモートではないフォルダーと同様に、最近開いたフォルダーから選ぶことで開くことができます。 下記のいずれかの方法があります。 Windows のタスクバーの VSCode を右クリック >> Folder [SSH:Server] 任意の Visual Studio Code >> File >> Open Recent >> Folder [SSH:Server] 初めてリモートのフォルダーを開いたときのように、 Remote Development のビューから開くこともできます。 Visual Studio Code でログインすると、 リモートのファイルを Visual Studio Code の テキスト エディター で編集できるようになります。 1つの Ansible のタスクだけ実行します コントロール ノード にログインしたら、 Ansible が使う インベントリー ファイル のパスを ANSIBLE_INVENTORY 環境変数に設定します。 export ANSIBLE_INVENTORY="/tmp/vagrant-ansible/inventory/vagrant_ansible_local_inventory" Vagrant の Ansible Local プロビジョナーを使っているので、 Ansible の インベントリー ファイル は自動的に VM 内に作られます。 のちに本番に使う物理サーバーに対して Ansible を使うときは、 別途 インベントリー ファイル を用意する必要があります。 1つの Ansible のタスクだけ実行するには、下記のコマンドを実行します。 ただし、実行するタスク名は編集してください。 make visiting card は playbook.yml に書かれたタスク名です。 ansible-playbook playbook.yml --diff -v --step --start-at-task "make visiting card" 上記に書かれていませんが、よく使うオプションは以下のものがあります。 --check: チェックだけ行い、タスクの実行は行ません (dry run)。本番では必ず行ってください --limit "HostName": 対象のサーバーを指定または制限します -vvv: 最も詳細に状況を表示します。-v オプションの代わりに指定します --step オプションを指定しているので、サーバーの情報収集する直前と、タスクを実行する直前に それを実行するかどうかを聞かれます。 サーバーの情報収集は毎回行うので、 1つのタスクだけ実行するときは、y を 2回入力します。 そして次のタスクの実行をするかどうかを聞かれるので、Ctrl + C キーを押して終了します。 最後のタスクを実行したときは Ctrl + C は不要です。 実行の様子: $ ansible-playbook playbook.yml --diff -v --step --start-at-task "make visiting card" Using /etc/ansible/ansible.cfg as config file PLAY [node1] **************************************************************************** Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: y Perform task: TASK: Gathering Facts (N)o/(y)es/(c)ontinue: ****************************** TASK [Gathering Facts] ****************************************************************** ok: [node1] Perform task: TASK: make visiting card (N)o/(y)es/(c)ontinue: y Perform task: TASK: make visiting card (N)o/(y)es/(c)ontinue: *************************** TASK [make visiting card] *************************************************************** --- before +++ after @@ -1,6 +1,6 @@ { - "atime": 1630211959.231837, - "mtime": 1630211959.231837, + "atime": 1630214387.011351, + "mtime": 1630214387.011351, "path": "tmp_visiting_card", - "state": "file" + "state": "touch" } changed: [node1] => {"changed": true, "dest": "tmp_visiting_card", "gid": 1000, "group": "vagrant", "mode": "0664", "owner": "vagrant", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 0, "state": "file", "uid": 1000} PLAY RECAP ****************************************************************************** node1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 マネージド ノード を増やすとき Vagrantfile の Managed node の部分をコピー&ペーストして、 IP アドレスをポート番号を調整して、vagrant up を実行すると サーバー(=ノード)を増やすことができます。 Vagrant にも冪等性があるため、増えたノードだけ作ります。 ホストOS から マネージド ノード への SSH 接続や コントロール ノード から マネージド ノード への SSH 接続の設定も行います。 導入効果 Ansible が使えるようになると、ソフトウェアのインストールに苦労することが 最初の1回だけになり、クリーンな状態の Linux に戻すことに抵抗がなくなります。 様々なソフトウェアがインストールされていると、多くのソフトウェアの動作を疑って しまいますが、そのような不安要素から開放されるでしょう。 また、新しく配属された人が開発環境を構築するためのドキュメントが不要になり、 構築にかかる日数も大幅に短縮されるでしょう。 付録)構造化文書による手順書 Windows で Ansible が入った VM をインストールする手順です。 VirtualBox をインストールします: - https://www.virtualbox.org/ >> Download VirtualBox X.X >> Windows hosts - ダウンロードしたファイル(例:VirtualBox-6.1.22-144080-Win.exe)を開きます - インストール オプションはデフォルトを使用 - ドライバーはインストールします Vagrant をインストールします: - https://www.vagrantup.com/downloads.html >> Windows(タブ)>> 64-bit - ダウンロードしたファイル(例:vagrant_2.2.16_x86_64.msi)を開きます - インストール オプションはデフォルトを使用 - PC を再起動します Git for Windows をインストールします: - https://git-scm.com/ >> Download for Windows(右下) - ダウンロードしたファイル(例:Git-2.33.0.2-64-bit.exe)を開く - Next を9回押す - Configuring the line ending conversions: Checkout as-is, commit as-is - 他のインストール オプションはデフォルトを使用 Visual Studio Code をインストールします: - https://code.visualstudio.com/ - ダウンロードしたファイル(例:VSCodeUserSetup-x64-1.50.1.exe)を開きます - インストール オプションはデフォルトを使用 - Git bash シェルをデフォルトで開くようにします: VSCode >> Terminal >> New Terminal >> +の右の↓(シェルの右上)>> Select Default Profile >> Git bash >> ゴミ箱 ボタン(シェルの右上) - (推奨)VSCode (Visual Studio Code をタスクバーにピン止めします: - (推奨)Ctrl + S キーを押したときに全てのファイルを保存するように設定します: | VSCode >> File >> Preferences >> Keyboard Shortcuts >> save all (と入力) >> File: Save All (をダブルクリック) >> Ctrl + S キー >> Enter キー ホストOSがプロキシがあるLANにいるとき: Git bash の環境変数 http_proxy などにプロキシのアドレスを設定します: #// 下記で定義する環境変数名は Linux でよく使われます #// http://__ProxyDomain__:__ProxyPortNum__ の例: http://10.100.100.100:8080 (@host) bash: - echo ${http_proxy} #// 表示されたら以降の手順は不要です - echo "export http_proxy=\"http://__ProxyDomain__:__ProxyPortNum__\"" >> ~/.bashrc - echo "export https_proxy=\"http://__ProxyDomain__:__ProxyPortNum__\"" >> ~/.bashrc - echo "export no_proxy=\"localhost,127.0.0.1,control,node1\"" >> ~/.bashrc bash を開きなおします: 下記の警告は無視できます: | WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile. vbguest プラグインをインストールします: #// Ansible Local と Vagrant を接続するプラグインです (@host) Git bash: #// VSCode >> Terminal >> New Terminal - vagrant plugin install vagrant-vbguest プロジェクト フォルダーをダウンロードします: (@host) Git bash: - cd ~/Desktop - git clone https://github.com/Takakiriy/multi_vm_ansible.git Visual Studio Code で プロジェクト フォルダーを開きます: (@host) Git bash: - code ~/Desktop/multi_vm_ansible #// VSCode 内で上記のコマンドを入力したら、コマンドを入力した VSCode を閉じます Git bash シェルを開きます: (@host) VSCode >> Terminal >> New Terminal 仮想マシンを作って起動します: (@host) Git bash: - cd __Project__ #// 不要の場合あり。以後も同様 - vagrant up #// 初回は約 10分。内部で Ansible Local による Playbook も動きます #// Vagrant プロジェクトがあるフォルダーは、VM の /vagrant/ フォルダーと共有します。 SSH で仮想マシンにログインできるように設定します(VSCode用): VSCode の Remote Development 拡張機能をインストールします: インストールします: (@host) VSCode >> 拡張機能 ボタン(左) >> Remote Development SSH Targets を表示します: メニュー: (@host) VSCode >> Remote Explorer(アイコン:左) REMOTE EXPLORER(上): SSH Targets SSH の設定を VSCode に追加します: (@host) VSCode Git bash: - vagrant ssh-config #// SSH の接続に必要な設定が表示されます - code ~/.ssh/config #// vagrant ssh-config の出力を最後に貼り付けます Visual Studio Code で SSH 接続します: vagrant / フォルダーが表示されているか確認します: (@host) VSCode >> Remote Explorer(左のアイコン)>> control >> vagrant / vagrant / フォルダーが表示されていない場合: SSH 接続します: control(の右のフォルダー)ボタン (@control) platform: Linux #// 接続できない時は、vagrant ssh-config を再実行してください SSH 接続した Visual Studio Code でフォルダーを開きます: (@control) VSCode >> File >> Open Folder ... >> /vagrant/ vagrant / フォルダーが表示されている場合: (@host) vagrant / フォルダー(の右のフォルダー)ボタン シェルを開けることを確認します: (@control) VSCode >> Terminal >> New Terminal #// [vagrant@localhost vagrant]$ と表示されます #// 次回プロジェクトを開いたときにシェルが開いた状態になります 開けたら Visual Studio Code を閉じます: Remote Explorer で開いたフォルダーを表示させます: (@host) VSCode >> Remote Explorer(左のアイコン)>> Reflesh ボタン(右上) 次回からログインするときの操作: - (@host) タスクバーの VSCode を右クリック >> __Folder__ [SSH:__Server__] #// または - (@host) VSCode >> File >> Open Recent >> __Folder__ [SSH:__Server__] #// または - (@host) VSCode >> Remote Explorer ボタン(左)>> REMOTE EXPLORER= SSH Targets >> __Server__ >> __Folder__ 以上を @node1 についても行ます: ansible_local がインストールされた VM から他の VM に SSH 接続できるようにします: (@host) Git bash: ./upload_SSH_keys.sh SSH 経由で Ansible playbook を実行します: (@host) Git bash: ./run_playbook.sh 作成したすべての VM の電源を切ります: VirtualBox マネージャー >> __ProjectFolderName___control____ などを選択して右クリック >> 閉じる >> 電源オフ (必要なら).vagrant フォルダーと VM のフォルダーをバックアップします: VM のフォルダー: .vagrant フォルダー: #// VM の情報を持っています VM の電源を入れます: #// VM の電源を入れてホストOS と SSH 接続できるようにします #// 現在の VM が電源オフの状態でも中断の状態(ホストOSをシャットダウンした後の状態)でも同じ手順です VSCode でホストOS の Vagrant プロジェクトを開きます: タスクバーの VSCode を右クリック >> __Project__ VirtualBox マネージャーに VM が表示されていない場合: VirtualBox マネージャー >> 仮想マシン >> 追加 vagrant を起動します: (@host) Git bash: control_only=1 vagrant up #// 下記のサーバーも同時に起動できます: #// control_only=1 は、この Vagrantfile 固有の設定です #// 先に VirtualBox マネージャーで起動した VM は共有フォルダーが使えません #// control サーバー以外は vagrant up では起動しません。後で並列起動して早くするためです control サーバー以外を VirtualBox から起動します: VirtualBox マネージャー >> __ProjectFolderName___node1____ などをまとめて選択して右クリック >> 起動 >> ヘッドレス起動 1つのタスクだけ実行します: --step オプションと --start-at-task オプションを使います: (@control) bash: - export ANSIBLE_INVENTORY="/tmp/vagrant-ansible/inventory/vagrant_ansible_local_inventory" - ansible-playbook playbook.yml --diff -v --step --start-at-task "__TaskName__" よく使うオプション: --limit "__HostName__": 対象のサーバーを指定または制限します -vvv: 最も詳細に状況を表示します --check: チェックだけ行い、タスクの実行は行ません (dry run) 参考サイト Ansible の Vagrant ガイド https://docs.ansible.com/ansible/2.9_ja/scenario_guides/guide_vagrant.html Vagrant の Amsible Local プロビジョナー https://www.vagrantup.com/docs/provisioning/ansible_local Ansible Playbook の作り方(サンプルの表示が崩れています) https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks.html Ansible Playbook の作り方(英語版) https://docs.ansible.com/ansible/2.9/user_guide/playbooks.html ansible-playbook コマンドのオプション https://docs.ansible.com/ansible/2.9_ja/cli/ansible-playbook.html Ansible のモジュールのカタログ https://docs.ansible.com/ansible/2.9_ja/modules/modules_by_category.html (物理サーバーなど、Vagrant を使わない)Ansible のインストール https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html
- 投稿日:2021-08-29T16:43:49+09:00
Msieveを使った高速素因数分解
0. 素因数分解 素早く素因数分解をする一番有名な方法として$1 \le i \le \sqrt{N}$まで試し割してみることが知られています。 ですがこの手法は計算量が$O(\sqrt{N})$で制約が比較的小さい競技プログラミングでは有効ですがそれ以外の場面では時間がかかりすぎてしまいます。 そこで今回はMsieveという外部ツールを用いて素因数分解をやってみたいと思います。 Msieveは有名な高速な素因数分解の手法である楕円曲線法(ECM)、複数多項式二次ふるい法(MPQS)、一般数体ふるい法(GNFS)が高速に実行できる便利なツールです 1. 環境 Windows10 Windows Subsystem for Linux 2(WSL2) まだWLS2を導入してないのであれば以下のサイトが参考になると思います。 Windows 10でLinuxを使う(WSL2) 2. Msieveのインストール 以下のサイトに飛んでDownloadをクリックしてください Msieveをダウンロード Linux上でソースコードをコンパイルして実行するので以下のコマンドを順次実行します まずはパッケージをダウンロード $ sudo apt-get install build-essential libgmp3-dev zlib1g-dev libecm-dev 以下のコマンドでコンパイルができる $ wget "http://downloads.sourceforge.net/project/msieve/msieve/Msieve%20v1.52/msieve152.tar.gz?r=&ts=1452107977&use_mirror=jaist" -O msieve152.tar.gz $ tar xvf msieve152.tar.gz $ cd msieve-1.52/ $ make all ECM=1 コンパイルが終了したら以下のコマンドでMsieveの実行オプションを見ることができる $ ./msieve --help 後でよく使うオプションをあげておく 3. Msieveを実行してみる ./msieve オプション 正整数 さきほどのコマンドが全部実行できたならば上のコマンドで素因数分解を行うことができる。 よく使うであろうオプション -v :ログを画面に出力 -e :15桁を超える素因数を探す -q :ログファイルに出力しない 基本的にこの3つぶちこんとけばOKである 以下は実行例 $ ./msieve -e -v -q 831416828080417866340504968188990032810316193533653516022175784399720141076262857 831416828080417866340504968188990032810316193533653516022175784399720141076262857 prp40: 1593021310640923782355996681284584012117 prp42: 521911930824021492581321351826927897005221 私の環境だとこれの実行に4分かかったのでみなさんも根気強く実行が終わるのを待ちましょう。ちなみにサマーウォーズでおなじみのRSA暗号は桁数によっちゃこれで簡単に突破することができます。RSA暗号についての詳しい説明は準備中なので次回にご期待ください! 参考文献 https://inaz2.hatenablog.com/entry/2016/01/09/032521
- 投稿日:2021-08-29T16:12:47+09:00
コマンドライン 基礎コマンド一覧
ファイル作成 touch ファイル名 ファイルの中身を確認 cat ファイル名 ディレクトリ作成 mkdir ディレクトリ名 ディレクトリへの移動 cd ディレクトリ名 ファイルには使えない カレントディレクトリ確認 pwd ディレクトリの中身の確認 ls 一つ下の階層しか見れない 一つ上のディレクトリへの移動 cd .. ホームディレクトリへの移動 cd ファイル・ディレクトリを指定のディレクトリへの移動 mv ファイル名 移動先のディレクトリ名 mv ディレクトリ名 移動先のディレクトリ名 ファイル・ディレクトリ名の変更 mv ファイル名 新しいファイル名 mv ディレクトリ名 新しいディレクトリ名 ファイル・ディレクトリのコピー cp ファイル名 新しいファイル名 cp -r ディレクトリ名 新しいディレクトリ名 ファイル・ディレクトリの削除 rm ファイル名 rm -r ディレクトリ名 最近使用したコマンドの再使用 キーボードの上矢印
- 投稿日:2021-08-29T13:27:14+09:00
Linux: フリーソフト「SoftEther VPN」を使用してテレワーク用VPNサーバを構築してみる
SoftEther VPN を用いて会社のテレワーク用VPNサーバを構築する機会があったので、今後同様の構築が必要となった場合に備えてメモしておきます。 使用したディストリビューション: CentOS 8-Stream ベース環境:サーバー(GUI使用) 選択した環境用のその他のソフトウェア:なし 0. SoftEther VPN とは SoftEther VPN は、筑波大学で開発されたオープンソースのVPNソフトウェアです。 SoftEther VPN プロジェクト SoftEther VPN には「Server」「Client」「Bridge」の3つのソフトウェアがありますが、今回は「Server」をLinuxサーバにインストールしてVPNサーバを構築します。 なお、本記事は SoftEther VPN の細かい設定については記載しません。 SoftEther VPN がサーバ上で正常に稼働するところまでを目指します。 1. 準備 SoftEther VPN をインストールする前に、インストール先のサーバの状態を確認します。 まずは、OS/CPU/メモリ/ディスクが適切な状態かを確認します。 動作条件は以下の通りです。 SoftEther VPN プロジェクト - 仕様 下記の例だと、 OS:Linux 4.18.0 CPU:Intel 64bit 空きメモリ:1.1G 空きディスク:66G であるため、 SoftEther VPN の動作条件を満たします。 Linux [root@testhost ~]# uname -a Linux testhost 4.18.0-331.el8.x86_64 #1 SMP Thu Aug 19 16:49:03 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux [root@testhost ~]# grep "model name" /proc/cpuinfo model name : Intel(R) Core(TM) i5 CPU U 560 @ 1.33GHz model name : Intel(R) Core(TM) i5 CPU U 560 @ 1.33GHz model name : Intel(R) Core(TM) i5 CPU U 560 @ 1.33GHz model name : Intel(R) Core(TM) i5 CPU U 560 @ 1.33GHz [root@testhost ~]# getconf LONG_BIT 64 [root@testhost ~]# free -h total used free shared buff/cache available Mem: 1.6Gi 217Mi 1.1Gi 9.0Mi 339Mi 1.3Gi Swap: 3.8Gi 0B 3.8Gi [root@testhost ~]# df -h /usr/local Filesystem Size Used Avail Use% Mounted on /dev/mapper/cs_testhost-root 70G 4.9G 66G 7% / 次に、必要なパッケージをインストールします。 対象は以下の通りです。 SoftEther VPN プロジェクト - 7.3 Linuxへのインストールと初期設定 上記のリストにはパッケージ名が記載されていないものがいくつかあります。 それらは、それぞれ次のパッケージ名に対応します。 パッケージファイル展開用の tar や gzip などのソフトウェア → tar , gzip cat や cp などの基本的なファイル操作ユーティリティ → coreutils 日本語環境で使用するための EUC-JP や UTF-8 などのコードページテーブル → glibc-langpack-ja また、下記のパッケージは今回は不要です。 chkconfig システムユーティリティ → 今回は systemd を用いて自動起動を設定するため不要 pthread ライブラリ → glibc に含まれるため不要 加えて、上記リストには記載されていませんが、ビルドに使用するため次のパッケージも必要となります。 make まずは、以下のコマンドを入力して各パッケージがインストール済みかどうかを確認します。 Linux [root@testhost ~]# dnf list installed | grep -wE "(gcc|binutils|tar|gzip|coreutils|glibc|zlib|openssl|readline|ncurses|make)" binutils.x86_64 2.30-108.el8 @baseos coreutils.x86_64 8.30-12.el8 @baseos coreutils-common.x86_64 8.30-12.el8 @baseos glibc.x86_64 2.28-162.el8 @baseos glibc-common.x86_64 2.28-162.el8 @baseos glibc-langpack-en.x86_64 2.28-162.el8 @baseos glibc-langpack-ja.x86_64 2.28-162.el8 @baseos gzip.x86_64 1.9-12.el8 @baseos ncurses.x86_64 6.1-9.20180224.el8 @baseos ncurses-base.noarch 6.1-9.20180224.el8 @baseos ncurses-libs.x86_64 6.1-9.20180224.el8 @baseos openssl.x86_64 1:1.1.1k-4.el8 @baseos openssl-libs.x86_64 1:1.1.1k-4.el8 @baseos openssl-pkcs11.x86_64 0.4.10-2.el8 @baseos readline.x86_64 7.0-10.el8 @baseos tar.x86_64 2:1.30-5.el8 @baseos xmlsec1-openssl.x86_64 1.2.25-4.el8 @appstream zlib.x86_64 1.2.11-17.el8 @baseos 上記の例だと、「gcc」「make」の2つが不足しています。 dnf コマンドを用いて、上記2つのパッケージをインストールします。 また、インストール済みパッケージの最新化も同時に行っておきます。 Linux [root@testhost ~]# dnf update Last metadata expiration check: 0:23:18 ago on Tue 24 Aug 2021 02:58:34 AM EDT. Dependencies resolved. Nothing to do. Complete! [root@testhost ~]# dnf -y install gcc make Last metadata expiration check: 0:26:58 ago on Tue 24 Aug 2021 02:58:34 AM EDT. Dependencies resolved. --------------- ( 省略 ) --------------- Complete! [root@testhost ~]# dnf list installed | grep -wE "(gcc|binutils|tar|gzip|coreutils|glibc|zlib|openssl|readline|ncurses|make)" binutils.x86_64 2.30-108.el8 @baseos coreutils.x86_64 8.30-12.el8 @baseos coreutils-common.x86_64 8.30-12.el8 @baseos gcc.x86_64 8.5.0-3.el8 @appstream glibc.x86_64 2.28-162.el8 @baseos glibc-common.x86_64 2.28-162.el8 @baseos glibc-debel.x86_64 2.28-162.el8 @baseos glibc-header.x86_64 2.28-162.el8 @baseos glibc-langpack-en.x86_64 2.28-162.el8 @baseos glibc-langpack-ja.x86_64 2.28-162.el8 @baseos gzip.x86_64 1.9-12.el8 @baseos make.x86_64 1:4.2.1-10.el8 @baseos ncurses.x86_64 6.1-9.20180224.el8 @baseos ncurses-base.noarch 6.1-9.20180224.el8 @baseos ncurses-libs.x86_64 6.1-9.20180224.el8 @baseos openssl.x86_64 1:1.1.1k-4.el8 @baseos openssl-libs.x86_64 1:1.1.1k-4.el8 @baseos openssl-pkcs11.x86_64 0.4.10-2.el8 @baseos readline.x86_64 7.0-10.el8 @baseos tar.x86_64 2:1.30-5.el8 @baseos xmlsec1-openssl.x86_64 1.2.25-4.el8 @appstream zlib.x86_64 1.2.11-17.el8 @baseos これで、 SoftEther VPN Server をインストールする準備が整いました。 2. ソフトウェアのダウンロード 以下のサイトから、ソフトウェアをダウンロードします。 SoftEther ダウンロード センター 選択項目は以下の通りです。 ダウンロードするソフトウェア:SoftEther VPN (Freeware) コンポーネント:SoftEther VPN Server プラットフォーム:Linux CPU:項番1で確認したもの。今回は Intel x64 / AMD64 (64bit) を選択。 上記項目を選択して、先頭に出てきた最新版のソフトウェアをダウンロードします。 今回は SoftEther VPN Server (Ver 4.38, Build 9760, rtm) でした。 3. ソフトウェアのビルド 項番2でダウンロードしたファイルを構築予定のサーバ上に配置して、いよいよ構築を初めます。 今回は root ユーザのホームディレクトリである /root に配置しました。 まずは、配置した .tar.gz ファイルを展開してください。 vpnserver というディレクトリが出来ればOKです。 Linux [root@testhost ~]# ls -l total 7364 -rw-------. 1 root root 1128 Aug 24 01:33 anaconda-ks.cfg -rw-r--r--. 1 root root 1409 Aug 24 01:51 initial-setup-ks.cfg -rw-rw-r--. 1 testuser testuser 7529219 Aug 24 01:59 softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz [root@testhost ~]# tar xzf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz [root@testhost ~]# ls -l total 7364 -rw-------. 1 root root 1128 Aug 24 01:33 anaconda-ks.cfg -rw-r--r--. 1 root root 1409 Aug 24 01:51 initial-setup-ks.cfg -rw-rw-r--. 1 testuser testuser 7529219 Aug 24 01:59 softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz drwxrwxrwx. 4 root root 265 Aug 17 09:38 vpnserver 次に、作成された vpnserver ディレクトリに移動して、ソフトウェアのビルドを行います。 Makefile ファイルは既に存在するため、 make コマンドを入力するだけでビルドは完了します。 ここでエラーが出るようなら、項番1の項目について何か不足がないかを再度確認してみてください。 Linux [root@testhost ~]# cd vpnserver [root@testhost vpnserver]# ls -l Makefile -rwxrwxrwx. 1 root root 3577 Aug 17 09:38 Makefile [root@testhost vpnserver]# make -------------------------------------------------------------------- SoftEther VPN Server (Ver 4.38, Build 9760, Intel x64 / AMD64) for Linux Build Utility Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved. --------------- ( 省略 ) --------------- make[1]: Leaving directory '/root/vpnserver' 4. ソフトウェアの配置 項目3でビルドしたソフトウェアを、適当な箇所に配置します。 公式では /usr/local ディレクトリが推奨されていますので、今回はそれに従います。 Linux [root@testhost vpnserver]# cd .. [root@testhost ~]# ls -ld vpnserver drwxrwxrwx. 5 root root 4096 Aug 24 07:09 vpnserver [root@testhost ~]# mv vpnserver /usr/local [root@testhost ~]# ls -ld /usr/local/vpnserver drwxrwxrwx. 5 root root 4096 Aug 24 07:09 /usr/local/vpnserver 5. ソフトウェアの権限修正 項目4の配置後、一般ユーザの無用なアクセスを防ぐために各ファイル及びディレクトリのパーミッションを修正します。 この際、 vpncmd 及び vpnserver は実行コマンドなので、実行権限が不足しないように 700 で修正してください。 その他のファイルは 600 で、ディレクトリは 700 で修正します。 オーナー及びグループについては今回は修正していませんが、 root 以外の値の場合は root に修正してください。 Linux [root@testhost ~]# cd /usr/local/vpnserver [root@testhost vpnserver]# ls -lR .: total 12656 -rwxrwxrwx. 1 root root 82 Aug 17 09:38 Authors.txt drwx------. 2 root root 6 Aug 24 07:09 chain_certs drwxrwxrwx. 2 root root 41 Aug 24 07:09 code -rwxrwxrwx. 1 root root 2009248 Aug 17 09:38 hamcore.se2 -rw-------. 1 root root 867 Aug 24 07:09 lang.config drwxrwxrwx. 2 root root 170 Aug 24 07:09 lib -rwxrwxrwx. 1 root root 3577 Aug 17 09:38 Makefile -rwxrwxrwx. 1 root root 32256 Aug 17 09:38 ReadMeFirst_Important_Notices_cn.txt -rwxrwxrwx. 1 root root 37747 Aug 17 09:38 ReadMeFirst_Important_Notices_en.txt -rwxrwxrwx. 1 root root 52554 Aug 17 09:38 ReadMeFirst_Important_Notices_ja.txt -rwxrwxrwx. 1 root root 3587 Aug 17 09:38 ReadMeFirst_License.txt -rwxr-xr-x. 1 root root 5400688 Aug 24 07:09 vpncmd -rwxr-xr-x. 1 root root 5400760 Aug 24 07:09 vpnserver ./chain_certs: total 0 ./code: total 8972 -rwxrwxrwx. 1 root root 4591850 Aug 24 07:09 vpncmd.a -rwxrwxrwx. 1 root root 4591452 Aug 24 07:09 vpnserver.a ./lib: total 7944 -rwxrwxrwx. 1 root root 7288 Aug 24 07:09 libcharset.a -rwxrwxrwx. 1 root root 5030594 Aug 24 07:09 libcrypto.a -rwxrwxrwx. 1 root root 278022 Aug 24 07:09 libedit.a -rwxrwxrwx. 1 root root 990842 Aug 24 07:09 libiconv.a -rwxrwxrwx. 1 root root 30606 Aug 24 07:09 libintelaes.a -rwxrwxrwx. 1 root root 631542 Aug 24 07:09 libintelaes.a -rwxrwxrwx. 1 root root 987510 Aug 24 07:09 libssl.a -rwxrwxrwx. 1 root root 120698 Aug 24 07:09 libz.a -rwxrwxrwx. 1 root root 40585 Aug 17 09:38 License.txt [root@testhost vpnserver]# chmod 600 * [root@testhost vpnserver]# chmod 700 vpncmd vpnserver chain_certs code lib [root@testhost vpnserver]# chmod 600 code/* [root@testhost vpnserver]# chmod 600 lib/* [root@testhost vpnserver]# ls -lR .: total 12656 -rw-------. 1 root root 82 Aug 17 09:38 Authors.txt drwx------. 2 root root 6 Aug 24 07:09 chain_certs drwx------. 2 root root 41 Aug 24 07:09 code -rw-------. 1 root root 2009248 Aug 17 09:38 hamcore.se2 -rw-------. 1 root root 867 Aug 24 07:09 lang.config drwx------. 2 root root 170 Aug 24 07:09 lib -rw-------. 1 root root 3577 Aug 17 09:38 Makefile -rw-------. 1 root root 32256 Aug 17 09:38 ReadMeFirst_Important_Notices_cn.txt -rw-------. 1 root root 37747 Aug 17 09:38 ReadMeFirst_Important_Notices_en.txt -rw-------. 1 root root 52554 Aug 17 09:38 ReadMeFirst_Important_Notices_ja.txt -rw-------. 1 root root 3587 Aug 17 09:38 ReadMeFirst_License.txt -rwx------. 1 root root 5400688 Aug 24 07:09 vpncmd -rwx------. 1 root root 5400760 Aug 24 07:09 vpnserver ./chain_certs: total 0 ./code: total 8972 -rw-------. 1 root root 4591850 Aug 24 07:09 vpncmd.a -rw-------. 1 root root 4591452 Aug 24 07:09 vpnserver.a ./lib: total 7944 -rw-------. 1 root root 7288 Aug 24 07:09 libcharset.a -rw-------. 1 root root 5030594 Aug 24 07:09 libcrypto.a -rw-------. 1 root root 278022 Aug 24 07:09 libedit.a -rw-------. 1 root root 990842 Aug 24 07:09 libiconv.a -rw-------. 1 root root 30606 Aug 24 07:09 libintelaes.a -rw-------. 1 root root 631542 Aug 24 07:09 libintelaes.a -rw-------. 1 root root 987510 Aug 24 07:09 libssl.a -rw-------. 1 root root 120698 Aug 24 07:09 libz.a -rw-------. 1 root root 40585 Aug 17 09:38 License.txt 上記で変更したのは Linux の通常のパーミッションですが、それとは別に SELinux のパーミッションにも注意が必要です。 特にホームディレクトリでビルド作業を行なっていたりした場合、 SELinux のパーミッションがホームディレクトリ向けとなっており、権限不足で正常にサービスが起動できないことがあります。 そのような場合は、 restorecon コマンドを使用してパーミッションを最適化してください。 上手くいかない場合は SELinux 自体を無効化するという方法もありますが、 VPN サーバは外部に開かれるサーバですので、安全性を考えると有効なままにしておきたいところです。 Linux [root@testhost vpnserver]# ls -ZR .: unconfined_u:object_r:admin_home_t:s0 Authors.txt unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_cn.txt unconfined_u:object_r:admin_home_t:s0 chain_certs unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_en.txt unconfined_u:object_r:admin_home_t:s0 code unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_ja.txt unconfined_u:object_r:admin_home_t:s0 hamcore.se2 unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_License.txt unconfined_u:object_r:admin_home_t:s0 lang.config unconfined_u:object_r:admin_home_t:s0 vpncmd unconfined_u:object_r:admin_home_t:s0 lib unconfined_u:object_r:admin_home_t:s0 vpnserver unconfined_u:object_r:admin_home_t:s0 Makefile ./chain_certs: ./code: unconfined_u:object_r:admin_home_t:s0 vpncmd.a unconfined_u:object_r:admin_home_t:s0 vpnserver.a ./lib: unconfined_u:object_r:admin_home_t:s0 libcharset.a unconfined_u:object_r:admin_home_t:s0 libiconv.a unconfined_u:object_r:admin_home_t:s0 libssl.a unconfined_u:object_r:admin_home_t:s0 libcrypto.a unconfined_u:object_r:admin_home_t:s0 libintelaes.a unconfined_u:object_r:admin_home_t:s0 libz.a unconfined_u:object_r:admin_home_t:s0 libedit.a unconfined_u:object_r:admin_home_t:s0 libintelaes.a unconfined_u:object_r:admin_home_t:s0 License.txt [root@testhost vpnserver]# restorecon -R . [root@testhost vpnserver]# ls -ZR .: unconfined_u:object_r:usr_t:s0 Authors.txt unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_cn.txt unconfined_u:object_r:usr_t:s0 chain_certs unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_en.txt unconfined_u:object_r:usr_t:s0 code unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_ja.txt unconfined_u:object_r:usr_t:s0 hamcore.se2 unconfined_u:object_r:usr_t:s0 ReadMeFirst_License.txt unconfined_u:object_r:usr_t:s0 lang.config unconfined_u:object_r:usr_t:s0 vpncmd unconfined_u:object_r:lib_t:s0 lib unconfined_u:object_r:usr_t:s0 vpnserver unconfined_u:object_r:usr_t:s0 Makefile ./chain_certs: ./code: unconfined_u:object_r:usr_t:s0 vpncmd.a unconfined_u:object_r:usr_t:s0 vpnserver.a ./lib: unconfined_u:object_r:lib_t:s0 libcharset.a unconfined_u:object_r:lib_t:s0 libiconv.a unconfined_u:object_r:lib_t:s0 libssl.a unconfined_u:object_r:lib_t:s0 libcrypto.a unconfined_u:object_r:lib_t:s0 libintelaes.a unconfined_u:object_r:lib_t:s0 libz.a unconfined_u:object_r:lib_t:s0 libedit.a unconfined_u:object_r:lib_t:s0 libintelaes.a unconfined_u:object_r:lib_t:s0 License.txt 6. 動作チェック SoftEther VPN Server の check コマンドを実行して、動作チェックを行います。 Linux [root@testhost vpnserver]# ./vpncmd /tools /cmd check vpncmd command - SoftEther VPN Command Line Management Utility SoftEther VPN Command Line Management Utility (vpncmd command) --------------- ( 省略 ) --------------- The command completed successfully. SoftEther VPN Server が正常に動作できる状態であることが確認できました。 以上で、 SoftEther VPN Server の基本的な構築は完了となります。 7. 起動/停止 それでは、実際に SoftEther VPN Server を起動と停止を行ってみます。 起動/停止はそれぞれ、 vpnserver コマンドに引数 start / stop を与えることで実行できます。 Linux [root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver" [root@testhost vpnserver]# ./vpnserver start The SoftEther VPN Server service has been started. Let's get started by accessing to the following URL from your PC: --------------- ( 省略 ) --------------- A TLS certificate warning will appear because the server uses self signed certificate by default. That is natural. Continue with ignoring the TLS warning. [root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver" root 2466 1 0 07:39 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc root 2467 2466 0 07:39 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc [root@testhost vpnserver]# ./vpnserver stop Stopping the SoftEther VPN Server service ... SoftEther VPN Server service has been stopped. [root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver" [root@testhost vpnserver]# 起動/停止が実施できました。 8. 自動起動設定 サーバ起動時に SoftEther VPN Server が自動的に起動するようにします。 公式ページには SysVinit による自動起動登録の方法が記載されていますが、最近のLinuxにおけるサービス管理の主流は systemd ですので、今回はそちらを採用します。 まずは設定ファイルを作成します。 Linux [root@testhost vpnserver]# cd /usr/lib/systemd/system [root@testhost system]# vi vpnserver.service 設定ファイルの記載例を以下に示します。 あくまで一例ですので、ファイル名や細かい設定は多少変更することも可能です。 vpnserver.service [Unit] Description = SoftEther VPN Server After = network.target [Service] Type = forking ExecStart = /usr/local/vpnserver/vpnserver start ExecStop = /usr/local/vpnserver/vpnserver stop Restart = always [Install] WantedBy = default.target 作成完了後、設定ファイルの再読み込みを実行して新しい設定を反映し、 systemctl コマンドから起動/停止を実施してみます。 正常に起動/停止ができない場合は、設定ファイルの内容やコマンドの権限に誤りがないかを確認してみてください。 Linux [root@testhost system]# systemctl daemon-reload [root@testhost system]# systemctl is-active vpnserver.service inactive [root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver" [root@testhost system]# systemctl start vpnserver.service [root@testhost system]# systemctl is-active vpnserver.service active [root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver" root 2817 1 0 07:53 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc root 2818 2817 3 07:53 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc [root@testhost system]# systemctl stop vpnserver.service [root@testhost system]# systemctl is-active vpnserver.service inactive [root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver" [root@testhost system]# systemctl コマンドで起動/停止が実施できることが確認できました。 それでは、いよいよ自動起動の登録を行います。 Linux [root@testhost system]# systemctl enable vpnserver.service Created symlink /etc/systemd/system/default.target.wants/vpnserver.service → /usr/lib/systemd/system/vpnserver.service. [root@testhost system]# systemctl is-enabled vpnserver.service enabled SoftEther VPN Server が自動起動に登録できました。 サーバを再起動して、 SoftEther VPN Server が自動的に起動することを確認してください。 Linux [root@testhost ~]# systemctl is-active vpnserver.service active [root@testhost ~]# ps -ef | grep -v "grep" | grep "vpnserver" root 1071 1 0 00:57 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc root 1072 1071 0 00:57 ? 00:00:00 /usr/local/vpnserver/vpnserver execsvc 9. ログ関連 SoftEther VPN Server は定期的にログを出力しますが、その出力先はコマンドが配置されているディレクトリ(今回は /usr/local/vpnserver )の配下です。 SoftEther VPN Server は設定によってはログを大量に出力するので、ディスク容量が枯渇するリスクを考えると、できれば /var の配下に出力先を移動したいです。 ところが、SoftEther VPN Server にはログ出力先を変更する機能がありません。 ではどうすればよいかというと、 /var 配下のディレクトリにリンクを貼れば、出力先が実質的に /var 配下に変更された状態にできます。 なお、変更作業の際は、 SoftEther VPN Server は一旦停止してください。 Linux [root@testhost ~]# cd /var/log [root@testhost log]# mkdir -m 700 vpnserver [root@testhost log]# ls -ld vpnserver drwx------. 2 root root 6 Aug 24 09:31 vpnserver [root@testhost log]# cd /usr/local/vpnserver [root@testhost vpnserver]# ls -ld *_log drwx------. 2 root root 6 Aug 24 07:39 packet_log drwx------. 3 root root 21 Aug 24 07:39 security_log drwx------. 2 root root 30 Aug 24 07:39 server_log [root@testhost vpnserver]# systemctl is-active vpnserver.service active [root@testhost vpnserver]# systemctl stop vpnserver.service [root@testhost vpnserver]# systemctl is-active vpnserver.service inactive [root@testhost vpnserver]# mv *_log /var/log/vpnserver [root@testhost vpnserver]# ls -l /var/log/vpnserver drwx------. 2 root root 6 Aug 24 07:39 packet_log drwx------. 3 root root 21 Aug 24 07:39 security_log drwx------. 2 root root 30 Aug 24 07:39 server_log [root@testhost vpnserver]# ln -s /var/log/vpnserver/packet_log packet_log [root@testhost vpnserver]# ln -s /var/log/vpnserver/security_log security_log [root@testhost vpnserver]# ln -s /var/log/vpnserver/server_log server_log [root@testhost vpnserver]# ls -l *_log lrwxrwxrwx. 1 root root 29 Aug 24 09:38 packet_log -> /var/log/vpnserver/packet_log lrwxrwxrwx. 1 root root 31 Aug 24 09:38 security_log -> /var/log/vpnserver/security_log lrwxrwxrwx. 1 root root 29 Aug 24 09:38 server_log -> /var/log/vpnserver/server_log [root@testhost vpnserver]# ls -Z /var/log/vpnsrever unconfined_u:object_r:usr_t:s0 packet_log unconfined_u:object_r:usr_t:s0 security_log unconfined_u:object_r:usr_t:s0 server_log [root@testhost vpnserver]# restorecon -R /var/log/vpnserver [root@testhost vpnserver]# ls -Z /var/log/vpnsrever unconfined_u:object_r:var_log_t:s0 packet_log unconfined_u:object_r:var_log_t:s0 security_log unconfined_u:object_r:var_log_t:s0 server_log [root@testhost vpnserver]# systemctl is-active vpnserver.service inactive [root@testhost vpnserver]# systemctl start vpnserver.service [root@testhost vpnserver]# systemctl is-active vpnserver.service active もう1点ログ関連で注意すべきは、 SoftEther VPN Server にはログを定期的に削除する機能が存在しないことです。 そのため、一定期間が過ぎたログを定期的に削除する処理を cron 等で別途作成する必要があります。 以下の例では、毎日 01:00 に1年前のログを削除しています。 /etc/crontab --------------- ( 前略 ) --------------- # * * * * * user-name command to be executed 0 1 * * * root /usr/bin/find /var/log/vpnserver -type f -mtime +365 | xargs -r rm -f --------------- ( 後略 ) --------------- 10. ファイアウォール関連 SoftEther VPN Server 自体は上記の作業を行えば動作します。 ですが、いくら構築しても肝心のサーバへの接続が通らないとせっかく起動したプロセスに通信できません。 これでは意味がないので、VPNサーバ上でファイアウォールが起動しているかを確認し、起動している場合は SoftEther VPN Server が使用するポートに穴を開けるように変更します。 ポート番号は SoftEther VPN Server の設定で変更できますが、今回はデフォルトのポート番号の1つである 443/tcp に対して穴を開けるように設定を変更し、リロードしてその設定を反映します。 Linux [root@testhost ~]# systemctl is-active firewalld active [root@testhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s25 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: [root@testhost ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent success [root@testhost ~]# firewall-cmd --reload success [root@testhost ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: enp0s25 sources: services: cockpit dhcpv6-client ssh ports: 443/tcp protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ルータ等のネットワーク機器がある場合は、そちらの設定にも注意してください。 なお、IPアドレスでのフィルタリングは今回は設定しておりません。 無論 firewalld で設定することも可能ですが、 SoftEther VPN Server の機能にもIPアドレスによるフィルタリングは存在するため、必ずしも firewalld 側でフィルタを行う必要はありません。 どのようにアクセス制限を行うかについては、サーバの利用想定やネットワークの構成等、様々な要素を勘案して総合的に判断してください。
- 投稿日:2021-08-29T13:10:27+09:00
G-cluster の起動動作をシリアルコンソールで見る
@gpioblink ( じぶりん ) さんから G-cluster を送ってもらいました。 G-cluster つないでみた HDMIにつないでみたらこんな画面が出てきました スマートフォン、ゲームパッドで設定するみたいですね。 早速殻割りしてみます。 LEDがいい感じです。 このLEDはGPIOにつながっているのかな? チップ構成 オンボードのチップ: ARM 1176JZF 600MHz CPU SoC CAVIUM PureVu Full-HD Media Processor CNW6611L-600BG324-SCP-G 256MBytes DDR3 16bit SDRAM SAMSUNG K4B2G1646E 128MBytes NAND Flash TOSHIBA TC58NVG0S3ETA00 128kBytes SPI Flash Macronix MX25L1006EMI-10G あと860113 502 130129 とマーキングされた謎WiFiChipがありますが、内部の Linux で lsmod とすると ath6kl_sdio 177554 0 mac80211 205075 0 cfg80211 158436 2 ath6kl_sdio,mac80211 compat 14631 3 ath6kl_sdio,mac80211,cfg80211 と出てくるので、Atheros AR6103とかそこらへんぽいです。 シリアルTTY 以下のようにして接続すると起動ログが取れます。 通信条件:TTY 3.3V レベル、フロー制御なし、8bit、115200bps U-boot に入る 起動すると以下のように U-boot に入ります。 dlink_U-Boot 2011.06 (Jan 16 2013 - 15:22:32) I2C: ready DRAM: 256 MiB SPI Speed at [R:23MHz/W:47MHz] Flash Size: 128KB NAND: 128 MiB MMC: initializing secure environment Bad block table found at page 65472, version 0x01 Bad block table found at page 65408, version 0x01 In: serial Out: serial Err: serial MAC: 00:1a:cc:00:00:01 Hit any key to stop autoboot: 0 CNCl800L> CNCl800L> CNCl800L> CNCl800L> CNCl800L> CNCl800L> G-cluster の起動時にシリアルコンソールから何らかの入力があるとU-boot のコマンドインタプリタに落ちます。 ここから普通に起動するには boots と打ちます。 シリアルコンソールから入力がなければそのまま以下に進みます。 CNCl800L> boots NAND read: device 0 offset 0x1c0000, size 0x20000 131072 bytes read: OK NAND read: device 0 offset 0x180000, size 0x20000 131072 bytes read: OK NAND read: device 0 offset 0x7c80000, size 0x1000 4096 bytes read: OK Processing Application image. NAND read: device 0 offset 0x2400000, size 0x17a0000 24772608 bytes read: OK length 24641536: 376 whole chunks with 0 remainder done! Verifying Image RSA signature... OK. Field Img Authentication passed Check for Blob image... Processing Blob image. NAND read: device 0 offset 0x7c81000, size 0x20000 131072 bytes read: OK Verifying Image RSA signature... OK. AppImg (Blob) authenticated and copied to RAM addr : 0xefff000 ... OK to boot ## Booting kernel from Legacy Image at 08080000 ... Image Name: 240_SDK_gcluster_! Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 24532848 Bytes = 23.4 MiB Load Address: 08080040 Entry Point: 08080040 XIP Kernel Image ... OK OK Starting kernel ... Uncompressing Linux................................................................................................................................................................... done, booting the kernel. �mmc0: Version ID 0x5342230a. mount: mounting tmpfs on /dev/shm failed: No such file or directory ath6kl: temporary war to avoid sdio crc error SI_CecInit SI_CpiInit SI_CpiInit: Writing CEC_OP_ABORT_31 register SI_CpiInit: Setting Logical Address SI_CecInit: looping through ports (5) SI_CecInit: CEC Enabled Returned from SI_CecInit Checking for secure chip and enabling HDCP Creating the main HDMI thread HDMI init! TVCenter : tvout = 406dd474 TVCenter : HDMI not plug HDMISetVideo: timingvideomode = 15, PictureAspectRatio = 1 CECLIB::Physical Address:: 65535 HDMIつなげていないとここで止まります。 この状態で、エンターが通るようになっています。 HDMIをつなげると、先に進みますがUSBをシリアルの反応が無くなってしまします。 それを防ぐため、ここの段階でstty cread と打ち込み、HDMIをつなぎます。 あるいは、HDMIつなげっぱなしでも、コマンドが通るようになるとエンターが反応がでるので、反応が出ている間に stty cread と素早く打ち込みます。 HDMI を刺すと phyAddr === 6461 phyAddr === 6523 phyAddr === 2000 phyAddr === 5dc4 phyAddr === 3e2 phyAddr === 607 AddrTag = 0x57 AddrTag = 0x23 AddrTag = 0x6e AddrTag = 0x67 AddrTag = 0xe2 55555555555555555555555555555555555555555555555555555555555555555555555555 data = 0x0AddrTag = 0xe3 55555555555555555555555555555555555555555555555555555555555555555555555555 data = 0x5AddrTag = 0xe4 55555555555555555555555555555555555555555555555555555555555555555555555555 data = 0xfAddrTag = 0xe3 55555555555555555555555555555555555555555555555555555555555555555555555555 data = 0x6AddrTag = 0x66 --- CEC MSG: opcode 0x32 (set menu language) src=0x0 broadcast=1, args(3): 6A 70 6E CECLIB:: Set Menu Language command received Event Occured TestCecLib:: TV received set menu language = jpn HDMI cable plugged in, plug_check = 1, plugging = 0, pid 0x5e edid_vic_to_edid_timing: WARNING, VIC out of range (93) edid_vic_to_edid_timing: WARNING, VIC out of range (94) . . . . TVCenter : HDMI is switch check begin HDCP Authenticated USB not found ----------------firsrshot---------------------- firstboot: 10, firstboot_flag(1) DSM232:/ # となります。 これで、 Linux シェルが使えます。 Linux マシンとして使うための問題点 HDMIつなげないとブートが進まない 途中で stty cread と打ち込まないとシェルが操作できない これを解決するために、ファームウェアを書き換える方向で考えていきます (続く)
- 投稿日:2021-08-29T11:37:01+09:00
SSH接続で WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!の対処法
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is 初見だとみんなビビるこのエラーに毎回当たるので ここいらでメモ エラー内容 SSHホスト鍵が変わってるよ!って怒られてる 過去にssh接続したサーバーと同じIPに接続しているのに 接続先の公開鍵情報がknown_hostsに書かれている内容と変わっていると出る 前提:known_hostsとは ssh接続を一度でも行なったサーバのホスト鍵(公開鍵と秘密鍵のセット)の情報がknown_hostsというファイルに格納される テキストファイルなのでcatコマンドで確認可能 場所:~/.ssh/known_hosts [host],address 暗号スイート 公開鍵 で記述されている 対処法 known_hostsから情報を削除する $ ssh-keygen -R [接続先ip] 参考 https://l-w-i.net/t/openssh/auth_001.txt
- 投稿日:2021-08-29T01:34:19+09:00
IPアドレスの固定をやろうとしたら/etc/dhcpcd.confがなかった
この記事で説明すること /etc/dhcpcd.confが存在せず、ローカルIPアドレスの固定が出来なかったので、解決法を載せておきます。 ※この記事はネットに落ちている情報等をある程度漁ってもIPアドレスの固定が出来なかった人が見る記事です。 初挑戦の方は丁寧に説明してくれている他の方の記事を参考にしてください。 実行環境 【ハードウェア】 Raspberry pi 4 4GB 【OS】 Raspberry pi OS Lite(32-bit) Release:2020-12-02 解決法 インターフェースの名前→eth0 ラズパイに設定したいIPアドレス→192.168.0.28/24 ルーターのローカルIPアドレス→192.168.0.1 という設定で説明をします。 /etc/network/interfaces というファイルの最後に auto eth0 iface eth0 inet static address 192.168.0.28 //ラズパイに設定したいローカルIPアドレス network 192.168.0.1 //ルーターのローカルIPアドレス netmask 255.255.255.0 //サブネットマスク値 broadcast 192.168.0.255 //ブロードキャストアドレス gateway 192.168.0.1 //ルーターのローカルIPアドレス dns-nameservers 192.168.0.1 //基本はルーターと同じアドレス を追加して再起動してください。 これでもし出来なかったらman interfacesとかで原因を探してみて下さい。 参考 Debianの公式サイト
- 投稿日:2021-08-29T01:29:57+09:00
LinuxでC言語の処理にかかった時間を計測する
実行環境 Raspberry Pi 4 Model B / 4GB Raspberry Pi OS(旧称Raspbian) gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1) ラズパイ4は64bitだがOSは32bit clock関数を用いたコード clock関数は実行した時点までに「プログラムがCPUによって処理された時間(CPU時間)」を返却する関数 clock関数の使い方. #include <time.h> clock_t clock(void); 処理時間を計測したい処理の「開始前」と「終了後」それぞれでclock関数を実行し、 その返却値の差分を求めれば、「2つのclock関数実行の間でプログラムがCPUによって処理された時間を計測」することが出来る。 main.c #include <stdio.h> #include <time.h> int main(void) { clock_t start_clock, end_clock; /* 処理開始前のクロックを取得 */ start_clock = clock(); /* 時間を計測する処理 */ /* 処理終了後のクロックを取得 */ end_clock = clock(); /* 計測時間を表示 */ printf("clock:%f\n", (double)(end_clock - start_clock) / CLOCKS_PER_SEC); return 0; } 単位は実行環境によって異なりますが、「CLOCKS_PER_SEC」で割り算することにより秒単位に変換することができます。小数点未満の数字は秒よりも細かい精度の時間(ms や us など)になります。 参考 https://daeudaeu.com/time_clock/