20200520のLinuxに関する記事は11件です。

curl, wget で Response Header だけ取得する

用途

インターネットへの疎通確認をしたい時など、
レスポンスヘッダーだけ欲しい時に。

curl

curl --head https://www.google.com

wget

wget -q -S -O - https://www.google.com > /dev/null

-q, --quiet : quiet (no output)
-S, --server-response : print server response
-O, --output-document=FILE : write documents to FILE

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Software emulation of deprecated SWP instruction (CONFIG_SWP_EMULATE)

https://www.kernel.org/doc/html/latest/arm/swp_emulation.html

Software emulation of deprecated SWP instruction (CONFIG_SWP_EMULATE)

ARMv6 architecture deprecates use of the SWP/SWPB instructions, and recommeds moving to the load-locked/store-conditional instructions LDREX and STREX.

ARMv6 architecture では、SWP/SWPB命令の利用が廃止されていて、load-locked/store-conditional 命令としては、LDREX/STREXを使うことが推奨されている。

ARMv7 multiprocessing extensions introduce the ability to disable these instructions, triggering an undefined instruction exception when executed. Trapped instructions are emulated using an LDREX/STREX or LDREXB/STREXB sequence. If a memory access fault (an abort) occurs, a segmentation fault is signalled to the triggering process.

ARMv7マルチプロセッシング拡張機能は、これらの命令を無効にする機能を導入し、実行時に未定義命令例外をトリガーします。 トラップされた命令では、LDREX/STREX、または、LDREXV/STREXBシーケンスを用いて、エミュレーションされます。もし、memory access fault (an abort)が発生した場合、セグメンテーションエラーが、トリガープロセスに伝達されます。

/proc/cpu/swp_emulation holds some statistics/information, including the PID of the last process to trigger the emulation to be invocated. For example:

/proc/cpu/swp_emulationには、呼び出されるエミュレーションをトリガーする最後のプロセスのPIDを含む、いくつかの統計的/情報が保持されています。例えば:

Emulated SWP:         12
Emulated SWPB:                0
Aborted SWP{B}:               1
Last process:         314

NOTE:

when accessing uncached shared regions, LDREX/STREX rely on an external transaction monitoring block called a global monitor to maintain update atomicity.

キャッシュされていない共有領域にアクセスするとき、LDREX/STREXは、更新の原子性を維持するために、グローバルモニターと呼ばれる外部トランザクション監視ブロックに依存します。

If your system does not implement a global monitor, this option can cause programs that perform SWP operations to uncached memory to deadlock, as the STREX operation will always fail.

システムがグローバルモニターを実装していない場合、STREX操作は常に失敗するため、キャッシュされていないメモリに対してSWP操作を実行するプログラムがこのオプションによってデッドロックする可能性があります。


もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる(はずの認識)。

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

arm/swp_emulation.html

https://www.kernel.org/doc/html/latest/arm/swp_emulation.html

Software emulation of deprecated SWP instruction (CONFIG_SWP_EMULATE)

ARMv6 architecture deprecates use of the SWP/SWPB instructions, and recommeds moving to the load-locked/store-conditional instructions LDREX and STREX.

ARMv6 architecture では、SWP/SWPB命令の利用が廃止されていて、load-locked/store-conditional 命令としては、LDREX/STREXを使うことが推奨されている。

ARMv7 multiprocessing extensions introduce the ability to disable these instructions, triggering an undefined instruction exception when executed. Trapped instructions are emulated using an LDREX/STREX or LDREXB/STREXB sequence. If a memory access fault (an abort) occurs, a segmentation fault is signalled to the triggering process.

ARMv7マルチプロセッシング拡張機能は、これらの命令を無効にする機能を導入し、実行時に未定義命令例外をトリガーします。 トラップされた命令では、LDREX/STREX、または、LDREXV/STREXBシーケンスを用いて、エミュレーションされます。もし、memory access fault (an abort)が発生した場合、セグメンテーションエラーが、トリガープロセスに伝達されます。

/proc/cpu/swp_emulation holds some statistics/information, including the PID of the last process to trigger the emulation to be invocated. For example:

/proc/cpu/swp_emulationには、呼び出されるエミュレーションをトリガーする最後のプロセスのPIDを含む、いくつかの統計的/情報が保持されています。例えば:

Emulated SWP:         12
Emulated SWPB:                0
Aborted SWP{B}:               1
Last process:         314

NOTE:

when accessing uncached shared regions, LDREX/STREX rely on an external transaction monitoring block called a global monitor to maintain update atomicity.

キャッシュされていない共有領域にアクセスするとき、LDREX/STREXは、更新の原子性を維持するために、グローバルモニターと呼ばれる外部トランザクション監視ブロックに依存します。

If your system does not implement a global monitor, this option can cause programs that perform SWP operations to uncached memory to deadlock, as the STREX operation will always fail.

システムがグローバルモニターを実装していない場合、STREX操作は常に失敗するため、キャッシュされていないメモリに対してSWP操作を実行するプログラムがこのオプションによってデッドロックする可能性があります。


もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる(はずの認識)。

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作Linuxを作る方法

概要

最近twitterの方で自作Linuxが流行っているようです。中には作ってみたいけどやり方が...
という人も多いのではないのでしょうか?
そこで自作Linuxの作り方をまとめてみました

ubuntuベース

作るのに必要なもの一式揃っていてさらに丁寧すぎるガイドまで付いている SereneLinux for Customize を使うのが一番ラクです
https://blog.fascode.net/2020/03/16/serenelinux-for-customize%e3%81%ae%e3%81%99%e3%82%9d%e3%82%81/

Pinguy builderなどを使用して自分で構築したい場合は私が書いた記事もぜひ参考にどうぞ
https://qiita.com/Nexryai/items/3a2d722dd869ed55d6cd

debianベース

これに関しては少し複雑です。mksquashfsコマンドを使用する方法があるようですが良くわかりません(そのうち調べて書きます)

arch linuxベース

Arch isoという純正ツールを使って構築するようですがあまりにも難しいので推奨しません。代わりにFascodeさんが公開しているAlter isoを使うことをオヌヌメします。

https://blog.fascode.net/2020/04/17/build-alterlinux/#toc8
https://blog.fascode.net/2020/04/22/alteriso-2/
https://blog.fascode.net/2020/04/27/alteriso-3/

結論

ubuntuベースの自作Linuxは意外と楽です。upper linux (https://caramelos.xyz/other/upper/) のような自作Linuxのためのディストリビューションもあるので試してみると良いでしょう。例によって誤字ってる箇所があればtwitter等で叩いてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

はじめてのWSLとrubyをインストールする

WSL (Windows Subsystem for Linux)

Windows上でLinuxを動かすことができる(詳細は他記事に譲る)
- Linuxカーネルが動作するLinux環境
- Ubuntuの種類が3種類ほどあるので、今回はUbuntuを使う

DockerやVirtualBoxなどは多少触ったことありますが、勉強がてら使ってみます。

Ruby install

まずはUpdate。最初に実行しましょう!

$ sudo apt-get update

Get rbenv

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

Set Path

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

Get install Command

$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ sudo apt install build-essential

Install Ruby

$ rbenv install 2.7.1
Downloading ruby-2.7.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.1.tar.bz2
Installing ruby-2.7.1...


BUILD FAILED (Ubuntu 20.04 using ruby-build 20200519)

Inspect or clean up the working tree at /tmp/ruby-build.20200520163201.5902.R4jqnb
Results logged to /tmp/ruby-build.20200520163201.5902.log

Last 10 log lines:
        from ./tool/rbinstall.rb:846:in `block (2 levels) in install_default_gem'
        from ./tool/rbinstall.rb:279:in `open_for_install'
        from ./tool/rbinstall.rb:845:in `block in install_default_gem'
        from ./tool/rbinstall.rb:835:in `each'
        from ./tool/rbinstall.rb:835:in `install_default_gem'
        from ./tool/rbinstall.rb:799:in `block in <main>'
        from ./tool/rbinstall.rb:950:in `block in <main>'
        from ./tool/rbinstall.rb:947:in `each'
        from ./tool/rbinstall.rb:947:in `<main>'
make: *** [uncommon.mk:373: do-install-all] Error 1

ログファイルを見ると、opensslがないためインストールする

$ sudo apt-get install openssl

引き続き検証しながら、完結したら続き更新します

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LPIC201-要点整理

LPIC-level1を先週取得したので、続けてlevel2を受験する。そのため試験範囲の要点を下記にまとめる。

1. キャパシティプランニング

リソース使用率

  • top
    • 総合的に見れる
  • vmstat
    • メモリ/仮想メモリの状態
    • vmstat 5 3 (5秒毎に3回出力)
    • r -> 実行待ちプロセス数
    • b -> 割り込み不可プロセス数(0が好ましい)
    • wa -> cpuのIO待ち時間
    • buff/cache -> バッファキャッシュ/ページキャッシュ(多くても問題ない)
  • iostat
  • iotop
    • topっぽくI/Oを見る プロセス毎のIO情報
  • sar
    • system activity report -> システム統計のレポート、多機能
    • sar -b -f /var/log/sa/saXX -> XX日のレポートを表示
  • sadf
    • different format -> sadcのログをCSV, TSV, XMLなどで出力(trと組み合わせるなど)
  • uptime
  • w
    • ログイン中ユーザー、プロセスがわかる
  • ps
  • pstree
  • lsof
    • プロセス、ポートの状態
  • free
    • メモリとスワップ
    • freeが少なくてもcacheが大きければ問題ない
    • /proc/meminfo -> 詳細なメモリ情報
  • df
    • ファイルシステム毎、ディスクの使用量が分かりやすい
  • netstat
  • ss
    • netstatの代替で、ほぼ同じ
  • netserver
    • サーバー側
  • netperf
    • クライアント側
  • iptraf
    • トラフィックをモニター

リソース監視ツール(覚えられません)

  • collected
  • Nagios
  • MRTG
    • Traffic Grapherなのでトラフィックをグラフ化してくれる
  • Cacti
  • Icinga2

その他リソース管理に関して

  • 特定のパーティションにIO集中でボトルネック -> そこだけ高速なストレージに変えてみる
  • カーネルの再構築/カーネルパラメータを調整する
  • swapon -s -> スワップについて確認してみる(/proc/swaps)

2. Linuxカーネル

バージョン

  • 4.9-rc1 -> rcはRelease Candidate(開発版)
  • バージョンの確認方法 ①uname -r ②/proc/versionファイル ③Makefileを見る

カーネルイメージ

カーネルモジュール

  • カーネルから一部機能を切り離しモジュール化(.ko) -> カーネルがコンパクトになり起動時間やメモリを節約
  • lsmod
    • /proc/modulesと同じ
  • modinfo
  • insmod
  • rmmod
  • modprobe
    • 依存関係を解決しながらロード/アンロードしてくれる
    • depmod -> modules.depファイル(モジュール1.ko: モジュール2.ko モジュール3.ko)
    • 前処理やエイリアス付けたい -> /etc/modprobe.conf or /etc/modprove.d/ファイルで設定しておく
    • ex. alias eth0 r7257
    • kmod -> カーネルの機能で、モジュールが必要になったら自動でロードしてくれる

カーネルのコンパイル

  • ソースコード -> /usr/srcらへん
  • バージョンアップの方法 -> ①cp /boot/congig...x86-64 .config (前設定ファイルを.configにコピー) -> ②make oldconfig
  • カーネルの設定 -> make menuconfig
  • コンパイル -> make
  • カーネルモジュールとカーネルのインストール -> make modules_install -> make install
  • /bootにイメージができてるのでデフォルトのカーネルにしておく
  • DKMS -> Dynamic Kernel Module Support(サードパーティのカーネルモジュールを自動的にビルドしてくれる)
  • make clean make mrproper

カーネルパラメータ(/proc/sys/)

  • sysctl [-w] net.ipv4.ip_forward=1(再起動で消える) / /etc/sysctl.confに書く(永続)

初期RAMディスク

  • initrd / initramfs(cpioアーカイブ + 圧縮)
  • 初期RAMディスクの作成 -> mkinitrd / mkinitramfs
  • 最新のCentOS -> dracutコマンドでinitramfsが/boot以下に作成できる

カーネルの管理と問題解決

  • lsdev
  • lspci
    • lspci -s 2:0 -> 2番バス、0番スロット
  • lsusb
  • ブロックデバイス -> b/ブロック単位/ランダムアクセス/HDD, RAMディスク, RAIDボリュームなど
  • キャラクターデバイス -> c/キャラクタ単位/ランダム不可/キーボード, マウス, 端末など
  • カーネルが認識しているデバイスが見たい -> /proc/devices
  • udev/sysfs -> /etc/udev/rules.d/60-raw.rulesなど
  • sysfsがどのようにデバイスを扱っているか -> udevadm infoで確認(識別に使う)
  • rulesファイルの識別キー=値にマッチ -> 指定したルールでデバイスファイルが作成される
  • デバイスの検知をモニタリング -> udevadm monitor

3.システムの起動

起動プロセス

  • BIOS/UEFI
  • ->MBR(ブートローダの一部 + パーティションテーブル)/GPT
  • ->MBRのブートローダが二段階目のブートローダを起動
  • ->指定されたパーティションからカーネルをロード
  • -> ルートパーティションのマウント、/sbin/initの起動

SysVinit

  • initが /etc/inittab を読み込む
  • -> /etc/rc[0-6].d/S85httpdなど
  • -> ログインプロセス起動して終了
  • chkconfig
  • update-rc.d
  • insserv

systemd

  • Unit(service/device/mount/swap/target) = 処理単位
  • 最初に /etc/systemd/system/defalt.target Unitが処理される
  • -> /lib/systemd/system/XX.targetへのシンボリックリンクになっている
  • 稼働しているサービスの確認 -> systemctl list-units --type=○○
  • /etc/systemd/system/multi-user.target.wants/Unit設定ファイル達(postfix.serviceなど)
  • journalctl
    • /var/run/log/journal -> 再起動で消失 -> /etc/systemd/jornald.confでpersistent設定

ブートローダ

GRUB

  • grub-install
  • /boot/grub/menu.lst
  • root (hd0,0) -> /dev/sda1のこと
  • 対話式シェル -> grub

GRUB2

  • grub2-install
  • /etc/default/grub -> grub(2)-mkconfig -> /boot/grub/grub.cfg
  • 対話式シェル -> grub2

起動オプション(起動時に[e]キー)

  • ルートファイルシステムの指定 -> linux /boot/vimlinuz-.4.4.0 ro root=/dec/sda1
  • 起動オプションの確認 -> /proc/cmdline

システムの回復

  • インストールCD/DVD-ROMからレスキューモードで起動
  • rpmコマンドなどルートディレクトリを指定しないといけなくなる -> chrootでルートディレクトリの変更
  • GRUBの設定ファイルを直す -> grub(2)-mkconfig

その他ブートローダ

  • SYSLINUX
    • USBメモリやCD-ROMからのブート
  • PXEブート
    • ネットワークブート
    • TFTP/DHCP/HTTP/NFS

4.ファイルシステム

操作

  • /etc/fstab
    • UUIDの確認 -> blkid
    • マウントオプション
    • noatime -> iノードのアクセス時刻を更新しない = 高速化
    • auto
    • suid
    • user
    • users
    • defaults -> async/auto/dev/exec/nouser/rw/suid
  • カーネルがサポートしているファイルシステムは? -> /proc/filesystems
  • どのファイルシステムがマウントされてるか -> /etc/mtab = /proc/mounts
  • mount / umount
  • 再マウント -> mount -o remount /data
  • sync -> メモリ上のディスクバッファ領域にあるデータをディスクに書き込む
  • ファイルにスワップ領域を作る手順↓
    • dd if=/dev/zero of=/tmp/swapfile bs=1M count=500
    • mkswap /tmp/swapfile
    • swapon /tmp/swapfile
  • スワップ領域の確認 -> swapon -s または cat /proc/swaps

作成

ext

XFS

Btrfs

CD/DVD

暗号化ファイルシステム

保守

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux基礎3 -ファイルとディレクトリ-

はじめに

Linuxの基礎の学習をしています。
自分用のまとめとして、また、知識の定着を目的に、Qiitaに投稿しています。
Linux初学者の参考になれば幸いです。

今回は、Linuxのファイルとディレクトリに関する基礎知識を紹介します。

Linuxはファイルからできている

Linuxは文書、画像などのユーザデータファイルに加えて、システム全体も1つ1つのファイルとして構成されています
例えば、Linuxカーネルも1つのファイルですし、システムの動作設定もコンフィグ(config)ファイルと呼ばれるファイルに記述します。

以上のことから、Linuxを使いこなすには、まずはファイル操作について学ぶことが必須です。

ディレクトリとは

ディレクトリ -> ファイルを整理する入れ物(WindowsやMacでフォルダと呼ばれるものと同じ)

下の図で「user」「apple」「red」「orange」「blue」がディレクトリに相当する。
「apple」からみて「user」は親ディレクトリ、「red」は子ディレクトリという。

スクリーンショット 2020-05-20 13.26.15.png

Linuxのディレクトリ構造

次の図はLinuxの一般的なディレクトリ構造を示しています。ここでは主要なディレクトリのみ示しています。

スクリーンショット 2020-05-20 13.43.36.png

一番上の「/」はルートディレクトリと呼びます。
Linuxのディレクトリ構造はルートディレクトリを起点とした階層構造になっており、これをディレクトリツリーと呼びます。

パス(PATH)

上のLinuxの一般的なディレクトリ構造を見てみましょう。
例えば、あるディレクトリやファイルを指定するときは次のように表記します。

/home/nossy/ファイル名

これをパスと呼びます。
パスの区切りはWindowsでは「¥」が用いられますが、Linuxでは「/」が使用されます。

ディレクトリ構造の特徴

Linuxは何台のディスクがあろうが、システム全体で1つのディレクトリツリーしか持たないのが大きな特徴です。
Linuxではルートディレクトリの配下のどこかに、ディスクをディレクトリとしてくっつける手法をとっています。この操作を「マウント」と呼びます。

スクリーンショット 2020-05-20 13.57.26.png

各ディレクトリの役割

Linuxのディレクトリの中でも特に重要なものに絞って、その役割を紹介します。
なお、ディレクトリの構成はFHS(Filesystem Hierarchy Standard)という標準化仕様に基づいています。

ディレクトリ 主な役割
/bin 一般ユーザ、管理者ユーザの両方が利用するコマンドの実行ファイルをおくためのディレクトリ。実行ファイルは様々な場所に置かれますが、binはその中でもLinuxシステムの動作に最低限必要な、重要度の高いコマンドを格納する。
/dev デバイスファイルを格納するディレクトリ。デバイスファイルとは、ディスクやキーボードなどのハードウェアをファイルとして扱えるように用意された特殊なファイル。
/etc 設定ファイルをおくためのディレクトリ。各種アプリケーションやLinux自体の設定に関わるファイルが格納される。Linuxを管理・運用する上で非常に重要なディレクトリ。
/home ホームディレクトリが配置されるディレクトリ。ホームディレクトリとはLinuxユーザごとにそれぞれ割り当てられる個人用ディレクトリ。上の図でいうnossyやtanakaのように、ユーザ名がディレクトリ名になる。
/sbin /binと似ていて、実行ファイルをおくためのディレクトリ。しかし、/sbinは管理者ユーザ向けのコマンドが置かれている
/tmp 一時的なファイル(テンポラリファイル)をおくためのディレクトリです。アプリの実行中に作業途中の結果などを一時的にファイルとして保存する場合は、このディレクトリの下に保存するのが一般的。このディレクトリは定期的に削除するディストリビューションも多いため、永続的な保存先として使用は控える
/usr 各種アプリとそれに付随するファイルをおくためのディレクトリ。追加でアプリをインストールした際に、実行ファイルやドキュメントなどがこのディレクトリの下に配置される。/usrは内部にルートディレクトリ配下と似た構造をもつ。
/var 変化する(variable)データをおくためのディレクトリ。アプリを動作する上で作成されたデータやログなどがこのディレクトリに格納される。容量が圧迫されることが多いため、システム管理の上では注意が必要なディレクトリ。

絶対パスと相対パス

パス名 内容
絶対パス ルートディレクトリを起点としてファイルやディレクトリのパスを示すこと
相対パス カレントディレクトリを起点として、表記されるパス

カレントディレクトリ -> 現在自分が位置しているディレクトリのこと。pwdコマンド(後述)で確認できる。

スクリーンショット 2020-05-20 14.32.40.png

上の図を参考に絶対パスと相対パスについて例を示します。

パス名 書き方
絶対パス /home/nossy/work/file
相対パス ./work/file

相対パスの「.」はカレントディレクトリを表します。また、「..」は親ディレクトリを表します。
例えば、「../tanaka」と書けば、親ディレクトリ内のtanakaディレクトリ、すなわちカレントディレクトリと同階層の別ディレクトリを指定することができます。
また、「../../../..」とすれば、4つ上のディレクトリを指定できます。

ディレクトリの移動

ディレクトリを移動したり確認したりするコマンドについてみていきましょう。

コマンド 機能
pwd カレントディレクトリを表示する
cd カレントディレクトリを変更する。引数を指定しなければホームディレクトリへ移動する。また、~(チルダ)を使うとホームディレクトリのパスに自動的に置き換えられる。cd ~/reportなど指定するときに便利。
ls ディレクトリ内のファイルを表示する。(具体的な機能を後述する)

各種コマンドの実行結果を下の図に示します。

スクリーンショット 2020-05-20 14.48.59.png

なお、Tabキーによる補完機能はコマンドだけでなくパス名にも利用することができます
補完機能の詳細はLinux基礎2 -シェルの便利な機能-をで記述しています。

lsコマンド

ここでは、Linuxの基本操作として使用頻度の高いlsコマンドについて簡単に説明します。
前述しましたが、lsコマンドはファイルやディレクトリを一覧表示するコマンドです。

$ ls /       #ルートディレクトリを引数で指定
bin dev home lib ....

$ ls /bin/cp #ファイルを引数にしてコマンド実行
/bin/cp      #ファイルのパスが表示

$ ls / /usr  #複数のディレクトリを引数にしてコマンド実行
/:       #ルートディレクトリの表示結果
bin dev home lib ....
/usr:     #/usrディレクトリの表示結果
bin games lib sbin ....

$ls          #カレントディレクトリに何もファイルがない場合
$

コマンドのオプション

lsコマンドを含めて多くのコマンドは、コマンドライン引数に、-(ハイフン)で始まる追加の引数を指定できます
ここではlsコマンドを例に、コマンドオプションについて簡単に説明いたします。
オプションはコマンドごとに異なるため、コマンドのマニュアルを参照してください。

$ ls -l /usr/local
対応箇所 名称
ls コマンド
-l オプション
-l /usr/local コマンドライン引数

例として、「ls -l」コマンドの実行結果を下に示します。「ls -l」コマンドはファイルの詳細情報を表示するオプションです。表示されたファイルの詳細情報については後の記事で解説します。
スクリーンショット 2020-05-20 15.13.49.png

オプション指定の基本

オプションはコマンド名の後ろに、スペース区切りで指定します。

$ ls -a

オプションは2つ以上指定することもできます。次のコマンドは-aオプションと-Fオプションを同時に指定しています。動作は同じです。

$ ls -a -F
$ ls -aF

コマンドの引数とオプションを同時に指定できます。

$ ls -aF /usr

引数をとるオプション

オプション自体が引数をとることもあります。
例えば、lsコマンドの-wオプションは指定した数値の横幅で表示するオプションです。
スクリーンショット 2020-05-20 15.24.00.png
lsコマンドでは表示結果が横並びで表示されていますが、-wオプションで30桁を指定することで、表示の仕方を変更しています。

なお、オプションと引数の間のスペースは省略可能です。以下の二つは同じ意味です。

$ ls -w 30
$ ls -w30

ロングオプション

--(ハイフン2文字)で始まるオプションもあります。この形式はロングオプションと呼ばれます。
ロングオプションの例として、「--quote-name」を示します。このオプションはファイル名を""(ダブルクォート)で囲んで表示します。

また、--quote時点でオプションを打ち切っても同様の結果が取得できます。これは、quoteで始まるオプションが他にないためです。
スクリーンショット 2020-05-20 15.32.33.png

ロングオプションには1文字のオプションが用意されているものでも別名としてロングオプションが用意されているものもあります。先ほどの-wオプションは--widthオプションと同義です。
引数をとるロングオプションでは、引数との間にスペースを入れるか、=記号で引数を指定します。
下の2つのコマンドは同じ意味です。

$ ls --width 30
$ ls --width=30

出力結果の比較
スクリーンショット 2020-05-20 15.32.50.png

 参考資料

新しいLinuxの教科書

関連記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

元Windows信者がLinuxメインにして思ったこと

概要

元windows信者がLinuxメインにして思ったことを綴ります
(未完成)

注意

twitterの方で色々あったので言いますがあくまで個人の見解です。あと中の人日本語が苦手なので誤字ってたらtwitterで叩いてください

良かったこと

安定してる

やっぱりサーバーに最適と言われるだけあってLinuxと派生であるディストリビューションはwindowsより圧倒的に安定してます。windowsのように頻繁に再起動する必要もなくストレスがほぼありません

セキュリティ

ウイルスに感染しにくいのでセキュリティソフトを入れる必要がないのでその分リソースが沢山使えます
(ただし一般家庭でwindowsの代替えとして使う場合です。)

パッケージ管理システム

これが最大の利点かも。windowsの場合アプリを入れるにはインストーラをダウンロードして実行する必要がありました。しかしLinuxではaptやpacmanコマンド一発でインストールできます。

起動が早い

起動がwindowsと比べ格段に早いです。

無料!

なんと言ってもLinuxは無料で使えます。これだけ優れたものがタダで使えるなんて夢のような話ですが実際に無料です。しかもwindowsやAndroidのようにデータが勝手に収集されることはありません(ただしubuntuの場合はインストールされたパッケージ一覧を送信してる模様)

開発者に最適

プログラミング環境がデフォルトで備わっているという点はプログラマーにとって大きな利点です。

カスタマイズ自由

Linuxはデスクトップ環境を好みのものに選べます。(xfce、KDEなど)そのため自分のPCのスペックが低い場合は多少見た目を犠牲にして軽いデスクトップ環境を選んだりということが可能です

軽い

皆さんは Linux=ubuntu=重い というイメージがあるかもしれません。しかしそれは間違えです。zorin os liteやAlter Linuxのように軽くて綺麗なLinuxディストリビューションもたくさんあります。

もっとある

更に知りたい人は
https://itsfoss.com/linux-better-than-windows/
を見てみてください!

Linuxによくある間違えた偏見

Linuxはcuiメインで使いにくい

完全に間違えです。Linuxに手を加えデスクトップが使えるようにした各種のディストリビューションが無数にありguiも不自由なく使えます。またcui操作もなれると場合によってguiより使いやすく感じます。cuiとguiを両立できるのがlinuxの良さだと思います

Linuxは重い

大嘘です。ubuntu以外の軽量ディストリビューションを試してみてください

デュアルブートにすると必ずwindowsが破壊される

確かに操作を失敗するとwindowsが破壊されます。ですが基本的には破壊される確率は低いです。もし心配なら仮想環境に入れてみましょう

Linux対応のソフトは少ない

確かに数は少ないですが近年Linuxでも作動するソフトは増えていてlibre offficeなどの互換ソフトも数多く存在します。

結論

ゲーム等をしない私はLinuxメイン、windowsサブでも全く困りませんでした(人によります)
皆さんもぜひLinux系のOSを一度試してみてはどうでしょうか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vulsはリモートスキャン対象サーバで何をしているのか

はじめに

Vuls、勝手に脆弱性のあるパッケージを見つけてくれて便利ですよね。
リモートスキャンを使えば、スキャン対象のサーバにインストールする必要もなく、SSHで入って勝手になんか見つけてきてくれます。
でも、本番サーバにSSHで入られるのは少し怖い…
もし問題が起きたときに、スキャンしたせいじゃ無いですよ!と言える根拠が欲しいと思ったので、具体的にどんなことをスキャン対象サーバで行っているのか、調べてみました。

調査方法は以下の通りです。auditctlでローカル側で実行されたコマンドを全てログし、後から解析してみました。

auditctl -a always,exit -F arch=b64 -S execve
vuls サブコマンド
auditctl -D
cat /var/log/audit/audit.log | grep "EXECVE"

環境

ローカル

# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)
# go version
go version go1.14.2 linux/amd64
# vuls -v
vuls v0.9.5 build-20200518_192222_466ec93

スキャン対象

# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)

結果

コマンドの実行方法

リモートサーバでコマンドを実行するときは、以下のような手法で行っているようです。
ControlMasterを用いてTCPコネクションを集約したり、ログイン後のウィンドウ幅を1000にしたりしています。

/usr/bin/ssh 
  -tt
  -o StrictHostKeyChecking=yes
  -o LogLevel=quiet
  -o ConnectionAttempts=3
  -o ConnectTimeout=10
  -o ControlMaster=auto
  -o ControlPath=/root/.vuls/controlmaster-%r-hoge.%p
  -o Controlpersist=10m vuls@ホスト名
  -p 22
  -i /root/.ssh/id_hoge
  -o PasswordAuthentication=no
    stty cols 1000; 実行するコマンド

コマンド本体は、以下のように16進数で送られているようです。記号とかで予期しない動作になるのを防いでいると思われます。

7374747920636F6C7320313030303B206C73202F6574632F64656269616E5F76657273696F6E
-> stty cols 1000; ls /etc/debian_version

以下では、stty cols 1000;までを省略して(SSH)と書きます。

configtest

configtestでは、以下のコマンドが実行されていました。
単純にOSのバージョン情報を取得しているだけですね。今回は、対象サーバがCentOSだったので、それをcatしているようです。(いつもredhat-releaseを見ていたのですが、centos-releaseもあるんですね…)

vuls configtest
(SSH) ls /etc/debian_version
(SSH) ls /etc/fedora-release
(SSH) ls /etc/oracle-release
(SSH) ls /etc/centos-release
(SSH) cat /etc/centos-release

fast-offline

fast-offlineモードでは、以下のコマンドが実行されていました。
前半はconfigtestと同じで、対象サーバのOSバージョンを取得しています。
その後、IPアドレスの取得、カーネルのバージョン?の取得、インストールされているパッケージの列挙となっています。IPアドレスはofflineの有無に関わらず、ここで取得しているようです。

vuls scan hoge
(SSH) ls /etc/debian_version
(SSH) ls /etc/fedora-release
(SSH) ls /etc/oracle-release
(SSH) ls /etc/centos-release
(SSH) cat /etc/centos-release
(SSH) /sbin/ip -o addr
(SSH) uname -r
(SSH) rpm -qa --queryformat "%{NAME} %{EPOCHNUM} %{VERSION} %{RELEASE} %{ARCH}\n"
(SSH) rpm -q --last kernel

fast

fastモードでは、以下のコマンドが実行されていました。
fast-offlineモードに加え、
1. AWSで動いているかの確認、動いていればインスタンスIDの取得?
2. yumリポジトリデータのダウンロード
3. dnfが入っているかのチェック(yumの代わりにdnfが入っていたらコマンドが変わる…?)
4. repoqueryでアップデート可能なバージョンを検索する(dnfだったらオプションが微妙に違う

オンプレで動いていても169.254.169.254に通信を飛ばそうとするんですね。

vuls scan hoge
(SSH) ls /etc/debian_version
(SSH) ls /etc/fedora-release
(SSH) ls /etc/oracle-release
(SSH) ls /etc/centos-release
(SSH) cat /etc/centos-release
(SSH) type curl
(SSH) curl --max-time 1 --noproxy 169.254.169.254 http://169.254.169.254/latest/meta-data/instance-id
(SSH) /sbin/ip -o addr
(SSH) uname -r
(SSH) rpm -qa --queryformat "%{NAME} %{EPOCHNUM} %{VERSION} %{RELEASE} %{ARCH}\n"
(SSH) rpm -q --last kernel
(SSH) yum makecache --assumeyes
(SSH) repoquery --version | grep dnf
(SSH) repoquery --all --pkgnarrow=updates --qf='%{NAME} %{EPOCH} %{VERSION} %{RELEASE} %{REPO}'

まとめ

いかがでしたか?特に環境を変えるようなことはしていないことが分かりましたね!(当然)
強いて言えばIPアドレスやインスタンスIDの取得は必要でない場合もあると思うので、オプションでコマンドを発行しないようにできると、不必要な情報が取得されず安心かなと思いました。

もちろん変なことはしていないと思っていましたが、今回自分で確認してより安心できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

cdしたらlsしろよ。しろよぉ……

私は短気なので、cdした後に自分でlsしなければいけない人生を送るくらいなら、寿司に醤油をつけたらタイキックされる人生を送ったほうがましだと考えている。

ごめん言いすぎた。

しかし、他の人とペアプロ的なことをするときに、

「そのディレクトリ入って」
「はい」
……
「……lsして」
「あ、はい」

みたいな地獄のやり取りや、

cd xxx
0.5秒くらい間があって(体感では三年と二か月半)
ls

みたいな謎の待ち時間に耐えられないのは本当だ。
頼むからcdlsくらい自動化してくれよ。
日が暮れちゃうよ。

もっとも、「俺は勝手にlsされるくらいならワサビ抜き寿司を食う!」という硬い意志を持ってる人はそのままでいいのだが、今まで私が出会ってきたそういう人はcdlsの自動化の発想がなかったようで、勧めてみると大体「いいねそれ」みたいな感じだった。

zshを使ってる人は.zshrcに一行追加するだけ。

function chpwd() { ls }

bashの人は https://qiita.com/b4b4r07/items/8cf5d1c8b3fbfcf01a5d でも見たらできるんじゃないか?。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】pingコマンドで「タイムアウト」になる時の対処法

pingコマンドでタイムアウトになる

AWSでEC2インスタンスを作成して、pingコマンドで応答確認をしたいのにタイムアウトになる。

スクリーンショット 2020-05-20 8.26.30.png

■考えられる理由は大きく2つです。
1. サーバーが停止している
2. ファイアウォールで阻止されている

今回は2.についてです。

ファイアウォールにあたるセキリティグループでICMPを許可する必要があります。

■手順
1. マネジメントコンソールにログイン
2. 使用しているセキリティグループを選択
3. 「インバウンドルールの編集」をクリック
4. 「カスタム ICMP - IPv4」を選択し、ソースは任意の場所を選択
5. ルールを保存

スクリーンショット 2020-05-20 8.36.05.png

スクリーンショット 2020-05-20 8.42.41.png

pingコマンドで応答しない原因がセキリティグループの設定の場合は、以上の設定でpingコマンドが通るはずです。

参考

Amazon Web Services 基礎からのネットワーク&サーバー構築

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む