MetaPii 技術室

あなたの知恵と思いを検索するフラッシュメモアプリMetaPiiのエンジニアブログです。

grub rescueが表示され grub_calloc not found で起動できないUbuntu

特殊な方法で解決しました。以下紹介する方法では起動OSがubuntuのHDDが2つ必要です。

最初に以下の記事を参考しましたが、Liveでやるというのが面倒だったのでこの方法に行き着きました。 qiita.com

環境

1.初期準備

起動OSがubuntuのHDDをもう一台用意する。(つまり、エラーが起きた異常OSのHDDと正常起動ができるHDDの2つ用意する)
そして、正常な方のHDDでubuntuを起動する。

2.起動したPCに異常のHDDを外部HDDとして接続する(USB接続)

そうすると、

$ cd /media/dev/XXXXXXXXX
$ ls 
bin    etc             lib         media  root  srv       usr
boot   home            lib32       mnt    run   swapfile  var
cdrom  initrd.img      lib64       opt    sbin  sys       vmlinuz
dev    initrd.img.old  lost+found  proc   snap  tmp       vmlinuz.old

上記のフォルダ配下に異常HDDがマウントされ、中身のフォルダ構成がみえてくる。

3.正常なOSのgrubを異常OSへコピーする

$ sudo rm -rf /media/dev/XXXXXXXXX/boot/grub
$ sudo cp -r /boot/grub /media/dev/XXXXXXXXX/boot/

これで異常OSで無事起動できました。

MySQLのinformation_schema.tables が更新されない

いろいろ調べました。

環境

原因

どうも「information_schema_stats_expiry」というのが関係するようです。

show SESSION VARIABLES like 'information_schema_stats_expiry';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| information_schema_stats_expiry | 86400 |
+---------------------------------+-------+
1 row in set (0.02 sec)

対処

これでOK。

SET SESSION information_schema_stats_expiry= 1;

参考

yoku0825.blogspot.com

Docker on Ubuntu でINTERNAL ERROR: cannot create temporary directory!

環境

Ubuntu Server18.04

問題

コンテナに入ろうとしたら。。。

$ docker-compose exec app bash
[31394] INTERNAL ERROR: cannot create temporary directory!

一時領域が足りないといわれてしまいました。

状況確認

ディスク容量をこれで確認してみましょう。何かピンとくるものがるかも。

docker system df

対処方法

お掃除コマンドを実行します 使われていないコンテナやボリューム・ネットワーク・イメージを削除してくれます。

docker system prune -f

最後に

良いdocker lifeを。

Ubuntuでスクリーンショット・画面キャプチャを取得する方法

インストール不要!デフォルトの機能です。

環境

Ubuntu Desktop 18.04LTS

フォルダへ保存

保存場所は、/home/user/ピクチャ っぽい。

範囲選択

PrintScreen + Shift キー

もしくはターミナルから

 gnome-screenshot --area

全画面

PrintScreen キー

もしくはターミナルから

 gnome-screenshot

クリップボードへ保存

上記のキーに「Ctrlキー」も同時に押下すればOK!

遅延撮影

10秒遅れで取る方法

 gnome-screenshot --delay=10

UbuntuにJavaをインストールする方法

すぐ忘れるのでメモ

すでに入っているか確認

java -version

これでバージョンなどが表示されたらすでにあなたはJavaを手にしています。

インストール

sudo apt-get update
sudo apt install default-jre

JAVA_HOMEを設定する場合

場所確認
sudo update-alternatives --config java
記載場所

.bashrcや.bash_profileなどにJAVA_HOME="上記で表示されたパス"
でOKなはず。

テーブルJOINしてUPDATEするSQL mysql

すぐ忘れるのでメモ

SQL

UPDATE 
 table_1 a LEFT JOIN table_2 b
 ON a.col_id = b.col_id
SET a.col_2 = b.col_2
WHERE b.col_3 = 1;

table_1.col_2をtable_2.col_2で更新している例

構文

UPDATE [テーブル結合式] SET [更新値] ( WHERE [絞り込み条件] )

これね。

Docker Laravel root以外のユーザーで起動する on Ubuntu

Dockerを運用し始めてから約半年、この問題の対処方法を紹介します。 ずっと放置していたんですが、サービスをリリースすることになったためセキュリティの観点から対応しました。

「Nginx + Laravel ( + Mysql ) 」の組み合わせについての方法です。(Mysqlはあんま関係ないかも、mysqlmysqlユーザーで開始すればOK) ローカルから編集もできるし、docker上で実行エラーも起きないそんな方法です。

前提条件

こんな感じのプロジェクトディレクトリで運用してます。 Laravelやってる人はぴんとくるものがあると思います。 今回関係あるのは下図の★のところだけです。

project
├── Dockerfile
├── compose_by_env
│   ├── docker-compose_cloud.yml
│   ├── docker-compose_local.yml
├── docker
│   ├── mysql
│   │   ├── Dockerfile
│   │   └── my.cnf
│   ├── nginx
│        ├── Dockerfile
│        ├── default.conf
│        ├── nginx.conf
├── docker-compose.yml -> ./compose_by_env/docker-compose_local.yml
├── logs ★
│   ├── access.log
│   └── error.log
└── src ★
    ├── README.md
    ├── app
    ├── artisan
    ├── bootstrap
    ├── composer.json
    ├── composer.lock
    ├── config
    ├── database
    ├── package.json
    ├── phpunit.xml
    ├── public
    ├── resources
    ├── routes
    ├── server.php
    ├── storage
    ├── tests
    ├── vendor
    ├── webpack.mix.js
    └── yarn.lock

対処

結論から言いますが、いくつか方針とステップがあります。

1.ユーザー作成
ホスト側にdocker の nginx , laravel app内のwww-dataユーザーと同じUID, GIDでユーザーとグループを作成する
2.グループ追加   ホスト側で作成した上記ユーザーグループにホスト側でいつも使っている開発ユーザーを加える
3.Dockerファイル編集
docker の nginx , laravel appをwww-data で立ち上げるようにする(その他もろもろ)
4.所有権変更
workディレクトリ(上図だとsrcフォルダ)以下をnginx , laravel app(docker)上のwww-dataと同じUID:GIDでchownする
5.権限変更
workディレクトリ(上図だとsrcフォルダ)以下のファイル権限を770にする

こうすることでDocker上からはwww-dataユーザーで関係するファイルがすべてwww-data権限で構成されるため実行上のエラーは起きません。
またホスト側においても、開発ユーザーはwww-dataユーザーグループに加わっており770で権限管理されているためローカル編集することができます。

では詳しく見ていきましょう。

1.ユーザー作成、及び 2.グループ追加

nginx及びLaravel app のwww-dataユーザーのUIDは82です。
なので、ホスト上でそのUIDでユーザーを作成します。 私は一身上の都合でユーザー名はdocにしました。(www-dataのほうがわかりやすいかも)

sudo useradd --shell /bin/bash -u 82 -o -m doc
sudo groupmod -g 82 doc
sudo gpasswd -a $USER doc
3.DockerFile(その他もろもろ)
nginx

・DockerFile

FROM nginx:1.17-alpine
WORKDIR /
# 【重要】ディレクトリオーナーを変更
RUN touch /var/run/nginx.pid && \
  chown -R 82:www-data /var/run/nginx.pid && \
  chown -R 82:www-data /var/cache/nginx
USER 82
RUN alias ll="ls -al"

USER www-data だと起動できないので、UIDで指定します。 もう一つ、nginxの場合root権限以外で80, 443番ポートを立ち上げることができないっぽいので、default.confで別ポートを指定します。

・default.conf

server {
    #listen 80;
    listen 8080;
    return 301 https://$host$request_uri;
}
server {
    #listen 443 ssl;
    listen 8443 ssl;
・・・以下略

あとnginx.confも今回編集したので貼っておきます。

#user  nginx www-data; これをコメントアウト
#worker_processes  auto; これをコメントアウト
worker_processes  1;  #これ追加

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
・・・以下略
Laravel app

laravelのDockerFileも同様です。

FROM php:7.3-fpm-alpine
LABEL maintainer "ucan"

COPY ${PROJECT_PATH} /work
RUN chown -R www-data:www-data /work
RUN chmod +x /work/public

USER 82
RUN alias ll="ls -al"
4.所有権変更 及び 5.権限変更

最後にホスト側でこれ。 私の場合logsというフォルダーにnginxログファイルを吐いているので、そこも変えています。

cd project
sudo chown -R doc:doc src
sudo chown -R doc:doc logs
sudo chmod -R 770 src
sudo chmod -R 770 logs

あとは

docker-compose build 
docker-compose up -d

でおけ。

docker セキュリティ

rootで実行するとよくないので、今回のやり方はその対策にもなっています。

残された課題

ローカルで新規にファイルを作成した場合、所有権がローカルユーザーとなるため、

sudo chown -R doc:doc src

のコマンドをどこかに保存して、新規作成のたびに実行するような仕組みをつくりましょう。 暫定と呼ぶ所以はこの問題が残されているからです。。