チラプロ <チンチラといっしょにプログラミング>

チンチラと同棲するエンジニアが、勉強したことをまとめたり、チンチラを布教したりするブログです。

チンチラのルカリオを紹介!

はじめに

ブログタイトルにもなっております、

同居しているチンチラ(ルカリオくん)について紹介したいとおもいます。

チンチラってどんな動物?

  • げっ歯類。
  • 尻尾を入れると30cm前後。割と大きいです。
  • 出身はアンデス山脈。部屋は涼しくしてあげてください(18〜22度)。
  • 質の良い毛皮のため人間に狩られて、野生の個体はほぼいないです。
  • みんなのお家にいるチンチラは、アメリカで繁殖した個体がご先祖になります。
  • トトロのモデルにもなりました。

うちの子プロフィール

  • 名前:ルカリオ
  • 誕生日:2018年12月28日
  • 性別:オス

  • 特徴① 骨格がいい(獣医師お墨付き)。
  • 特徴② スタンダードグレーの基本色と、コントラストが綺麗な真っ白なお腹。
  • 性格: 初めての場所にも臆さない図太さ。
  • 特技: ごろん。下記ツイートを参照。

https://twitter.com/1228lucario/status/1264570639295213568?s=21

お迎えした頃

  • 生後8ヶ月でまだ赤ちゃん顔。

現在

  • 730gの体格いい男の子になりました。

  • マイブームはポケット付きのハンモックで寝ることです。

今日はこの辺で!! 技術ブログの合間に、ルカリオブログも書いていきますね!

では!!

docker run するときに repository name must be lowercase と /bin/bash: not found にハマり続けた話

前置き

ローカルのmysqlのバージョンに依存しているせいで、RDSに対してmysqlの操作ができませんでした。 そこで、mysqlsshだけ実行できるdockerを用意すれば、ローカルが邪魔をせず、mysqlを扱えると思いました。

ところが。

docker run もうまく行かない・・・! 色んな記事を試してみたけどだめだ・・・!

ということで、しょーもない原因だったけど、記事にすることにしました。

参考: dockerfile

# mysql実行用Dockerfile
FROM postgres:11-alpine
# 基本ソフトインストール
RUN apk add --no-cache \
          bash \
          mysql-client \
          openssh-client
# Langの設定
ENV LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja" LC_ALL="ja_JP.UTF-8"
# for JST TimeZone
RUN apk --update-cache add --no-cache tzdata \
  && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
  && echo "Asia/Tokyo" > /etc/timezone
ENTRYPOINT xxx-xxx
CMD []

repository name must be lowercase

出現エラー詳細

docker: invalid reference format: repository name must be lowercase.

よく検索に出る解決方法

  • マウント(-v オプション)のパスを “” で囲う

今回の原因・解決方法

  • エディタ上では全て半角スペースになっていたが、全部消してから半角スペース入れ直した → エディタ上で識別できない余計な文字があったのかも

/bin/bash: not found

出現エラー詳細

/bin/bash: line 1: xxx-xxx: not found

runコマンド

docker run \
--rm \
-it \
--name xxx-xxx \
-v $PWD:/workspace \
-v ~/.ssh:/root/.ssh \
-v ~/.aws:/root/.aws \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=pass \
xxx-xxx /bin/bash

でも

docker run \
--rm \
-it \
xxx-xxx

でもbashがnot found。dockerfileにちゃんとbashいれてるやん。なんで。

2個目に至ってはbin bashを打ってもいないのに。

今回の原因・解決方法

ENTRYPOINT xxx-xxx
CMD []

これらをdockerfileに残していたのが原因(お手本にしたDockerfileに記述されていました)。

これらは、コンテナ起動したときに実行されるコマンドを指定するオプション。

なので、bashがnot foundではなく、xxx-xxx コマンドは無いよ!とbashが教えてくれていただけでした。というオチ。

なので、私と同様にdockerからssh接続してmysqlを使用したい方は、上記の「参考: dockerfile」からENTRYPOINTとCMDの記述を削除してください。

※ ちなみに

記述順番に限らず、実行の強さは ENTRYPOINT > CMD になる様子

最後に

コピペよりも最初から書いたほうが早いときもある。 害がない「だろう」で放置するオブションやコマンドが悪さすることもある。だろう運転だめ。

初心者がArchLinux環境構築の内容を噛み砕いて説明してみる

前置き

ArchLinuxに手を出した理由

  • 環境設定の苦手意識から逃れたい!
  • とにかくOSいじりに慣れたい!
  • 色々自分で設定しないといけないArch Linuxなら強制的にOSいじりに慣れるだろう!

浅はかですねぇ。。

必要な前提知識多すぎない!?

wikiやインストール記事(公式 日本語版)を読もうにも

  • 何言ってるかわからない。
  • 前提知識が多すぎて全然追いつかない。
  • 調べてもキリがない。
  • 結局何も進まない。

こんなふうに私同様、向上心はあるけど心折られた人たちの力になれれば幸いです。

※ 私はArch信者のサポーターがいたからどうにかなっただけです。一人じゃ無理でした。

環境構築の偉大なる参考資料

https://qiita.com/TsutomuNakamura/items/b60518f8788e5e998744

この記事に沿って設定すれば概ね環境構築はできます。

私の記事では、その中からそもそも何してるの?の解説を入れていきます。

設定中に躓いたポイント集

まず何をやるかわからない、流れを掴めない

ざっくりした流れは以下の通り

  • パーティショニングから行う(メモリの使用領域を設定する)。既に存在する場合は削除してから実施する。
  • パーティションしたものをフォーマットする。
  • 作ったパーティションに対して、インストールするためのデバイスからアクセスできるよう認識させる(マウント)。
  • インストールするときの言語を設定(mirrorの選択)。
  • OSの起動を制御をするファイル設定する(boot Loaderの設定)。
  • マウントを切って、再起動をする。

インストール画面に遷移できない(UEFIBIOS)画面が出せない)

  • インストールのデータがあるデバイス(USBやCD-ROM)の差した後、設定画面にいくにはハードの起動画面中にF2ボタンを押下する(タイミングがシビア)。
  • なお、ハードのメーカーによってBIOS画面に遷移できるボタンは違うらしい(大体がF2ボタンらしいが、調べる必要はある)。
  • UEFIBIOS)画面が表示された後、システムの起動順序を変更する。変更前は現在入っているOSが1位となっているはずなので、インストールのデータがあるデバイスを1位にする。
  • 保存して起動することで、ようやくインストール画面に遷移される。

パーティションがうまく設定されない

  # sgdisk -Z /dev/sda
  • ちなみに設定するコマンドは以下の通り(あくまで一例)。
  # sgdisk -n 1:0:512M -t 1:ef00 -c 1:"EFI System" /dev/sda
  # sgdisk -n 2:0: -t 2:8300 -c 2:"Linux filesystem" /dev/sda

パーティションのフォーマットがうまくいかない

  • フォーマットを削除したとはいえ、区画を削除しただけなので、前のマウントの設定が残っているときがある。

  • マウントの設定をなかったことにする。

# umount /dev/sda2
  • その後の設定内容が以下の通り(念の為)。
# mount /dev/sda2 /mnt
# mkdir /mnt/boot

# mount /dev/sda1 /mnt/boot

Linux filesystemに使うパーティションのフォーマットって結局何がいいの?

  • ex4はよく使われているが、処理が早いのでPCのスペックに余裕があるのであればxfsのほうがいい。それを踏まえた一例は下記の通り。
# mkfs.vfat -F32 /dev/sda1
# mkfs.xfs /dev/sda2

mirrorの設定ってどうするの

  • インストーラvimが標準設定されているため、vimを使って編集する。
  • Japanの設定内容(3つ存在)を検索して、mirrorlistのファイル先頭に配置する。
  • vim勉強中なので全てコマンドを記載。
  # vim /etc/pacman.d/mirrorlist
  // viの検索コマンドは/なので、Japan検索は以下の通り
  /Japan
  // 文頭にカーソルを合わせてから範囲選択モード
  v
  // 文末まで移行
  $
  // 行頭(行の文頭)まで移行
  0(^)
  // 戻る
  u
  // 範囲選択をしてから行切り取り
  d
  // 貼り付け
  p
  // ファイルの頭に行く
  gg
  // 保存して閉じる
  :wq

boot loader っていくつかあるの?そのときのboot loaderの設定はどうするの?

  • boot loaderとして様々あるが、今回はシンプルかつ壊れにくいsystemd-bootを使用する。
  • 以下に一連のコマンドを記載する。
   // インストール(※ systemd-bootは(Linuxを動かす基本的なプログラムがあるbaseかbase-develに入っている)systemdパッケージの一部なので、明示してインストールする必要はない。vimは使い勝手がいいので入れる)
   # pacstrap /mnt base base-devel vim
  // インストールデータがあるデバイスから、OSを入れる先のデバイスに移動。rootディレクトリを/mntに変更
  # arch-chroot /mnt
  // タイムゾーンの設定の読む先を指定
  # ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
  // ハードウェアクロックの設定
  # hwclock --systohc --utc
  // ロケールの設定
  # vim /etc/locale.gen
  // コマンドモードで、アンコメントにする。
  /en_US.UTF-8 UTF-8 もしくは /ja_JP.UTF-8 UTF-8
  カーソルを#にあわせてxで削除
  :wqで保存
  # locale-gen
  # echo LANG=en_US.UTF-8 > /etc/locale.conf
  # echo LANG=ja_JP.UTF-8 > /etc/locale.conf
  // 日本語キーボードの場合、下記コマンドも必要
  # echo KEYMAP=jp106 > /etc/vconsole.conf
  // ホストネームの設定
  # echo (設定するmyhostname) > /etc/hostname
  # vim /etc/hosts
  127.0.0.1 localhost
  ::1       localhost
  127.0.1.1 (設定したmyhostname).localdomain    (設定したmyhostname)
  // ワイアレスの場合、ネットワーク設定も必要(コマンドは割愛)
  // Initramfsの設定
  # mkinitcpio -p linux
  // intelのおまじない 詳細はマイクロコード
  # pacman -S intel-ucode
  // systemd-boot の EFI ブートマネージャのインストール(当フローで言うとsda1のパーティションがEFI Systemを指定したため)
  # bootctl --path=/boot install
  // ローダーの設定
  # vim /boot/loader/loader.conf
  // 現存するdefaultは削除
  default  arch
  timeout  4
  editor   no
  // ローダーの追加
  # vim /boot/loader/entries/arch.conf
  title   Arch Linux
  linux   /vmlinuz-linux
  initrd  /intel-ucode.img
  initrd  /initramfs-linux.img
  // rootディレクトリがデバイスのどこにいるのかを記述(arch.confに対してUUIDを出力)
  # blkid -o export /dev/sda2 | grep ^UUID >> /boot/loader/entries/arch.conf
  # vim /boot/loader/entries/arch.conf
  // 下記内容をarch.confに追記
  options root=(出力されたUUID) rw
  // Root パスワードの設定
  # passwd
  // user・パスワードの追加
  # useradd -m (設定するusername)
  # passwd (設定したusername)

設定が終わったら?

  • 再起動の必要がある。その前にマウントの解除を忘れないこと。
# exit
// インストールのためのデバイスと、インストール先のデバイスのマウントを解除する
# umount -R /mnt

# reboot
  • またUEFIBIOS)画面で、起動の優先順位を変えて、Arch Linuxを優先度1位にすること。

よく使うコマンドまとめ

バイスの状態を表示

結局なんなの?集

バイスブロックとパーティションの違い

  • バイスブロックは物理的な区画であり、自分で設定可能なのはブロックサイズ(メモ書きの大きさのような物)のみ。容量を指すサイズは変更できない。当記事でいうとsda自体がデバイスブロック。
  • パーティションは論理的な区画であり、自由に設定可能。当記事でいうパーティションの設定はデバイスブロックであるsdaの中のパーティション(sda1, sda2)を設定する過程がある。

EFI SystemとLinux filesystem、役割の違い

  • EFI System:boot loaderのデータ格納
  • Linux filesystem:Linux本体(boot loader以外)を格納

boot loaderってなに?

  • OSの起動を制御をするもの。
  • UEFI(広義ではBIOSマザーボードのプログラムのこと)がboot loaderを起動して、boot loaderがOSを起動させる。

マウント(mount)ってなに?

小ネタ

  • ダウンロード後、ArchLinuxを立ち上げsudoコマンドを実行すると、小言のようなメッセージの中にスパイダーマンの名言が混ざりこんでいる。
  • 初めてのsudoコマンドでしか確認できないメッセージらしいので、見逃さないでほしい。

最後に

他にもGUI設定に苦しんだり、そもそも基本コマンドがわからず苦しんだり、カーネルぶっ壊して復旧ができなかったりと、色々ネタが尽きないので小出しにしてみます。

長々とした記事を最後まで読んでいただきありがとうございました!