20210607のLinuxに関する記事は9件です。

Linuxのインストールとパッケージ管理

1 ハードディスクのレイアウト設計 1-1 インストールに必要なパーティション インストール時は最低2つ必要。実際はさらに複数に分ける。 ・実業務で利用する例 名称 説明 c /home 一般ユーザが利用する 3 /var 各種ログやスプール等の更新頻度の高いファイルを保存 6 /usr プログラムやライブラリ、document等 3 /boot システムによってはディスク先頭パーティションとして100MB程度必要な場合がある EFIシステムパーティション UEFIを使った場合に必要 3 スワップ領域 仮想メモリ領域。実メモリと同等~2倍が好ましい /(ルート) 上記以外はルートファイルシステムとなる 1-2 パーティションのレイアウト設計 設計時の留意事項 以下の点に注意  ・システム用途  ・ディスク容量  ・バックアップの方法 例 Webサーバ ディスク 100GB、メモリ4GB  ・スワップ 4GB  ・/boot 100MB  ・/usr 10GB  ・/var 20GB  ・/var/log 50GB(Webサーバのログファイル用)   ・/ 15GB 2 ブートローダのインストール ブートローダ:HDDからOSを読み込み起動するプログラム ・Linuxで代表的なブートローダはGRUBである 2-1 GRUBのインストール ■ GRUBとは ・多機能なブートローダ ・多くのディストリビューションで利用されている ・多数のファイルシステムを認識できる ・シェル機能があり、コマンドによる高度な管理が可能 ・GRUBは2種類ある  ・GRUB Legacy   ・GRUB 2 ・インストールコマンド grub-install 2-2 GRUB Legacyの設定  設定ファイル:/boot/grub/menu.lst  ・設定パラメータ パラメータ 説明 timeout メニュー表示秒数 default デフォルト起動時エントリ番号 title メニューに表示されるタイトル root ルートデバイスの指定 kenel 起動カーネルイメージファイルと起動オプションの指定 makeactive ルートパーティションをアクティブ化 chainloader 指定されたセクタの読み込みと実行 hiddenmune 起動時に選択メニューを表示しない 2-3 GRUB 2の設定  ①設定ファイルの場所:/boot/grub/grub.cfg  ・直接編集は不可  ②/etc/default/grubで設定する     例:cat実行例 [root@localhost ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true ③主要な項目 ・GRUB_DEFAULT=値  ※デフォルト起動するOS ・GRUB_TIMEOUT=秒数 ※起動時の待機時間 ・GRUB_CMDLINE_LINUX="値" ※Linuxカーネル用コマンドライン引数(全カーネル共通指定) ④grub2-mkconfigで実行する  ・実行後「/boot/grub/grub.cfg」が作成される  ・grub2-mkconfigは起動用のファイルを生成するので、取り扱い注意  ↓コマンド例 grub2-mkconfig -o /boot/grub2/grub.cfg 2-4 ブートオプション ブートオプションを指定するには起動時の画面でEキーを押す 以下のメッセージが表示される grub append> ro root=dev/VolGroup00/LogVo100 rhgp quiet オプション例 パラメータ 説明 root=デバイス ルートパーティションとしてマウントするデバイス nosub USBを利用しない single シングルユーザモードで起動する 1~5 指定した欄レベルで起動する  ↓コマンド例 シングルユーザモードで起動する grub append> ro root=dev/VolGroup00/LogVo100 rhgp quiet single 3 共有ライブラリ管理 ライブラリ:よく利用される機能をまとめて他のプログラムから参照できるようにしたプログラムの部品。 3-1 リンクの種類 リンクは2種類ある ・スタティックリンク(静的)  コンパイル時にプログラムに埋め込む ・ダイナミックリンク(動的)  実行時にプログラムが読み込む 3-2 共有ライブラリの確認 ・実行ファイルが必要な共有ライブラリの確認方法 ldd /usr/bin/cat ・指定ライブラリ以外も検索する場合 /lib, /usr/libディレクトリ以外のライブラリを検索する場合は /etc/ld.so.confに記載する ↓リストの例 /usr/lib64/iscsi ・ファイルを確認する vi /etc/ld.so.conf ・ファイル反映は下記コマンドを実行する  コマンド実行により/etc/ld.so.cashe(バイナリファイル)が作成される。 ldconfig ・その他のディレクトリも加える場合は環境変数パスにディレクトリを追加する ↓追加例 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/student/mylib 4 Debianパッケージの管理 パッケージ:実行プログラムや設定ファイル、ドキュメント等をまとめたもの パッケージ管理方式はディストリビューションによって異なる。 代表的なものは以下の2つ ・Deian形式:Debian GNU/Linux等 ・RPM形式:Red Hat Enterprise Linux 4-1 パッケージ管理とは ・パッケージ管理 パッケージの追加や削除、アップデート等変更時にパッケージ間の競合を回避したりする仕組み ・依存関係 パッケージAに含まれるファイルをパッケージBを利用している場合、 パッケージAが無いとパッケージBは利用ができない。 このような関係を依存関係と呼ぶ ・競合関係 パッケージAとパッケージCがパッケージBの同名ファイルを参照する場合に パッケージAはバージョン1をパッケージCはバージョン2を参照する場合 どちらかは正常にインストールできず、競合関係にある。 4-2 Debian形式 dpkgを用いた管理 ・パッケージのファイル名規則 tree_1.6.0-1_i386.deb ①パッケージ名称 ・・ tree_ ②バージョン番号 ・・ 1.6.0- ③Debianリビジョン番号 ・・ 1 ④アーキテクチャ ・・ i386 ⑤拡張子 ・・ deb dpkgコマンド 主なオプション オプション 説明 -E 同バージョンが存在する場合は、インストールしない -G 新バージョンが存在する場合は、インストールしない -R ディレクトリを再帰的に処理する アクション 説明 -i パッケージファイル名 パッケージをインストールする -r パッケージ名 設定ファイルを残してアンインストールする -P パッケージ名 設定ファイルも含めてアンインストールする -I 検索パターン インストール済みパッケージを検索して表示する -S ファイル名検索パターン 指定ファイルが、どのパッケージからインストールされたファイルか表示する -L パッケージ名 指定パッケージからインストールされたファイルを表示する -s パッケージ名 パッケージ情報を表示する --config パッケージ名 展開されたパッケージを構成する --unpack パッケージ名 パッケージを展開する※インストールしない 4-3 apt-getコマンド ・APT(Advanced Packaging Tool) ・依存関係を調整しながらインストール、アップグレード、アンインストールができる ・インターネット経由で最新パッケージの入手や依存関係の解決ができる ・apt-getの書式  apt-get [オプション] サブコマンド パッケージ名 オプション 説明 -d ファイルをダウンロードする(インストールしない) -s システムを変更せず動作をシミュレートする サブコマンド 説明 clean 過去に保持していたパッケージファイルを削除する dist-upgrade システムを最新にアップグレードする install インストールまたはアップグレードする remove アンストールする update パッケージのデータを更新する upgrade システムの全パッケージのうち、他のパッケージを削除しないものをアップグレードする ・リスト apt-getを利用するには以下のリストに対象サイトのURLを記載する /etc/apt/sources.list ・リストの書式 ①deb ②対象URL ③distribution ④component ①deb  ・deb:パッケージを取得  ・deb-src:ソースを取得 ②対象URL ③distribution(バージョン名) ④component  以下のような阿合  main:公式ソフト  restricte:デバイス用プロプライエタリなドライバ  universe:コミニティでサポートされるソフト  multiverse:著作権や法的な問題で制限されたソフト  contrib:フリーではない依存関係のあるソフト  non-free:利用と改変に制限のあるソフト ・最新のパッケージ情報を取得する apt-get update ・アンイストール apt-get remove ソフト名 ・一括でアップデート apt-get dist-upgrade ・削除を伴わない一括アップデート dist-upgradeは重要性の高いパッケージをインストールするため既存パッケージを削除することがある。 削除しないときは以下を利用する apt-get upgrade 4-4 apt-cacheコマンド パッケージ情報を照会・検索する。 インストールせず実行できる。  書式: apt-cache サブコマンド サブコマンド 説明 search キーワード 指定キーワードで検索 show パッケージ名 一般情報を表示 showpkg 詳細情報を表示 depends パッケージ名 指定したパッケージの依存関係を表示  aptコマンド apt-getとapt-cacheを合わせたようなもの  書式:apt [オプション] サブコマンド 参考サイト 履歴 2021/6/7 作成
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RiderとSelenium

Chromeで動作させる Chromeをインストールする Nugetからインストール Install-Package Selenium.WebDriver Install-Package Selenium.WebDriver.ChromeDriver using System; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var chrome = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); chrome.Url = "http://google.com/"; //特定のURLを開いて待機する Console.ReadKey(); chrome.Quit(); } } } Chrominumで動作させる Chromeをアンインストールする Chrominumをインストールする ChromeDriverをインストールする ChromeをアンインストールしないとChrominumが立ち上がらないです。 Nugetからインストール Install-Package Selenium.WebDriver Install-Package Selenium.WebDriver.ChromeDriver Chrominumとドライバをインストールする $ sudo apt-get update $ sudo apt-get install chromium-browser $ sudo apt-get install chromium-chromedriver $ chromium-browser --version $ chromedriver --version # 日本語フォントをインストールする $ sudo apt-get install fonts-ipafont-gothic fonts-ipafont-mincho 参考 chromedriverのインストールされた場所を調べる $ which chromium-browser $ which chromedriver chromedriverは/usr/bin/chromedriverにインストールされます。 C# ChromeDriver関数にパスを指定する。ここでは「/usr/bin/」を指定する var driver = new ChromeDriver("/usr/bin/"); using System; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Firefox; namespace SeleniumConsoleApp { class Program { static void _mkFireFox() { IWebDriver driver =new FirefoxDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); driver.Navigate().GoToUrl("https://www.google.com/?hl=ja"); //特定のURLを開いて待機する Console.ReadKey(); driver.Quit(); } static void _mkChromnimu() { var driver = new ChromeDriver("/usr/bin/"); driver.Navigate().GoToUrl("https://www.google.com/?hl=ja"); //特定のURLを開いて待機する Console.ReadKey(); driver.Quit(); } static void Main(string[] args) { _mkFireFox(); _mkChromnimu(); } } } FireFoxで動作させる FireFoxをインストールする GeckoDriverをNugetからインストールする Nugetからインストール Install-Package Selenium.WebDriver Install-Package Selenium.WebDriver.GeckoDriver 上記のプログラムで動作します。 ユーザープロファイルの保存指定する 引数 内容 –user-data-dir ユーザープロファイルの保存先を指定 –profile-directory 使用するユーザープロファイルを指定 引数を指定しない場合 –user-data-dirを指定しない場合 プロファイルは一時ファイルとして作成され、Chrome終了後に廃棄されます。 –profile-directoryを指定しない場合 ユーザープロファイルは–user-data-dirで指定したフォルダ内のデフォルトのプロファイル(通常はDefault)を使用します。 指定したフォルダが存在しない場合 –user-data-dir、–profile-directoryに指定したフォルダが存在しない場合は、自動でフォルダが作成されます(Windows環境でのみ確認)ので、タイプミスに注意しましょう。 using System; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace example { class Program { static void Main(string[] args) { ChromeOptions options = new ChromeOptions(); options.AddArgument("--user-data-dir=D:\\tmp\\User Data"); options.AddArgument("--profile-directory=Profile1"); options.AddArgument("--lang=en"); String path = @"D:\tmp\driver\chromedriver_win32"; //フォルダを指定 IWebDriver driver = new ChromeDriver(path, options); driver.Navigate().GoToUrl("chrome://version"); Console.ReadKey(); driver.Quit(); } } } 参考 プラウザを開いた後、非同期で待機状態にする プラウザを開いた後、GTKアプリ側で処理をしたい場合は非同期で待機状態にします。 Selenium.Support.UIのWebDriverWaitを使います。 using System; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var chrome = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)); chrome.Url = "http://google.com/"; WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); } } } Gtk3アプリ RiderとWebViewに続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Arch Linux で 蒸気機関車に出会った話(小ネタ)

初めに ファイル情報を表示する「lsコマンド」。 これを間違えて「sl」と入力したときの小話です。 蒸気機関車に出会った流れ 「どんなファイルがあったかな~」 $ sl 「???」 「画面が暗くなった...」 「!?!?!?」 「列車が右から左に...流れていった...」 「なんだこれは...?」 slコマンド 1970年代前後の「sl」コマンドのないコンピュータを想像してください。 「ls」を「sl」とミスタイプすることにより、コンピュータは「sl」コマンドを探し求めます。 当時のコンピュータは処理能力が乏しく、処理に時間がかかり、作業が停滞してしまうことがあったそうです。 これを防ぐために「sl」コマンドというダミープログラムを用意する必要があったそうです。 現代では、コンピュータの処理能力が上昇した結果、「sl」コマンドが不必要となり、ジョークプログラムとして知られるようになりました。 オプション 他のコマンドと同じようにオプションもあります。 文字 説明 -l 細長いSLが走る -a 車内の客が「HELP!」と叫んでいる -F 空(画面の上のほう)へ飛んでゆく 最後に 本当に偶然出会ったので「何事か」と思いました。 他にも多くのジョークプログラムが存在しているらしいので、調べると面白いかもしれませんね。 参考 Wikipedia:sl (UNIX)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

遠隔でJetsonの管理を実現する方法

はじめに 前回の投稿でご紹介させて頂いたOTAについて、皆様はご理解頂けましたでしょうか。 早速ですが、今回はAllxon DMSを利用して、NVIDIA Jetsonの遠隔管理を、 3つのステップに分けてご紹介していきたいと思います。 今ご登録して頂く方には30日間無料のお試しプランがついております。 使い方もとても簡単ですので、ぜひ最後まで見て頂けたら嬉しいです。 Allxon DMSについて Allxon Device Management Solutions (Allxon DMS) は、 多数のデバイスを容易に一元管理できるサービスです。 SIer企業及びサービスプロバイダ企業に対して、 シンプルにナビゲートしやすいデバイス管理サービスを提供します。 事業部をまたぐ多用なデバイス管理すらもひとつのAllxonアカウントから実行できるため、 デバイス上の問題解決のみならず、人件費と運用コストの大幅削減にも実現可能です。 手順の流れ Step1.アカウント申請 Step2.デバイス登録 Step3.利用開始 Step1.アカウント申請 サインアップ ①サインアップページにアクセスをする ②“メールアドレス” を入力したら“アカウント作成”をクリックする Step2.デバイス登録 ①Linux環境にAllxon DMS エージェントをインストールをする、 ターミナルで下記のコマンドを入力してください。コマンドを実行すると、 Allxon DMS エージェントおよび関連パッケージが自動でインストールされます。 ②Allxon DMS にサインインしたら、左側のナビゲーションパネルの、 [デバイス]をクリックしてデバイス登録画面へ移動します。 ③“追加” をクリックして指示に従いデバイスを追加します。 詳しい操作について、こちらの動画をご覧になってください。 ④デバイスが正常に登録できたら、 アカウント内に登録され、[デバイスリスト]のページにオンラインしたデバイスが表示されます。 Step3.利用開始 アカウント申請及びデバイスの登録が完了できましたら、 デバイスのマネジメント操作が開始可能になります。 まずOSのリーブートから始めてみましょう! 終わりに さて、Allxon DMSに対してより理解できましたでしょうか。 質問やIoTについて今後こういうことをもっと詳しく知りたい!などがあれば、 下のコメント欄に意見を頂ければ嬉しいです。 次回はAllxon DMSのログ収集、アラート通知機能などをご紹介致します。 ぜひ、楽しみにしてください!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LinuxにPowershellインストール方法について

はじめに Powershell をインストールするには、以下の各ディストロの手順を参照してください。 RHEL8 curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo sudo dnf install -y powershell pwsh RHEL7 curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo sudo dnf install -y powershell pwsh Ubuntu 20.04 wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo add-apt-repository universe sudo apt-get install -y powershell pwsh Ubuntu 18.04 wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get update sudo add-apt-repository universe sudo apt-get install -y powershell pwsh Azure Powershellモジュール 次に、PowershellからAzure Powershellモジュールをインストールします: PS > Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force Docker または、Docker が使用されている場合は、Azure Powershell のコンテナーを使用することもできます: docker run -it mcr.microsoft.com/azure-powershell pwsh 終わりに Azure Powershellをインストールした後、Connect-AzAccount -UseDeviceAuthenticationでログインしすると、Azureのコマンドを使うことができます。例えばGet-AzVMを使って見てください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

replaceコマンドを用意しよう

はじめに PHPerにはsedの正規表現は性に合わないから最近はどのOSにもPerl入ってるってことで、ファイルの文字列置換にはperlを使うんですが、いつもオプションを忘れて毎回ググってるんですよね。。 ってことでreplaceをaliasに登録しておきましょう。 ~/.bash_profile(.zprofile) alias replace='perl -pi -e' 実行例 replace 's/localhost/db/g' config/database.yml おわりに Windowsにはreplaceコマンドってのがあったんですね。使ったことないけど。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OS初学者の学習記録 〜3. プロセス(その2)〜

プロセス間通信 OSには複数プロセス間で、動作の指示や動作完了の通知などの連携が必要になる。 シグナルによる通信 プロセス間で非同期イベントの発生を伝えるための方法。 プログラマは、「シグナルハンドラ」という処理ルーチンをプロセスに設定できる。 →シグナルハンドラが設定されていないプロセスに関しては、シグナルのデフォルトの処理が行われる。 シグナルハンドラは、実行中の処理に割り込んで仕事をするので、実行中の処理に副作用が起こる可能性があることに注意する。 共有メモリによる通信 プロセスにはそれぞれに独立した固有のメモリ領域を確保し、プロセスがあらかじめ共有されたキーを指定すれば、共有できるようになる。 メリット データの転送は、物理的には1つの領域への書き込み&読み出しで行われるため、メモリの無駄がない。 プロセス固有のメモリにアクセスする必要がないので、大量のデータであっても高速にやり取りできる。 デメリット 共有をおこなう各プロセスは、同じ計算機上で動作しないといけない。(プロセスのメモリ空間と共有メモリの間のmappingがおこなれるから) パイプによる通信 UNIX系のOSに実装されている通信方法で、「複数のプログラムの入出力をつなぐ」仕組み。(linuxで「|」でつなぐやつですね、これは僕でも知ってました笑) 書き込み用のパイプと、読み出し用のパイプを、複数のプロセスが持つことで「FIFO(first in first out)」のストリームを共有し、協調的な動作を行う。(「書き込んだ順番で読み出す」ようにしている!) ソケットによる通信 遠隔マシン上の複数プロセス間での通信をおこなう仕組み。(UNIX系で実装) どこらのソケットを利用するかは、アプリケーションの要件に合わせて決定。 TCP / IP プロトコル FIFOの動作が保証される。 UDP プロトコル FIFOが保証されない。また、データの到達確認等を行わないので、高速にデータをやりとりできるが、欠落する可能性もある。 競合状態と相互排他 複数のプロセスが資源を共有して処理をすすめるとき、その共有資源が不整合を起こさないように制御する機能がOSには必要になる。 競合状態 2つまたはそれ以上のプロセスが、共有データを読み書きしているとき、最終結果がプロセスの切り替えや順序に依存してしまう状態。 相互排他 共有資源を「1つのプロセスが独占」して利用する権利をもたせるための機能。 きわどい領域 共有資源にアクセスし、競合を起こす可能性があるプログラムの部分を「きわどい領域」という。 →きわどい領域に入って処理ができるのは1つのプロセスのみ、という実装をすれば相互排他を実現できる。 ビジーウェイト 共通の「ロック変数」を準備する。 きわどい領域に入る前に、ロック変数をロック状態にしてから処理に入る。(他のプロセスは、逐次ロック変数を参照して、解除されていないかを確認し続ける。これが「ビジー」の由来?) きわどい領域を出たら、ロック状態を解除する。 セマフォ あるプロセスがきわどい領域に入るときに、他のプロセスが存在する場合 →他のプロセスを動かすには、当該プロセスを待ち状態にすればよい。 セマフォには、downとupの2種類のメソッドがある。 down セマフォの値が0より大きいかを調べる。 0より大きいとき、値を1減らして次の処理を継続する。 0ならば、値を減らす前にプロセスを待ち状態にして、スリープさせる。 up セマフォの値を1増加させる。 このとき、1つ以上のプロセスがスリープしていれば乱数などでどれか1つ選んで、スリープを解除する。(ウェイクアップ) すなわち、down操作が継続される。 モニタ 特別に定義された関数、変数データ構造の集合。 モニタとして定義された関数は、「1つのプロセスしか」実行することができない。 プログラマは、きわどい領域にあたる関数をモニタとして定義して実装する。 →プログラマがロックとアンロックを明示的に記述しなければならないときに比べると、楽だしミスが生じにくい。 複数プロセスの問題 プロデューサ・コンシューマー問題 「プロデューサー(生産者)」と「コンシューマー(消費者)」の2プロセスにおいての問題。 それぞれ固定長のバッファを固定メモリとして持つ プロデューサーはデータを生成し、バッファに追加する コンシューマーは、バッファからデータを取り出し、バッファ城のデータを1つずつ順に消去していく ↓ プロデューサーは、バッファが全て使われた状態の時、データの生成を中止する(スリープ) コンシューマーは、バッファが空のとき、データの取り出しを中止する(スリープ) プロデューサーがデータを追加したとき、コンシューマーがスリープしているなら、ウェイクアップさせる。 この問題を解決する方法は、「カウンティングセマフォ」を利用する方法。(準備中) リーダ・ライタ問題 複数プロセスの並列性に関する例。 「メモリからデータを読み出すプロセス(リーダ)」と「メモリにデータを書き込むプロセス(ライタ)」が混在しているとき、 複数のリーダが、同時にデータを読み出すことはできる あるライタがデータを書き込んでいる最中は、更新途中のデータが消えないようにリーダは読み出しができないようにする ↓ ライタは、データの書き込みに際して、ロックとアンロックをする必要がある。 リーダは最初のリーダのみが読み出し時にロックされる。 2つ目以降のリーダは、最初のリーダがすでにロックされているのでロックしない、という実装ができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux基礎学習まとめ① 基本コマンド(cd, ls, mkdir, rm, cat, etc.)

概要 皆様、初めまして。 Webエンジニアを目指すにあたり、雑食系エンジニアのYouTuberとしても活動されているKENTAという方が発信してくださっている動画を拝見しました。 また、たくさんの方がQiitaやnoteにエンジニアを目指すためのロードマップとして、「Linuxの基礎を勉強するべき」とおっしゃっていました。 私自身、ネットワーク周りやファイル管理などの知識に疎く、プログラミング学習だけでは成長できないと考え、Linuxの基礎から勉強していくことにしました。 そこで、私が勉強したことをここにアウトプットして、自分だけでなく勉強を始めたばかりの方々の知識のインデックスにしたいと思います。 記事初投稿になるので、至らぬ点はご容赦ください。 実行環境 macOS BigSur 11.4 CentOS7 (macOS上でLinux環境を構築する方法はこちらを参考にしました) 基本のコマンド 私個人的に便利でよく使うな〜と思うコマンドをいくつかピックアップしました。 1. ls (ファイル参照) 書式 $ ls [option] よく使うオプション -a : 隠しファイルやディレクトリまで全て表示 -l : データサイズや権限などを詳細表示 -R : カレントディレクトリ以下の全階層のファイル、ディレクトリを表示 2. cd (ディレクトリ移動)、 pwd (カレントディレクトリ確認) 書式 $ cd [target_directory] 相対参照(ex. cd ../dir)や絶対参照(ex. cd /etc/)は覚えておくと非常に便利。 現在の作業ディレクトリを確認するコマンドpwdと合わせて覚えておくとなおよし。 3. mkdir (ディレクトリの作成) 新規ディレクトリを作成するコマンド 書式 $ mkdir [new_dirname] 4. rm (削除コマンド) 書式 $ diff [option] [file1] [file2] よく使うオプション -r : ディレクトリまで含めて削除 -f : 強制削除 基本このオプションつけて作業してた。 本当は -i オプションをつけて確認したほうが安全。 5. touch (ファイル作成、タイムスタンプ変更等) 書式 $ touch [filename] 指定したファイル名のファイルが存在しない場合、指定した名前で新しくファイルを作ってくれるので、適当なテストファイルとかを作成する際に便利。 6. cat >, >> (catコマンドを用いたリダイレクト) 書式 $ cat > [filename] $ cat >> [filename] コマンドの挙動確認のために標準入力の内容をそのままファイルに格納し、テストファイルを作成する。 Ctrl + D で標準入力を終了する。 >で新規作成、>>で追記。 各種コマンド実行後に、その標準出力結果を新規ファイルに保存するときなどにも使える。 7. tail (ファイルの終わりを標準出力) 書式 $ tail [option] [filename] -f オプションについて ファイルの終わり部分を標準出力するコマンドだが、-f オプションをつけることによって、ファイルを動的に読み込むことができる。  Ctrl + Cを押すまでシェルに制御が戻らない。  Webサーバーのアクセスログやエラーログを見る場合に使えそう(その辺りはまだ勉強中)。 8. sort (ソート) 書式 $ sort [option] [filename] ファイル内容を列の内容に応じてソートするコマンド。 オプションの付け方で様々なソートが可能(アルファベット降順、数値昇順など) よく使うオプション -k : ソートする列数をnで指定する -n : n列目の数字を文字列ではなく数値としてソートする(100, 70, 20みたいな時に文字列だとうまくソートできない) 9. diff (差分比較) 書式 $ diff [option] [file1] [file2] 二つのファイルの差分を比較するコマンド よく使う(と思われる)オプション - -u : わかる人にはわかる見覚えのある差分表示になる。普通にこのオプションつけたほうが見やすいと思う。 参考文献 この記事は以下の情報を参考にして執筆しました。 - Linux標準教科書(ver.3.0.2)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nsenter で Linux namespace に触れる

namespace を一覧化する lsnsで namespace の一覧を見ることができます。コンテナで bash を実行するコンテナを作った状態でlsnsを実行した結果が以下です。複数の TYPE の namespace ができていることがわかります。 # lsns -o NS,TYPE,PATH,NPROCS,PID,PPID,COMMAND,UID,USER NS TYPE PATH NPROCS PID PPID COMMAND UID USER 4026531835 cgroup /proc/1/ns/cgroup 126 1 0 /sbin/init 0 root 4026531836 pid /proc/1/ns/pid 124 1 0 /sbin/init 0 root 4026531837 user /proc/1/ns/user 126 1 0 /sbin/init 0 root 4026531838 uts /proc/1/ns/uts 124 1 0 /sbin/init 0 root 4026531839 ipc /proc/1/ns/ipc 124 1 0 /sbin/init 0 root 4026531840 mnt /proc/1/ns/mnt 120 1 0 /sbin/init 0 root 4026531861 mnt /proc/19/ns/mnt 1 19 2 kdevtmpfs 0 root 4026531993 net /proc/1/ns/net 124 1 0 /sbin/init 0 root 4026532157 mnt /proc/446/ns/mnt 1 446 1 /lib/systemd/systemd-udevd 0 root 4026532167 mnt /proc/490/ns/mnt 1 490 1 /lib/systemd/systemd-networkd 100 systemd-network 4026532168 mnt /proc/518/ns/mnt 1 518 1 /lib/systemd/systemd-resolved 101 systemd-resolve 4026532193 mnt /proc/27142/ns/mnt 2 27142 27104 bash 0 root 4026532194 uts /proc/27142/ns/uts 2 27142 27104 bash 0 root 4026532195 ipc /proc/27142/ns/ipc 2 27142 27104 bash 0 root 4026532196 pid /proc/27142/ns/pid 2 27142 27104 bash 0 root 4026532198 net /proc/27142/ns/net 2 27142 27104 bash 0 root コンテナ内で動いているプロセスの PID(この例では、27142) がlsnsと一致していることがわかります。 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ef0425afad12 nicolaka/netshoot "bash" 54 minutes ago Up 54 minutes vigilant_hopper # docker inspect --format {{.State.Pid}} ef0425afad12 27142 namespace に入る nsenterコマンドを使うと namespace の中に入ってコマンドを実行することができて便利です。例えば、コンテナ内には netstat コマンドが入っていないけれど、実行したい時は以下のように、--target PIDで対象プロセスを指定します。network namespace に入る場合は、--net指定します。 # nsenter --target 27142 --net netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 172.17.0.2:53400 172.217.175.238:80 TIME_WAIT --mountを指定すると mount namespace になります。--allで全てのタイプの namespace に入ります。 # nsenter --target 27142 --all cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.13.2 PRETTY_NAME="Alpine Linux v3.13" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://bugs.alpinelinux.org/" ネットワークの階層モデルと namespace namespace の影響受けるもの netstatコマンドは namespace によって見える範囲が変わります。例えば、コンテナ内から curl http://google.com/ を実行した直後の状態です。 # nsenter --target 27142 --all netstat -ant | grep 80 tcp 0 0 172.17.0.2:34148 216.58.197.206:80 TIME_WAIT # netstat -ant | grep 80 # 何も表示されない arpコマンドも同様です。 # nsenter --target 27142 --all arp ? (172.17.0.1) at 02:42:b0:b9:9b:50 [ether] on eth0 # arp Address HWtype HWaddress Flags Mask Iface 172.17.0.2 ether 02:42:ac:11:00:02 C docker0 10.0.2.3 ether 52:54:00:12:35:03 C eth0 _gateway ether 52:54:00:12:35:02 C eth0 namespace の影響受けないもの 一方、tcpdump コマンドは namespace の影響受けません。コンテナ内から curl http://google.com/ を実行した時の結果です。tcpdumpはより低レイヤー(データリンク層 L2)の情報を取得するからのようです。 # コンテナ内部で tcpdump を実行した結果 13:19:41.076077 IP a8c89c57d8ef.40442 > nrt12s36-in-f14.1e100.net.80: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1 # コンテナ外部で tcpdump を実行した結果 13:19:41.076207 IP vagrant.40442 > nrt12s36-in-f14.1e100.net.http: Flags [P.], seq 0:74, ack 1, win 64240, length 74: HTTP: GET / HTTP/1.1 コンテナ外部で iptraf-ng を使うと、コンテナ内から張った TCP コネクションを一覧化することが出来て便利です。 参考 https://qiita.com/minamijoyo/items/9dd59109e9fe1a35f888 https://github.com/nicolaka/netshoot
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む