morito

個人的に勉強したことのメモを投稿していく技術ブログ。最近はWebアプリ開発と量子コンピュータの勉強をしてます。

ファイルシステムの種類と特徴をまとめてみた

LinuC101試験の個人的な難関であるハードウェア・ディスク・ファイルシステムなどの分野の中でも 特に覚えるのがめんどくさいファイルシステムの種類を表にまとめました。

Linuxファイルシステム

ファイルシステム 説明 ジャーナリングファイルシステム 動的inode
ext2 以前のLinuxで使用されていた規格 × ×
ext3 ext2の後続 ×
ext4 ext3の後続(最大ファイルシステムサイズの制約などを改良)
Debian10の既定
×
XFS シリコングラフィクス社が開発
CentOS 7の既定
JFS IBMが開発
Btrfs スナップショット機能
複数デバイスを扱う機能

その他のファイルシステム

ファイルシステム 説明
VFAT(Virtual File Allocation Table) Windowsで使われているファイルシステムLinux環境でも使える。
Linux標準パーティションなど使えないファイル属性もある。
NTFS Windowsで使われているファイルシステムLinux環境では読み取り専用。
ISO9660 CDやDVD上に作るファイルシステム
tmpfs メモリ上に作られるファイルシステム

用語

ジャーナリング機能・・・更新履歴をジャーナル(ログ)に記録しておく機能。

動的inode・・・ファイル作成時にinode番号を動的に割り当てる機能のこと。inodeを動的に割り当てるため、inodeの数に制限はない。

findコマンドまとめ

はじめに

LinuC101試験でどうしてもコマンドとオプションが覚えれなかったので

findコマンドのオプションを暗記するために語源を含めてまとめました

オプション名の語源については諸説あるので注意! 覚え方の参考程度に考えて欲しいです

オプションの意味は1次情報をみるのが確実です。

findコマンド

コマンド概要

ファイルやディレクトリを検索する。

コマンド名由来

find そのまま

書式

find [検索ディレクトリ] [ option ] [条件式] [アクション]

オプション

オプション 説明
-maxdepth 検索するサブディレクトリの階層数を指定
-mindepth 指定したサブディレクトリより深い位置を検索する

条件式

条件式 説明
-name ファイルやディレクトリ名の一部のみ指定した検索。
-mtime 更新日時で検索
-atime 任意の日数にアクセスされたファイルやディレクトリを検索する。
-user 所有者名で検索
-perm 現在,実行しているプロセスを表示
-type 実行しているコマンド名と環境変数を表示する。

アクション

アクション 説明
-print 検索結果を改行で区切って表示
print0 検索結果をNULL文字(\0)で区切って表示
-exec [コマンド] {引数} \; 見つけたファイルに対してコマンドを実行
-type

killコマンドとシグナルのまとめ

はじめに

killコマンドの概要とkillコマンドで送信できるシグナルについてまとめます。

シグナルとはプロセスに送信するメッセージのことを意味します。

killコマンド

コマンド概要

実行中のプロセスの情報を表示

書式
kill [ option ] PID/%ジョブ番号
オプション
オプション 語源(おぼえかた) 説明
-s シグナル名/シグナル番号 Signal プロセスにシグナルを送信
- シグナル名/シグナル番号 なし プロセスにシグナルを送信
-l List シグナルの一覧を表示
シグナル一覧
シグナル番号 シグナル名/語源 説明
1 HUP (Hung UP ) プロセスを再起動するシグナル。 設定ファイルの再読み込みをさせる場合に使う事が多い
2 INT (INTerrupt) キーボードからの割り込み。(Ctrl+C)
9 KILL 強制終了。正常な処理を行わないため、ファイル破損も起こりうる。最終手段にしよう。
15 TERM (termination) 規定。終了シグナル。正常な終了処理を行わせる。
18 CONT (CONTinue) 一時停止のプロセスを再開
19 STOP (STOP) 一時停止
20 TSTP ( Terminal SToP ) サスペンド。(Ctrl+Z)

おわりに

LinuC101の試験範囲なのでシグナル番号と意味を紐付けて暗記する必要があります。

だり〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜^^^

 psコマンドのオプションと覚え方

はじめに

LinuC101試験でどうしてもコマンドとオプションが覚えれなかったので

PSコマンドのオプションを暗記するために語源を含めてまとめました

オプション名の語源については諸説あるので注意!
覚え方の参考程度に考えて欲しいです

オプションの意味は1次情報をみるのが確実です。

PSコマンド

コマンド概要

実行中のプロセスの情報を表示

コマンド名由来

おそらく、ProcceSsから

書式

ps [ option ]

オプション

BSD形式とUnix形式で異なるオプションを用いる。ハイフンの有無に注意

BSD形式
オプション 語源(おぼえかた) 説明
a All ユーザが実行した全てのプロセスを表示
f Family, Forest 親子関係も表示
l Long-info, List 詳細情報を表示
x eXtra 制御端末のないサービスが実行したプロセスを表示
r Right-now 現在,実行しているプロセスを表示
e Enviroment 実行しているコマンド名と環境変数を表示する。
u Use, cpU CPUやメモリ使用率も追加で表示
h,--no-header no Header 項目名を表示しない
c Command 実行中のコマンド名を表示する
Unix形式
オプション 語源(おぼえかた) 説明
-e Every 全てのプロセスを表示
-f Full 起動時間(STIME)などを含めた詳細情報を表示
-l Long 詳細情報を表示

その他実行例など

  • ps -fps -lの違い
> ps -f
  UID   PID  PPID   C STIME   TTY           TIME CMD
> ps -l
  UID   PID  PPID        F CPU PRI NI       SZ    RSS WCHAN     S             ADDR TTY           TIME CMD

LinuC101試験ではSTIMEがあるかどうかだけわかればよさそう


  • ps -ax = ps -e

どちらもすべてのプロセスを表示する


  • よくつかうps -aux

すべてのプロセスのCPU使用率がわかります

LinuC勉強用のCentOS環境をDockerで作った

最近,会社の先輩におすすめされてLinuCの勉強を始めました

とりあえず公式公認の教科書を買って
載っているコマンドを実際に使って覚えていくことにしました

ただ、普段使いしているのはMacOSなので試験範囲で使えないコマンドもあるし、
環境をいじるのも嫌だったのでDockerコンテナで勉強用の環境を作ることにしました

手順

Dockerfile

FROM centos:latest

ARG USER 
ARG PASSWD

# ユーザーを追加してパスワードを設定
RUN yum -y update && yum clean all && \ 
    yum -y install sudo && \
    yum -y install which && \
    useradd -m $USER && \
    echo "$USER:$PASSWD" | chpasswd && \
    echo "$USER ALL=(ALL) ALL" >> /etc/sudoers

# 日本語化設定
RUN yum -y reinstall glibc-common 
RUN yum -y install glibc-langpack-en glibc-locale-source
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
RUN echo 'LANG="ja_JP.UTF-8"' >  /etc/locale.conf
ENV LANG="ja_JP.UTF-8"  \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

上が使用したDockerfileです

rootユーザーだけだと不便なのでユーザーを追加してパスワードを設定しています

また、日本語化も行っています

使い方の手順

buildします。--build-argで変数をわたせるらしい

> docker build -t mycentos_ja:latest . --build-arg USER=[user name] --build-arg PASSWD=[password]

起動

> docker run -d mycentos_ja:latest /sbin/init

ユーザー指定でシェル実行。コンテナに入ります

> docker exec -it [container ID] su - [user name]

日本語化の確認をします

[morito@4483559028a3 ~]$ locale # locale確認
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
[morito@4483559028a3 ~]$ date 
2021年  3月 30日 火曜日 03:35:06 UTC # 日本語になってる

sudoを確認します

[morito@4483559028a3 ~]$ sudo visudo

一番下にmorito ALL=(ALL) ALLという記述が確認できました

さいごに

locale周りは全然よくわかってないです

余計なlocaleを削除してDockerの容量を減らしたりできるらしいけど
よくわからん。今度暇な時に調べようと思います。

参考

Docker(CentOS)イメージから新規ユーザを追加し運用できるようにするまで

Docker 日本語環境構築まとめ 2

Dockerfileで日本語ロケールを設定する方法。およびロケールエラーの回避方法。

LinuC頻出のUnixコマンド 【備忘録】

最近暇な時間にモンハンライズLinuCの勉強をしているので
頻出っぽいコマンドの使い方を備忘録として残しておきます

history

コマンドの実行履歴を表示する

書式

history [option] [履歴数]

表示する履歴の数を指定できる

[morito@766e24c919d0 ~]$ history 5
    3  vi test1.txt 
    4  echo $EDITER
    5  echo $EDITOR
    6  history
    7  history 5

また、!履歴番号とすることで指定した履歴番号のコマンドを実行できる。

[morito@766e24c919d0 ~]$ history 10
   19  od -t c test3.txt 
   20  tr [:lower:] [:upper:] < test3.txt]
   21  tr [:lower:] [:upper:] < test3.txt
   22  grep bash /etc/passwd | tee test4.txt
   23  cat test4.txt 
   24  ls
   25  cat test4.txt 
   26  cat test2.txt 
   27  sed 's/unko/hage/g' test2.txt 
   28  history 10
[morito@766e24c919d0 ~]$ !25
cat test4.txt 
root:x:0:0:root:/root:/bin/bash
morito:x:1000:1000::/home/morito:/bin/bash


man

書式

man [option] [マニュアルのセクション] [キーワード]

キーワードでは表示するマニュアルのコマンド名を指定する.
オプションに-k、-fをつけたときは検索するキーワードを指定する。

-f キーワードの完全一致検索を行う
-k キーワードの部分一致検索を行う


whatis

man -f と同じ


apropos

man -k と同じ


od

ファイルの内容を8進数で表示する

書式:od [option] [ファイル]

-t c ASCIIで表示

-t x 16進数で表示

[morito@766e24c919d0 ~]$ cat test2.txt 
hello
unko
[morito@766e24c919d0 ~]$ od test2.txt 
0000000 062550 066154 005157 067165 067553 000012
0000013


tr

文字の置換・削除。特殊文字も消せる。

書式

書式(置換):tr [option] [文字1] [文字2]
書式(削除):tr -d 文字

[morito@766e24c919d0 ~]$ od -t c test2.txt     #ASCIIで表示
0000000   h   e   l   l   o  \n   u   n   k   o  \n  
0000013
[morito@766e24c919d0 ~]$ tr -d '\n' < test2.txt > test3.txt  #改行コードを削除し、test3.txtに書き込む
[morito@766e24c919d0 ~]$ od -t c test3.txt 
0000000   h   e   l   l   o   u   n   k   o 
0000011
$ tr [:lower:] [:upper:] < test3.txt # 文字列クラスで指定して英小文字を英大文字に置換
HELLOUNKO


tee

標準入力の内容を標準出力とファイル両方に送る

[morito@766e24c919d0 ~]$ grep bash /etc/passwd | tee test4.txt # grepの結果をteeに渡す
root:x:0:0:root:/root:/bin/bash
morito:x:1000:1000::/home/morito:/bin/bash # 標準出力に出力される
[morito@766e24c919d0 ~]$ cat test4.txt # ファイルにも出力される
root:x:0:0:root:/root:/bin/bash
morito:x:1000:1000::/home/morito:/bin/bash


sed

文字列の編集(置換、削除など)を行い表示する

書式

sed [option] 's|検索文字列 / 置換後の文字列|' ファイル(置換)
sed [option] '|削除する文字列|d' ファイル(削除)


[morito@766e24c919d0 ~]$ sed 's/unko/hage/g' test2.txt #gオプションを指定すると全ての文字列を対象にする
hello
hage


anacondaで取得したTweetが途中で切れる

環境

  • Docker Version 20.10.2
  • docker-compose version 1.27.4, build 40524192
  • go version go1.14 linux/amd64

anacondaを使ってTwitterのいいね欄を取得したかったのですが

取ってきたツイーヒョがなぜか途中で切れてしまうので困った
コードは以下。認証のとことmain関数は省略してます。

package main

import (
    "fmt"
    "local.packages/keys"
    "net/url"
    // "unicode/utf8"
)

func getFavotite() {
    api := keys.GetTwitterApi()

    v := url.Values{}
    v.Set("count","2")

    tweets, err := api.GetFavorites(v)
    if err != nil {
        panic(err)
    }

    for _, tweet := range tweets {
        fmt.Println(tweet.Text,"\n")
    }
 
    fmt.Println("get favorites!")
}

とってきてShellに表示したツイート↓

# go run *.go
大嶋啓之『epitaph』 / cross fade https://t.co/i0R9osUU1B
ボーカルRec&amp;Mix&amp;Masteringやらせていただきました。大嶋さんの12年ぶりの新作フルアルバ?

元のツイートはこれなので半分くらいしか表示できない

大嶋啓之『epitaph』 / cross fade youtu.be/Duh6ZP-kNe8 ボーカルRec&Mix&Masteringやらせていただきました。大嶋さんの12年ぶりの新作フルアルバム! kidlitさんVo&Choとの相性も抜群で、退廃的なロマンに満ちあふれています。浄化感もあってどっぷり浸れる作品。是非聴いてみてください!

原因と解決法

レスポンスであるtype TweetのフィールドにはFullTextなるものがあるらしい

tweet.textは省略されたものらしい OMG

なので

- fmt.Println(tweet.Text,"\n")
+ fmt.Println(tweet.FullText,"\n")

こんなことに無駄に時間食ってしまった。ちゃんとドキュメントは読もう;;

参考

anaconda docs