20201022のLinuxに関する記事は8件です。

linux at command

linux at command 意外と使える!ので、ここでメモ。

コマンド指定(ctrl+dで終了)

22:59:18 root@localhost ~ [0] # at 23:30
at> touch 1.txt
at> <EOT>
job 10 at Thu Oct 22 23:30:00 2020
22:59:37 root@localhost ~ [0] #

待ち行列表示

23:00:59 root@localhost ~ [0] # at -l
10      Thu Oct 22 23:30:00 2020 a root
23:01:00 root@localhost ~ [0] #

コマンド内容を表示。ちゃんと現在のフォルダまで移動したね。

23:01:48 root@localhost ~ [0] # at -c 10
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=16340; export XDG_SESSION_ID
HOSTNAME=localhost; export HOSTNAME
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SSH_TTY=/dev/pts/0; export SSH_TTY
USER=root; export USER
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=ja_JP.UTF-8; export LANG
PS1=\\t\ \\u@\\h\ \\w\ [\${PIPESTATUS[@]}]\ \\\$\ ; export PS1
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
HISTCONTROL=ignoreboth; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER54cbc56c'
touch 1.txt

marcinDELIMITER54cbc56c
23:01:53 root@localhost ~ [0] #

コマンド削除

23:03:58 root@localhost ~ [0] # at -l
10      Thu Oct 22 23:30:00 2020 a root
23:04:06 root@localhost ~ [0] # at -r 10
23:04:11 root@localhost ~ [0] # at -l
23:04:14 root@localhost ~ [0] #

以上。

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

LinuxをUSBブートしてHDDを見ようとしたとき、Authentication Required と出てはねられたときの対策法

・原因の発生
 Windowsであるソフトをインストールしたとき、「Windowsサービスに登録」というメニューが出てました。
 そのPCはActiveDirectory下にあるので「権限のあるユーザーのパスワードを入力してください」と出てきました。ルートのパスワードを入れたにもかかわらず、失敗で認めてもらえませんでした。
 そこから、異常が出だします。再起動をかけて、いざパスワードを入力して入ろうとするや
 「このワークステーションとプライマリドメインの信頼関係に失敗しました」
 との表示。Windowsにログインすらできなくなってしまいました。

 「さて困ったな」

 とりあえず、必要なデータはLinux経由で救出することにしました。

・症状の様態
 ということで、USBに仕込んであったLinuxの出番。(OS: Tails 4.12)
 USBでTailsを起動させて、そこからWindowsのHDD(sda2)を覗こうとしたのですが、そのときに、Authentication Required というメッセージが出て、そのWindowsのHDDが覗けない・・・!!

 30分ほど格闘して、無事データを救出できたので、その方法を書き残しておくことにします。

・解決方法
 1.USBを刺して、起動ボタンをポチ

 2. ブート画面でF2を押して(PCによってはF10だったりF11だったりします、起動ボタンを押して一瞬出てくる画面を確認のこと)Tailsの起動画面に。

 3. Tailsがオープンするときの「ようこそ画面」では、オプションでルートのパスワードを設定することができるので、適当にパスワードを設定。

 4. [Home]-[Persistent]以下に、以下の内容のテキストファイルを作って、 10-local.rules という名前で保存する。

10-local.rules
KERNEL=="sda2", ENV{UDISKS_IGNORE="1"
KERNEL=="sdb2", ENV{UDISKS_IGNORE="1"
KERNEL=="sdc1", ENV{UDISKS_IGNORE="1"

( sda2 とか sdb2 という名前は、その人の状況によって異なると思いますので、開きたいHDD名を指定してやってください)
 Persistent以下に保存するのは、電源切って再起動しても残るようにするためです。(これは USB上の Tails OS で Persistent Volume を既に作成しているものとして話をしています)

 5. [System Tools]-[Terminal]を起動、sudo -i と打つと、パスワードが要求されるので、3.で設定したパスワードを打ち、ルート権限獲得!

 6. ターミナルで、4.で作成したテキストファイルをシステム領域(/etc/udev/rules.d 直下)に移行させます。
 mv /home/amnesia/Persistent/10-local.rules /etc/udev/rules.d
 (mv 移動させたいファイルのフルパス 移動させたい場所 という構文です)

 7. Enterを押すと、10-local.rules が、/home/amnesia/Persistent/ から/etc/udev/rules.d に移っているはず。
 (ルート権限がないと、システム領域に読み書きすることができないから、わざわざこんなことをやっています)

 8. 10-local.rules がシステム領域に移った時点で、Authentication Required と出てはねられたHDDにアクセスすることができるようになっています。

 9. 別の外付けUSBを付けて、そこに保存したいHDDの中身を全部コピーして終了!

 めでたし、めでたし:relaxed:


・ポイント
 Linuxのシステム領域に「HDD全部読ませてくれ!」という命令を書き込むことで、強制的にアクセスを可能にする、という方法です。  

 ActiveDirectoryが入っているとセキュリティ的なものが入ってくるのでしょうか?
 「USB Linuxがあるもんね~、さあ救出だ~」とウキウキしていたところに、Authentication Required と出てはねられたときの絶望感たるや:tired_face:

 そんなときでも、強引にHDDを覗いてデータ救出する際、非常に役に立つテクニックだと言えます。自信を持って言えます。

 これがないと、途方に暮れるところでした。

 もっとも、HDDが物理的にダメになっていたら、これでも無理ですが。
 しかし、今私が経験したような、あくまでもソフトウェア的なエラーでログインできないだけのときには、最後の救世主です。

 ドメインの信頼関係は、月一度取ってあったバックアップをそのままHDDごとコピーして、無事に回復。あとは救出した最新のデータだけ書き込んで、復旧終了。
 (OSごとのHDDのバックアップって、こういうときに真価を発揮します)

 こういう危機的なエラーは滅多に出ないのですが、出たときにものすごく困惑し、狼狽します。もうその時点でパソコンが使えなくなってしまいますから。

 私の仕事の中でも最重要テクニックの一つとなりました。

 備忘録的に、書き残しておくことにします。

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

LinuxをUSBブートしてHDDを見ようとしたとき、Authentication Required と出てはねられたときの回避法

・原因の発生
 Windowsであるソフトをインストールしたとき、「Windowsサービスに登録」というメニューが出てました。
 そのPCはActiveDirectory下にあるので「権限のあるユーザーのパスワードを入力してください」と出てきました。ルートのパスワードを入れたにもかかわらず、失敗で認めてもらえませんでした。
 そこから、異常が出だします。再起動をかけて、いざパスワードを入力して入ろうとするや
 「このワークステーションとプライマリドメインの信頼関係に失敗しました」
 との表示。Windowsにログインすらできなくなってしまいました。

 「さて困ったな」

 とりあえず、必要なデータはLinux経由で救出することにしました。

・症状の様態
 ということで、USBに仕込んであったLinuxの出番。(OS: Tails 4.12)
 USBでTailsを起動させて、そこからWindowsのHDD(sda2)を覗こうとしたのですが、そのときに、Authentication Required というメッセージが出て、そのWindowsのHDDが覗けない・・・!!

 30分ほど格闘して、無事データを救出できたので、その方法を書き残しておくことにします。

・解決方法
 1.USBを刺して、起動ボタンをポチ

 2. ブート画面でF2を押して(PCによってはF10だったりF11だったりします、起動ボタンを押して一瞬出てくる画面を確認のこと)Tailsの起動画面に。

 3. Tailsがオープンするときの「ようこそ画面」では、オプションでルートのパスワードを設定することができるので、適当にパスワードを設定。

 4. [Home]-[Persistent]以下に、以下の内容のテキストファイルを作って、 10-local.rules という名前で保存する。

10-local.rules
KERNEL=="sda2", ENV{UDISKS_IGNORE}="1"
KERNEL=="sdb2", ENV{UDISKS_IGNORE}="1"
KERNEL=="sdc1", ENV{UDISKS_IGNORE}="1"

( sda2 とか sdb2 という名前は、その人の状況によって異なると思いますので、開きたいHDD名を指定してやってください)
 Persistent以下に保存するのは、電源切って再起動しても残るようにするためです。(これは USB上の Tails OS で Persistent Volume を既に作成しているものとして話をしています)

 5. [System Tools]-[Terminal]を起動、sudo -i と打つと、パスワードが要求されるので、3.で設定したパスワードを打ち、ルート権限獲得!

 6. ターミナルで、4.で作成したテキストファイルをシステム領域(/etc/udev/rules.d 直下)に移行させます。
 mv /home/amnesia/Persistent/10-local.rules /etc/udev/rules.d
 (mv 移動させたいファイルのフルパス 移動させたい場所 という構文です)

 7. Enterを押すと、10-local.rules が、/home/amnesia/Persistent/ から/etc/udev/rules.d に移っているはず。
 (ルート権限がないと、システム領域に読み書きすることができないから、わざわざこんなことをやっています)

 8. 10-local.rules がシステム領域に移った時点で、Authentication Required と出てはねられたHDDにアクセスすることができるようになっています。

 9. 別の外付けUSBを付けて、そこに保存したいHDDの中身を全部コピーして終了!

 めでたし、めでたし:relaxed:


・ポイント
 Linuxのシステム領域に「HDD全部読ませてくれ!」という命令を書き込むことで、強制的にアクセスを可能にする、という方法です。  

 ActiveDirectoryが入っているとセキュリティ的なものが入ってくるのでしょうか?
 「USB Linuxがあるもんね~、さあ救出だ~」とウキウキしていたところに、Authentication Required と出てはねられたときの絶望感たるや:tired_face:

 そんなときでも、強引にHDDを覗いてデータ救出する際、非常に役に立つテクニックだと言えます。自信を持って言えます。

 これがないと、途方に暮れるところでした。

 もっとも、HDDが物理的にダメになっていたら、これでも無理ですが。
 しかし、今私が経験したような、あくまでもソフトウェア的なエラーでログインできないだけのときには、最後の救世主です。

 ドメインの信頼関係は、月一度取ってあったバックアップをそのままHDDごとコピーして、無事に回復。あとは救出した最新のデータだけ書き込んで、復旧終了。
 (OSごとのHDDのバックアップって、こういうときに真価を発揮します)

 こういう危機的なエラーは滅多に出ないのですが、出たときにものすごく困惑し、狼狽します。もうその時点でパソコンが使えなくなってしまいますから。

 私の仕事の中でも最重要テクニックの一つとなりました。

 備忘録的に、書き残しておくことにします。

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

共有ライブラリで共有メモリを使用する

共有ライブラリ上のデータをアタッチしているプロセス間で共有したいと思い色々と試行錯誤したが, 少しハマったので記事にしておきます.

共有ライブラリ上のグローバル変数

WindowsのDLLと異なりUNIX系の共有ライブラリはグローバル空間に変数を配置しても, プロセスごとのメモリ空間に配置されるため, 共有ライブラリを使用するだけではプロセス間通信は行なえません.

共有ライブラリで使用するデータを共有するには, 共有メモリを使用するのが最も容易です.  
という訳でサンプルコードを示します.

lib_shared_memory.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/shm.h>

static void *sharedmemory; // 共有メモリへのポインタ
static int seg_id;         // 共有メモリID
static int* pnumattachproc;// 共有メモリにアタッチしているプロセス数(共有メモリ上に配置)

__attribute__ ((constructor))
void attach_shmem(void)
{
    int isfirstproc = 0;
    key_t key = 10;
    size_t size = 1000;
    // 共有メモリを作成
    seg_id = shmget(key, size, IPC_CREAT | IPC_EXCL | 0660);
    // 作成に失敗し, かつ同じキーの共有メモリが存在する場合
    if ((seg_id == -1) && (errno == EEXIST)){
        // その共有メモリのidを取得 
        seg_id = shmget(key, size, 0);
    }else if(seg_id > 0){
        // 共有メモリの作成に成功した場合は初期化処理を行うフラグを立てる
        isfirstproc = 1;
    }
    if (seg_id == -1)
        exit(1);
    // 共有メモリをアタッチ
    sharedmemory = shmat(seg_id, NULL, 0);
    if(isfirstproc){
        pnumattachproc = (int*)sharedmemory;
        // アタッチしているプロセス数を初期化
        *pnumattachproc = 0;
    }
    (*pnumattachproc)++; //アタッチしているプロセス数をインクリメント
}

__attribute__ ((destructor))
void detach_shmem(void)
{
    (*pnumattachproc)--; //アタッチしているプロセス数をデクリメント
    if(*pnumattachproc == 0){
        //もしアタッチしているプロセス数が0になったら,
        // 共有メモリを開放属性を付与しておく
        shmctl(segid, IPC_RMID, NULL);    
    }
    // 共有メモリデタッチ
    (void) shmdt(sharedmemory);
}

int get_attachproc_num(void){
    return *pnumattachproc;
}

となります. ビルドは共有ライブラリ用のオプションを使用します.

gcc -fPIC -shared -o libshm.so lib_shared_memory.c

注意点として,

shmctl(segid, IPC_RMID, NULL); 

はアタッチしているプロセスが0になり開放が確定してから実行しましょう.

もしアタッチしているプロセスが存在している段階で実行してしまうと, 新たなプロセスが共有メモリにアタッチしようとした場合に, 同じキーにも関わらず新たな共有メモリを作成してしまいます.

これを防ぐために共有メモリにアタッチしているプロセス数を共有メモリ上に変数として置いて管理することで, 最後に共有ライブラリをデタッチするプロセスが開放できるようにしてあります.

私はこれを理解しておらず, 共有メモリ作成時に開放要求を追加しており, 共有メモリにアタッチすることができていませんでした.

以上です.

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

QNAPからLinuxへ rsyncでバックアップをとろう

はじめに

先日、社内サーバーのバックアップを行ったので、
備忘録としての意味もかねて軽く解説していこうと思います。

内容はタイトルにあるとおりです。サーバーとして利用しているQNAP NASを、rsyncを利用してLinux(CentOS8)に同期し、定期的なバックアップをとることが目標になります。今回、Linuxの基本的な構築は完了しているものとして、rsyncのインストールから同期の完了までの部分を解説していこうと思います。

ちなみに今回バックアップ先として用意したLinuxは、HP社のMicroServer上に構築してあります。

前提

  • 今回LinuxのOSとして使用しているのはCentOS8である
  • QNAP, Linuxともに固定IPアドレスが割り当てられている
  • QNAP, Linuxは同一ネットワーク上にある

やってみよう

rsyncの構築

QNAP NASではバックアップ用のアプリケーションがGUIで搭載されているので、行う作業はほとんどLinux側になります。(指定がない限り基本Linux側での作業として解釈してください)

まずはインストールからしていきましょう。

Linuxにrsyncをインストール

ここではdnfコマンドを使用していますが、お使いのOSによって変わってくると思います。

dnf -y install rsync rsync-daemon

設定ファイルの編集

vi /etc/rsyncd.conf

開いたrsyncの設定ファイルに、下記を追記します。

/etc/rsyncd.conf
pig file = /var/run/rsyncd.pig
log file = /var/log/rsyncd.log
max connections = 4
transfer logging = yes

ブール値の変更、firewallのサービス許可

rsyncのアクセスを許可するようブール値とFirewallの設定を変更します。永続化は必須ではないですが、しない場合は起動のたびに同じ作業を行う必要があるので注意してください。

setsebool -P rsync_full_access on         //-Pオプションで永続化
firewall-cmd --add-service=rsyncd --permanent  //permanentで永続化
firewall-cmd --reload
firewall-cmd --list-all               //サービスにrsyncdが追加されたことを確認

rsyncの起動

さっそく起動していきましょう。ここではrsyncをデーモンで起動し、ポートの空きとLISTEN状態を確認しています。

rsync --daemon --config /etc/rsyncd.conf
grep rsync /etc/services | head  //rsyncのポートを確認
lsof -i:873              //rsyncのtcpポート(873番)がLISTENになっていることを確認
ps `cat /var/run/rsyncd.pid`    //rsyncがデーモンで起動していることを確認
systemctl enable rsyncd       //rsyncの自動起動を設定

ここまででrsyncのインストールから設定、起動まで完了しました。

rsyncのテスト

大事なサーバーのバックアップを行う際などは、万が一にも事故が起こらないよう慎重に一つひとつテストを行うことをお勧めします。ここでは2段階に分けてテストを行っていきます。

Linux内でrsync

まずはLinuxからLinuxへと同期を行います。

Linux内にテスト用のディレクトリを作成。/varの部分には、バックアップ先として使用したいディレクトリを選択してください。

mkdir -p /var(任意のパス)/test/origin
mkdir /var(任意のパス)/test/destination

作成したディレクトリにテスト用ファイルを作成し、任意の中身を記述

vi /var(先ほど設定したパス)/test/origin/test.txt  //なんでもいいので中身を記述して保存

/etc/rsyncd.confファイルにテスト用の記述を追加

/etc/rsyncd.conf
[test]
path = /var(先ほど設定した同じパス)/test
hosts allow = "LinuxのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false

originからdestinationへテスト同期し、成否を確認

rsync -avz /var/test/origin/test.txt /var/test/destination
tree /var/test
cat /var/test/destination/test.txt

test.txtファイルがdestinationディレクトリに中身ごと複製されていればテスト成功です。

QNAPからLinuxへ、テストファイルを同期

次にQNAPからLinuxへと同期テストを行います。

/etc/rsyncd.confファイルにテスト用の記述をさらに追加

/etc/rsyncd.conf
[test2]
path = /var(先ほど設定した同じパス)/test
hosts allow = "バックアップしたいQNAPのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false

ここでやっとQNAP NASの出番になります。

QNAPのWeb-UIにログインし、順番に操作を行っていきます。

左上にあるメニュータブから[Backup Station]というアプリケーションを選択し、リモートレプリケーションの[Rsync]へと進みます。その後リモートレプリケーションジョブの作成画面へ進み、設定作業を行っていきます。

ジョブの名前は任意です。一目でわかりやすい名前にすると良いと思います。

また、リモートサイトの欄には先ほどまで設定をしていたLinuxの情報を設定します。ユーザ名はバックアップ先フォルダの書き換え権限を持つユーザを指定してください。

ここで、テストの成否を必ず確認しましょう。
処理自体は数秒で終わるものなので、処理中のまま止まっていたり、失敗となった場合は、ここまでの設定でどこかに異常がある可能性が高いです。

処理が終了し、平均送信時間が表示されたら無事成功です。

ソースフォルダにはバックアップ対象のフォルダを、宛先フォルダにはバックアップ先のフォルダを設定します。

今回はテストなので、ソースには万が一破損しても問題がないフォルダ(ない場合は別途作成してください)を指定し、宛先には先ほどパスとして設定したtestフォルダを指定します。

その後任意のオプションを設定し、設定を適用させ同期を開始します。
スクリーンショット-2020-09-28-16.30.47.png
このようにレプリケーションが開始され、無事完了となれば成功です。(一応Linux側でもtreeコマンドなどで確認をしてください)

本同期を実行

無事テストが終了し、問題が無ければ本同期に移ります。

QNAPからLinuxへの同期ではデータ全体を一括で設定することができないため、ジョブの作成時に表示されたソースフォルダから一つひとつ個別に同期する形になります。

したがって、Linux側のrsync設定ファイルにもその数だけ記述を増やす必要があります。下記フォーマットを元に名前とpathを編集し、同期対象の数だけ追記してください。

また、宛先フォルダも同じ数だけ作る必要があります。大元となるディレクトリを作成し、宛先フォルダを全て同じディレクトリに格納すると管理が楽です。

/etc/rsynd.conf
["任意の名前"]
path = "バックアップの宛先フォルダ"
hosts allow = "バックアップしたいQNAPのIPアドレス"
hosts deny = *
list = true
uid = root
gid = root
read only = false

記述し終えたらさっそく同期をしていきましょう。といっても、手順はテストの際とほとんど同じです。
今回はテストではないのでソースフォルダと宛先フォルダを本番用に設定します。

オプションについては任意です。内容は書いてある通りなのでつけたいものをつけたらいいと思います。

今回は、デフォルトでチェックされている
- コピー先のファイルと異なるファイルのみをコピーする
- スパースファイルを効率的に処置する

に加えて、下記2つのオプションにチェックをいれました。
- ファイル圧縮を有効にする
- リモート宛先の余分なファイルを削除する

あとは同期を開始し、レプリケーションが完了となれば無事同期成功となります。テストと同様、Linux側でも成否を確認しておきましょう。

最後に希望のペースでスケジュールを設定し、スケジュールを有効にすることで定期的な自動バックアップができるようになります。(QNAP→LinuxのRsyncでは常時同期に対応していないので最短は1時間おきです)

最後に

QNAPからQNAPへ、LinuxからQNAPへ、などとQNAPをパックアップ先とした資料はたくさん出てくるのですが、逆を行っている資料はあまり多くないのでなかなか大変でした。

QNAPからLinuxがやりたいんじゃという人のお役に立てればと思います。

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

Apache のアクセスログをマージする

複数のログファイルを1つにマージする

日付が4番目の要素の場合のログファイルを、日付順にソートしてマージします

$ sort -nmbsk4 log1.log log2.log > marge.log

それぞれオプションの詳細は以下の通り。

オプション 説明
-n 数値順に評価する。行先頭の文字列 (空白が前置されていても良い) を数値文字列として比較する。 数値文字列は、先頭の - 符号 (なくても良い)、 0 桁以上の数字、 そして小数点と 0 桁以上の数字 (なくても良い) からなる。
-m 与えられたファイル群をまとめてソートしてマージする。 入力ファイルは事前にそれぞれソートされていなければならない。 マージ動作ではなく、ソート動作を複数ファイルにまとめて行うこともできる。 マージ動作が提供されているのは、 (これでよい場合は) こちらの方が高速だからである。
-b 各行の比較の際に、行頭の空白を無視する。
-s 最終手段比較を無効にし、 全てのフィールドの比較結果が同じだった行の順序を、入力の順序のままにする。
-k -K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが推奨される。行の POS1 から POS2 までのフィールドを指定する。 POS2 を含む。 POS2 が省略されたら行末まで。 フィールドと文字位置はそれぞれ 0 から数えはじめる。

https://linuxjm.osdn.jp/html/gnumaniak/man1/sort.1.html より引用。

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

【Linux】/etc/resolv.confファイルの自動更新を無効にする方法(AmazonLinux2)

はじめに

/etc/resolv.confファイルの自動更新を無効にする方法についてメモ

環境情報

  • OS:Amazon Linux 2

/etc/resolv.confファイルの自動更新を無効化

ifcfg設定ファイルを編集

設定ファイル:/etc/sysconfig/network-scripts/ifcfg-eth0

PEERDNSをnoに設定することで/etc/resolv.confファイルが自動的に更新されないようにする

PEERDNS=no

networkサービス再起動

設定を反映するために、networkサービスを再起動

service network restart

参考

/etc/resolv.confを変更したのになぜか元に戻ってしまう

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

【2020年版mac移行】macos 10.15 Catarinaへ移行アシスタントを使わずに1から作業環境を作り上げる(CUI編)

MacBook Pro 2020を購入しました。約3年ぶりです。

PC環境はいつもキレイな状態にしておきたいものですが、最高のタイミングがPC買い替え時です。
PCを買い替えても私はいつも移行アシスタントを使っていません。
マシン環境の再確認、棚卸しができるので結果綺麗な環境を作り直すことができます。

移行作業の記事は3年前にも書いています。
【2017年版】MacOS Sierraに新しく環境構築(主にCUI) - Qiita
今回も同様に記録を残します。

設定作業

CUIの土台を整える

iTerm2のインストール、設定

入手先: 公式サイト

インストール

Macにはターミナルという名前の標準ターミナルアプリが最初から入っていますが、iTerm2が使い勝手が非常によいのでこれをインストールします。
iTerm2 - macOS Terminal Replacement

iTerm2の良さは下記でも紹介されています。
MacのターミナルアプリはiTerm2で決まり!!オススメの設定と基本的な機能まとめ – Webrandum

設定(必要なければスキップ)

配色をJapanesqueに設定しました。
最初から入っているテーマではないのでダウンロードしたものをインポートします。

手順1. テーマが入っているファイルをgit cloneする。

git clone https://github.com/aereal/dotfiles.git

手順2. iTerm2の環境設定 => Import)から「colors/Japanesque/Japanesque.itermcolors」を選択
手順3. 配色から「Japanesque」を選択(Preference => Profiles => Colors => Load Preset => Japanesque)
(手順2でJapanesqueが選択できるようになります。)

下記にも設定方法が記述されています。
iTerm2でColorsにJapanesqueを設定する - Qiita

次にフォントをRictyに設定しました。
読みやすさに定評のあるプログラミングフォントです。

Rictyは別途インストールする必要があります。
下記のコマンドを実行するとインストールされます。

brew tap sanemat/font
brew install ricty
cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf

インストール方法は下記にも記載されています。
Homebrewを使ってRictyをインストール - Qiita

インストール後は、環境設定からフォントを選択します。(Preference => Profiles => Text)

XCodeインストール

入手先: app store

  • Homebrew(後述)のインストールにはCommand Line Toolsのインストールが必要。
  • Command Line ToolsのインストールにはXCodeが必要。

です。

Command Line ToolsはHomebrewをインストールするときに一緒にインストールされるので、ここではXCodeをインストールします。 一度XCode起動させて、「Agree」をクリックしておきます。

Homebrewインストール

入手先: 公式サイトを参考にコマンドラインで入手

macOS(またはLinux)用パッケージマネージャー — Homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

以前はCommand Line Toolsを手動でインストールする必要がありましたが、今は勝手にインストールしてくれます。

作業効率を上げるパッケージ群をインストール

作業の効率を上げるパッケージをインストールしていきます。

brew install neovim
brew install zsh
brew install wget tree fzf jq nkf massren tig fasd rsync

Catarinaからは最初からログインシェルがzshです。
ただし、Homebrew版のzshの方が安定版のバージョンが新しかったのでインストールしました。

Preztoインストール

Preztoはzshフレームワークです。便利なzshの設定が前もって記述されています。

インストール方法は公式に記載されています。所定のディレクトリにgit cloneしてホームディレクトリにシンボリックリンクを作成しています。

sorin-ionescu/prezto: The configuration framework for Zsh

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

Webサーバー構築

ローカル開発環境となるWebサーバーの構築です。

MySQLインストール

Qiitaから流用

CREATE USER `ユーザー名`@localhost IDENTIFIED BY 'パスワード';

GRANT ALL PRIVILEGES ON DB名.* to `ユーザー名`@localhost;

SQLiteインストール

SQLiteを実案件で使うことはほとんどないですが、簡易的なツールで使うことがあります。

brew install sqlite

PHP7.4インストール

最初から入っているのはPHP7.3でした。brew searchをしてHomebrewでインストールできる最新版を調べます。

以下を参考にしました。

/usr/local/opt/php@7.4/bin:

brew search php@7
==> Formulae
php@7.2                    php@7.3                    php@7.4

7.4が最新なので、これをインストールします。

brew install php@7.4

.zshrcにパスを通します。私はもとからPATH=〜で定義していたのでそれに付け足すようにしました。

# ~/.zshrc

PATH=/usr/local/opt/php@7.4/bin:/usr/local/opt/php@7.4/sbin:〜:$PATH

php.iniを調整します。
私は以下を調整しました。

  • 文字エンコーディングをUTF-8に設定※最初からそうなっているかも
  • タイムゾーン設定
  • 環境変数を参照できるように設定(\$_ENV['HOME'] でホームディレクトリを参照できます。)
default_charset = "UTF-8"
date.timezone = Asia/Tokyo
#variables_order = "GPCS"
variables_order = "EGPCS"

PHP用のツールインストール

Composer

PHPのパッケージ管理ツール、ComposerもHomebrewでインストールします。

brew install composer

PshSH

PHPのREPL環境、PshSHをComposerでインストールします。

composer g require psy/psysh:@stable

Apacheインストール

macには最初からApacheはインストールされていますが、Homebrew版の方が使いやすいので別途インストールします。

brew install httpd

設定ファイルの場所を調べます。

apachectl -V

設定ファイルでは、以下を調整しています。

  • mod_rewrite有効化
  • Virtual Host有効化
  • phpモジュールの読み込み
  • 拡張子.phpでアクセスされたときにphpとして処理する
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so # コメントアウト解除

# Virtual hosts
Include /usr/local/etc/httpd/extra/httpd-vhosts.conf # コメントアウト解除

# 以下追記
LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

npmパッケージをインストール(グローバルのみ)

グローバルで使用するnpmパッケージのみをインストールします。

npm install -g yarn

GUIアプリケーションを便利に使うためのコマンド

ForkLift 3をデフォルトのファイルビューアとして開く(Finderの代わりにForkLift 3を開く)

ファイル管理ソフトとしてForkLift 3を使っています。
「Finderで開く」「Reveal in Finder」といったメニューは通常Finderが開きますが、ForkLift 3が開くように設定変更します。

defaults write -g NSFileViewer -string com.binarynights.ForkLift-3

このコマンドの意味は下記に詳しく紹介されています。
ForkLift 3をMacのデフォルトファイラに変更 - Debug Your Life // 暮らしをデバッグする。

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