- 投稿日:2020-07-25T21:00:35+09:00
Powerline-shellっていうBashがイケイケになるやつ入れた
(語彙力)
Powerlineって?
vimのステータスラインやbash,zshなどのプロンプトの視認性が良くなるやつです。
設定がうまく反映されなかったので諦めましたPowerline-shellって?
bashやzshなどのプロンプトの視認性が良くなります。
Powerlineに見た目を似せて作ったようですが、それ以外関係性は無いそうです。
vimはあまり使ってこなかったので、今回はこれを使います環境
- xubuntu 18.04.01
- Python 3.6
- bashを使用
インストール
$ pip3 install powerline-shell以下のスクリプトを.bashrcに追記します
.bashrcfunction _update_ps1() { PS1=$(powerline-shell $?) } if [[ $TERM != linux && ! $PROMPT_COMMAND =~ _update_ps1 ]]; then PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND" fiPowerline-shellのREADMEにカスタマイズ方法も書かれています
おわりに
Qiita初投稿なのでご指摘あれば助かります
- 投稿日:2020-07-25T16:18:18+09:00
Valgrind による動的解析
はじめに
- 動的解析ツールの一つである「Valgrind」について紹介します。
動的解析とは
- ソフトウェアのテスト技法で、対象のソフトウェアを実行するかに着目し2つの分類があります。
種類 説明 例 静的テスト ソースを実行せずに欠陥をチェックする レビュー、コンパイラによるチェック 動的テスト ソースを実行して欠陥をチェックする テスターによる機能テスト、ツールによるチェック
- 特に、ツールを用いて静的テストを行う場合は「静的解析」、動的テストを行う場合は「動的解析」と呼ばれます。
種類 例 静的解析 コンパイラ、CppCheckやSourcetrail 動的解析 Valgrind Valgrindとは
- オープンソースの動的解析ツールに「Valgrind」があります。
- 公式ページ によると、以下のプラットフォームで利用できます。
- Linux
- Solaris
- Android
- Mac OS
機能
- 主に以下のツールがあります。
種類 説明 Memcheck 主にC言語、C++プログラムを対象に、メモリマネジメントに伴う問題をチェックする Cachegrind キャッシュプロファイラプログラム。CPUの I1, D1 and L2キャッシュについて詳細なシュミレーションを実行する。 Callgrind Cachegrindの拡張版でコールグラフを作成し、可視化できる。 Massif ヒープメモリのプロファイラ Helgrind スレッドデバッガ DRD マルチスレッドのC言語、C++プログラムにおけるエラーを検知する。 Memcheck の実行例
対象
- Memcheck の例として、以下の問題点がある C++ プログラムを使用します。
- char配列が固定サイズのため、5文字以上で「バッファオーバーフロー」が生じます。
- new[] で割り当てたヒープメモリを delete[] で解放していないため、「メモリリーク」が生じます。
#include <iostream> #include <string> int main() { char *input = nullptr; input = new char[ 5 ]; std::cin >> input; std::cout << input << std::endl; }実行内容
- ビルドしたプログラムに対して標準入力で「12345」を入力します。
- その際、以下でメモリマネジメントのチェックを行います。
- 「--leak-check=full」で、プログラムの実行後のメモリリークを検知します。
- 「-s」で検知したエラーの一覧を最後に出力します。
valgrind --leak-check=full -s ./Sample実行結果
- 「Invalid write of size 1」, 「Invalid read of size 1」より、1サイズ分、不正なメモリブロックの読み書きが実行されたことが分かります。
- 「LEAK SUMMARY」の「definitely lost」より、割り当てたメモリブロックがプログラムの終了時点で解放されなかったことを指しています。
- なお、g++ (gcc) で「-g」のオプションを付与してビルドしたプログラムの場合、Memcheck の実行時にエラー箇所の行番号も出力します。
Memcheck
==4952== Memcheck, a memory error detector ==4952== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==4952== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info ==4952== Command: ./Sample ==4952== 12345 ==4952== Invalid write of size 1 ==4952== at 0x491E56E: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==4952== by 0x109215: main (in /usr/local/bin/valgrind/Sample) ==4952== Address 0x4daec85 is 0 bytes after a block of size 5 alloc'd ==4952== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x1091FE: main (in /usr/local/bin/valgrind/Sample) ==4952== ==4952== Invalid read of size 1 ==4952== at 0x483EF54: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x498EB1D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==4952== by 0x10923A: main (in /usr/local/bin/valgrind/Sample) ==4952== Address 0x4daec85 is 0 bytes after a block of size 5 alloc'd ==4952== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x1091FE: main (in /usr/local/bin/valgrind/Sample) ==4952== 入力値:12345 ==4952== ==4952== HEAP SUMMARY: ==4952== in use at exit: 5 bytes in 1 blocks ==4952== total heap usage: 4 allocs, 3 frees, 74,757 bytes allocated ==4952== ==4952== 5 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==4952== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x1091FE: main (in /usr/local/bin/valgrind/Sample) ==4952== ==4952== LEAK SUMMARY: ==4952== definitely lost: 5 bytes in 1 blocks ==4952== indirectly lost: 0 bytes in 0 blocks ==4952== possibly lost: 0 bytes in 0 blocks ==4952== still reachable: 0 bytes in 0 blocks ==4952== suppressed: 0 bytes in 0 blocks ==4952== ==4952== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0) ==4952== ==4952== 1 errors in context 1 of 3: ==4952== Invalid read of size 1 ==4952== at 0x483EF54: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x498EB1D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==4952== by 0x10923A: main (in /usr/local/bin/valgrind/Sample) ==4952== Address 0x4daec85 is 0 bytes after a block of size 5 alloc'd ==4952== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x1091FE: main (in /usr/local/bin/valgrind/Sample) ==4952== ==4952== ==4952== 1 errors in context 2 of 3: ==4952== Invalid write of size 1 ==4952== at 0x491E56E: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==4952== by 0x109215: main (in /usr/local/bin/valgrind/Sample) ==4952== Address 0x4daec85 is 0 bytes after a block of size 5 alloc'd ==4952== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==4952== by 0x1091FE: main (in /usr/local/bin/valgrind/Sample) ==4952== ==4952== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
Memcheck (g++にて-gオプションでビルドした場合)
==9843== Memcheck, a memory error detector ==9843== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==9843== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info ==9843== Command: ./Sample ==9843== 12345 ==9843== Invalid write of size 1 ==9843== at 0x492056E: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==9843== by 0x109140: main (Sample.cpp:6) ==9843== Address 0x4db0c85 is 0 bytes after a block of size 5 alloc'd ==9843== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x10912E: main (Sample.cpp:5) ==9843== ==9843== Invalid read of size 1 ==9843== at 0x483EF54: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x4990B1D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==9843== by 0x109167: main (Sample.cpp:7) ==9843== Address 0x4db0c85 is 0 bytes after a block of size 5 alloc'd ==9843== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x10912E: main (Sample.cpp:5) ==9843== 入力値:12345 ==9843== ==9843== HEAP SUMMARY: ==9843== in use at exit: 5 bytes in 1 blocks ==9843== total heap usage: 4 allocs, 3 frees, 74,757 bytes allocated ==9843== ==9843== 5 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==9843== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x10912E: main (Sample.cpp:5) ==9843== ==9843== LEAK SUMMARY: ==9843== definitely lost: 5 bytes in 1 blocks ==9843== indirectly lost: 0 bytes in 0 blocks ==9843== possibly lost: 0 bytes in 0 blocks ==9843== still reachable: 0 bytes in 0 blocks ==9843== suppressed: 0 bytes in 0 blocks ==9843== ==9843== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0) ==9843== ==9843== 1 errors in context 1 of 3: ==9843== Invalid read of size 1 ==9843== at 0x483EF54: strlen (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x4990B1D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==9843== by 0x109167: main (Sample.cpp:7) ==9843== Address 0x4db0c85 is 0 bytes after a block of size 5 alloc'd ==9843== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x10912E: main (Sample.cpp:5) ==9843== ==9843== ==9843== 1 errors in context 2 of 3: ==9843== Invalid write of size 1 ==9843== at 0x492056E: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char> >(std::basic_istream<char, std::char_traits<char> >&, char*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) ==9843== by 0x109140: main (Sample.cpp:6) ==9843== Address 0x4db0c85 is 0 bytes after a block of size 5 alloc'd ==9843== at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==9843== by 0x10912E: main (Sample.cpp:5) ==9843== ==9843== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)Massif の実行例
対象
- 続いて、Massif の例として以下のメモリ使用量をプロファイリングします。
- 1行ごとに読み込んだテキストファイルを標準出力します。
#include <iostream> #include <fstream> #include <string> int main() { std::ifstream ifs( "./sample.txt" ); if ( !ifs ) { std::cerr << "ファイルオープンエラー" << std::endl; return 1; } std::string str = ""; while ( getline( ifs, str ) ) { std::cout << str << std::endl; } return 0; }実行内容
- 「--tool=massif」で Massif を使用します。
- 「--time-unit」でプロファイリング時に使用する時間の単位を指定します。今回は、実行時間が短いプログラムで有用とされている「B」を指定し、ヒープやスタックに割り当てられたまたは解放されたバイトを表示します。
- 「--stacks=yes」でスタックもプロファイリングします。
- 「ms_print」で、Massif の実行後に出力される「massif.out.pid」からメモリ消費量のグラフを表示します、
valgrind --tool=massif --time-unit=B --stacks=yes ./SampleM ms_print massif.out.pid実行結果
- ピーク時に、約82.96KB のメモリが使用されています。
- また、ヒープやスタックに割り当てられたまたは解放されたバイトの合計が約3.317MBとのことです。
- 「Number of snapshots」ではヒープやスタックの推移が表示されています。48番目がピークです。
Massif
-------------------------------------------------------------------------------- Command: ./SampleM Massif arguments: --time-unit=B --stacks=yes ms_print arguments: massif.out.9470 -------------------------------------------------------------------------------- KB 82.96^ ## | # :::: | # :::: | :::::::::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: | ::: :: ::# ::::: 0 +----------------------------------------------------------------------->MB 0 3.317 Number of snapshots: 55 Detailed snapshots: [2, 48 (peak)] -------------------------------------------------------------------------------- n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) -------------------------------------------------------------------------------- 0 0 0 0 0 0 1 83,280 3,712 0 0 3,712 2 134,240 1,328 0 0 1,328 00.00% (0B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -------------------------------------------------------------------------------- n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) -------------------------------------------------------------------------------- 3 199,968 1,136 0 0 1,136 4 296,704 1,328 0 0 1,328 5 352,768 1,328 0 0 1,328 6 422,848 1,328 0 0 1,328 7 517,456 1,328 0 0 1,328 8 585,848 1,176 0 0 1,176 9 627,720 1,432 0 0 1,432 10 694,312 1,416 0 0 1,416 11 762,088 1,384 0 0 1,384 12 838,552 1,368 0 0 1,368 13 906,328 1,400 0 0 1,400 14 974,256 1,584 0 0 1,584 15 1,067,512 1,400 0 0 1,400 16 1,130,512 1,328 0 0 1,328 17 1,193,584 1,328 0 0 1,328 18 1,256,656 1,328 0 0 1,328 19 1,319,728 1,328 0 0 1,328 20 1,382,800 1,328 0 0 1,328 21 1,445,872 1,328 0 0 1,328 22 1,508,944 1,328 0 0 1,328 23 1,572,016 1,328 0 0 1,328 24 1,635,088 1,328 0 0 1,328 25 1,698,160 1,328 0 0 1,328 26 1,761,232 1,328 0 0 1,328 27 1,824,304 1,328 0 0 1,328 28 1,911,904 1,328 0 0 1,328 29 1,967,968 1,328 0 0 1,328 30 2,024,032 1,328 0 0 1,328 31 2,080,096 1,328 0 0 1,328 32 2,136,160 1,328 0 0 1,328 33 2,192,224 1,328 0 0 1,328 34 2,248,288 1,328 0 0 1,328 35 2,304,352 1,408 0 0 1,408 36 2,360,496 1,328 0 0 1,328 37 2,416,696 1,176 0 0 1,176 38 2,472,856 1,144 0 0 1,144 39 2,529,208 1,176 0 0 1,176 40 2,585,272 1,624 0 0 1,624 41 2,683,960 72,920 72,704 8 208 42 2,743,880 73,336 72,704 8 624 43 2,799,960 73,352 72,704 8 640 44 2,856,080 73,392 72,704 8 680 45 2,912,176 74,720 72,704 8 2,008 46 2,996,696 74,392 72,704 8 1,680 47 3,052,760 73,832 72,704 8 1,120 48 3,135,528 84,952 82,392 40 2,520 96.99% (82,392B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. ->85.58% (72,704B) 0x48FAC19: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) | ->85.58% (72,704B) 0x4011B89: call_init.part.0 (dl-init.c:72) | ->85.58% (72,704B) 0x4011C90: call_init (dl-init.c:30) | ->85.58% (72,704B) 0x4011C90: _dl_init (dl-init.c:119) | ->85.58% (72,704B) 0x4001139: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.31.so) | ->09.64% (8,192B) 0x495FDD3: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) | ->09.64% (8,192B) 0x4964006: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) | ->09.64% (8,192B) 0x496493F: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) | ->09.64% (8,192B) 0x109362: main (in /usr/local/bin/valgrind/SampleM) | ->01.21% (1,024B) 0x4AD4E83: _IO_file_doallocate (filedoalloc.c:101) | ->01.21% (1,024B) 0x4AE504F: _IO_doallocbuf (genops.c:347) | ->01.21% (1,024B) 0x4AE40AF: _IO_file_overflow@@GLIBC_2.2.5 (fileops.c:745) | ->01.21% (1,024B) 0x4AE2834: _IO_new_file_xsputn (fileops.c:1244) | ->01.21% (1,024B) 0x4AE2834: _IO_file_xsputn@@GLIBC_2.2.5 (fileops.c:1197) | ->01.21% (1,024B) 0x4AD6540: fwrite (iofwrite.c:39) | ->01.21% (1,024B) 0x4987783: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) | ->01.21% (1,024B) 0x109430: main (in /usr/local/bin/valgrind/SampleM) | ->00.56% (472B) in 1+ places, all below ms_print's threshold (01.00%) -------------------------------------------------------------------------------- n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) -------------------------------------------------------------------------------- 49 3,219,624 83,384 82,392 40 952 50 3,261,536 83,392 82,392 40 960 51 3,303,408 83,488 82,392 40 1,056 52 3,345,280 83,312 82,392 40 880 53 3,387,392 74,624 73,728 16 880 54 3,477,944 1,544 1,024 8 512参考資料
- 投稿日:2020-07-25T15:53:32+09:00
OSD335Xをカスタム基板でU-Bootをカスタムする方法(メモ)
前回までの話
OSD335Xをカスタム基板でU-bootを動かすまで(メモ)
https://qiita.com/nonNoise/items/ef6702fd666421bd5688今回の話
U-Bootの仕組みが少し見えてきたので、その話を。
前回の話に出た重要なコマンド
U-Bootにパッチを充てる
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2018.01/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2018.01/0002-U-Boot-BeagleBone-Cape-Manager.patch
wget -c https://raw.githubusercontent.com/RobertCNelson/Bootloader-Builder/master/patches/v2018.03-rc1/0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patchpatch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch
patch -p1 < 0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patchU-Bootのパッチ
U-Bootのパッチについて調べた。
用はU-Bootをカスタムしてオリジナルボード用にしたいんだ。
まず、Pach がそもそも何をしているかを調べた。
何かのコンパイルした内容かなと思ってソースを探していたが見当たらない。
コンパイル前にパッチ当ててるし・・・もしかして・・・
patchファイルは普通にgitのdiff情報が載ってるファイルだった。
なるほど、パッチコマンドがあったから、何か仕組みがあると思ったら、こういう仕組みか。
そうなると、パッチの差分を把握して、U-Boot本体のソースを書き換えて、差分をパッチにすると自作パッチが出来上がるのかな。
なるほどね、知らなかった。各パッチについて
gitのdiff情報を見ていくと、どのファイルを弄ったか一目でわかるの便利
◎ 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
◎ 0002-U-Boot-BeagleBone-Cape-Manager.patch
◎ 0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patch
パッチの予想
Diffを見てると、同じファイルを別々のパッチで処理してるのがいるので、順番間違えたら衝突するんじゃないかって思った。
とりあえず、ひとつづつ
◎ 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
最初に当てるパッチだね。
am335x_pocketbeagle_defconfigが一番多く修正されてる。
ここは、U-Boot/configsのブロックで、どの機能をy/nするかを設定しているそうだ。◎ 0002-U-Boot-BeagleBone-Cape-Manager.patch
次に当てるパッチ。
board/ti/am335x/board.c が最も変更されている。
ここはボードについてのパッチを充てているような気がしている。
特に、BeagleBone-Capeという、BeagleBoneの中では少し新しめのボード
https://github.com/u-boot/u-boot/tree/master/board/ti/am335x◎ 0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patch
最後に当ててるパッチ。
board/ti/common/board_detect.c が最も変更されている。
commonなので、ボード特有のインターフェース(外部拡張機能)に対して修正しているような気がする。
https://github.com/u-boot/u-boot/tree/master/board/ti/commonで、結局どこを弄ればいいの?
わからない。結局、基礎のU-bootのソースを見て、次にパッチ3種類の差分を把握して、自分がやりたい修正パッチを当てるという流れかな。
Diffなので、修正(削除)した個所はマイナスで表示されるので、とりあえず3種類のパッチを当てて、そのうえでソースを弄ってDiffを残しておくと、再現性高いU-Bootパッチが出来上がるんじゃないかな。気持ち、最新のU-boot版でパッチを作り直したいが、そういうのも差分理解、ソース理解があっての技なのだろう。
- 投稿日:2020-07-25T14:49:29+09:00
Linux(Ubuntu)+Zoom+OBS Studio+効果音で楽しいZoomミーティングができる環境を作ってみた
やりたかったこと
在宅テレワークで楽しくZoomミーティングをできるように、以下のことができる環境を作ってみました。
- Linux(Ubuntu)でZoomミーティング環境の構築
- OBS Studioでシーンを加工
- ミーティング中に効果音をポン出し
必要なのは、Zoom、OBS Studio、OBS Studio用の仮想カメラ、効果音ポン出し用のWebアプリです。Webカメラ以外にはミキサーなどの追加ハードウェアは不要です。
[補足] 私の環境では、後半の仮想マイクの作成はやめました。送信先でどうしてもエコーが消しきれなかったためです。
Zoomのインストール
1.Zoomのダウンロード
https://zoom.us/download にアクセス。
2.Zoomのインストール
ダウンロードが終わると「クリックしてZoomをインストール」と出るのでクリック。
3.インストーラ実行
4.インストール完了
Zoomの青いアイコンができていれば無事インストール完了。
OBS Studioのインストール
レポジトリを引っ張ればaptコマンドでインストールできます。
自分の環境は18.04なので、FFmpegのインストールはスキップして以下のコマンドを実行。他のバージョンの場合や詳細は、以下の参考文献を参照ください。sudo add-apt-repository ppa:obsproject/obs-studio sudo apt update sudo apt install obs-studio参考文献:OBS Project Install instruction
仮想カメラのインストール
ここは以下のサイトの記事を参考にさせて頂き、一部を除きこの通りにやれば無事導入できました。画面スナップ付きで詳しく説明されているので、こちらをご覧いただくほうが良いです。
元記事:[Day of Speed]obs-v4l2sinkを使ってLinux上のOBS Studioで合成した映像をSkypeやZoomに流す
以下は自分の環境で導入した際のコマンドです。1.v4l2loopbackのインストール
sudo apt install v4l2loopback-dkms v4l2loopback-utils2.v4l2loopbackのロード
sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=13.obs-v4l2sinkプラグインのダウンロード
obs-v4l2sink.debパッケージを以下よりダウンロードします。https://github.com/CatxFish/obs-v4l2sink/releases
4.obs-v4l2sinkプラグインのインストール
ダウンロードしたディレクトリに移動して、以下のコマンドでインストールします。sudo apt install ./obs-v4l2sink.deb5.obs-v4l2sinkプラグインのシンボリックリンク作成
インストール先とOBS Studioの参照先が異なるとのことで、シンボリックリンクを以下のコマンドで作成する必要があるとのことです(元記事参照)。cd /usr/lib/x86_64-linux-gnu/obs-plugins sudo ln -s /usr/lib/obs-plugins/v4l2sink.so6.OBS Studio側の設定
OBS Studioの画面右下「コントロール」にある「設定」をクリックし、現れたダイアログの左から「映像」を選択し、基本解像度とカメラ解像度を合わせる必要があるとのこと。元記事の方に画面スナップ付きで丁寧に説明されているので、そちらを参照ください。
7.仮想カメラの有効化
仮想カメラを有効化、すなわちZoomからカメラとして仮想カメラを選択できるようにします。上記のコマンド、設定がうまくいっていれば、OBS Studioの「ツール」メニューに v4l2sink が現れているはずなので、これをクリックします。
以下のダイアログが現れます。
「Start」を押すと仮想カメラが有効化されます。「Auto Start」をチェックしておくと、都度都度設定しなくても OBS Studio 起動時に自動的に仮想カメラが有効化されます。
今度は、Zoom側でカメラとして仮想カメラを選択します。Zoomミーティングが始まったら、ミーティング画面の左下の Start Video の脇の上矢印をクリックするとカメラの選択肢の中にOBS Camが現れているはずなので、これを選択します。仮想カメラの名前は上記のv4l2loopbackのロード時につけたオプションの card_label="OBS Cam" で指定したものになります。
仮想カメラの永続化
上記で仮想カメラが使えるようになるのですが、OSを再起動するとモジュールは自動的に読み込まれないので、都度都度コマンド入力が必要になります。そのためモジュールのロードを永続化しておきます。自分は /etc/modules-load.d を使いましたが、Linux自体にお詳しい方ならもっと適切なお作法があるのかもしれません。
1./etc/modules-load.dにconfファイルを作成
modules-load.dにconfファイルを作っておくと、起動時に指定したカーネルモジュールがロードされます。自分の場合は、obs.confというファイルを以下のように新規に作って /etc/modules-load.d に置きました。
/etc/modules-load.d/obs.confv4l2loopbacksudoするなどしてスーパーユーザで作成してください。
2./etc/modprobe.dにconfファイルを作成
コマンドラインから modprobe でカーネルモジュールをロードする際につけていたオプションを起動時のロード時に引き渡すために、/etc/modprobe.d にオプションを記述しておきます。自分の場合は、obs_opt.confというファイルを以下のように新規に作って /etc/modprobe.d に置きました。
/etc/modprobe.d/obs_opt.confoptions v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1行内の並び順は、オプション追加を意味する options の次に、このオプションをつけるモジュールの名前、その後ろはつけたいオプションをそのまま並べます。
sudoするなどしてスーパーユーザで作成してください。
効果音や音楽を流せるようにするために仮想マイクを作る
OBS Studioは音声ミキサーを備えているので、マイクからの音声に、PC上で再生している音楽をかぶせて放送することが可能です。ただこれは、OBS StudioからYouTubeなどで放送配信しているときには有効なのですが、仮想カメラでZoomに映していてもミキサーの音はZoomには流れません。仮想放送的なプラグインがあるといいのかもしれませんが、残念ながら見つけられませんでした。
ちなみに Share screen している時に音声をPC上の音声をかぶせる場合には、仮想マイク無しでもできます(後述)。ここではミーティング参加者として送っている音声にかぶせる場合に必要な設定を説明しています。
ここでは、仮想マイクを作ってPC上の再生音とマイクからの音声をミックスして流します。仮想マイクの作成については、以下の投稿を参考にしました(というかそのまんま)。
元記事:Redirecting Pulseaudio sink to a virtual source
記事中の最後の回答が作成方法そのものになります。記事中では pactl コマンドが使われていますが、今は pacmd に置き換わっているようです。Linuxのサウンド管理の仕組みの上位層のPulse Audioを使って仮想マイクを作成して、そこにアプリから再生されている音声とマイクからの音声を流し込むように設定することで実現しています。
1.マイク音声とPC上の再生音声をミックスするための Sink を生成
mix-for-virtual-mic という名前で Sink を生成します。
pacmd load-module module-null-sink sink_name=mix-for-virtual-mic sink_properties=device.description=Mix-for-Virtual-Microphone2.PC上の再生音声とマイク音声をミックスする Sink を生成
pacmd load-module module-combine-sink sink_name=virtual-microphone-and-speakers slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo3.マイク音声をミックスするための Sink にループバック
pacmd load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=mix-for-virtual-mic latency_msec=204.ダミーのエコーキャンセル Sink の生成
エコーキャンセラーの出力は使わないので、null sinkを用意しておきます。
pacmd load-module module-null-sink sink_name=silence sink_properties=device.description=silent-sink-for-echo-cancel5.仮想マイクの作成
エコーキャンセラーモジュールを使って仮想マイク(Virtual-Microphone)を作成します。これをZoomから使います。
pacmd load-module module-echo-cancel sink_name=virtual-microphone source_name=virtual-microphone source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null source_properties=device.description=Virtual-Microphone sink_properties=device.description=Virtual-Microphone6.Zoom側の設定
ここまで各コマンドの実行でエラーがでなければ設定は成功しています。作成した各 Sink が Zoom から見えるようになります。Zoom側ではマイクとスピーカーとして以下のように選択します。
これで、例えばPC上で音楽再生しながらマイクでしゃべると、Zoomミーティングの参加者に音楽と声の両方が届くようになります。
仮想マイクの永続化
上記で仮想マイクが使えるようになりますが、仮想カメラの時と同様に、OSを再起動すると消えてしまいますので永続化します。
ここまでの設定はすべて PulseAudio 上で実行していますので、PulseAudioの起動スクリプトに記述しておけば、OS起動時に自動的に Sink が起動します。起動スクリプトは、以下のいずれかになります。自分はシステム設定にしました。
- ~/.pulse/default.pa : 個人設定
- /etc/pulse/default.pa : システム設定
/etc/pulse/default.pa を開くと、すでにいろいろな設定が入っていますので、一番最後に以下を追加します
/etc/pulse/default.paへの追記load-module module-null-sink sink_name=mix-for-virtual-mic sink_properties=device.description=Mix-for-Virtual-Microphone load-module module-combine-sink sink_name=virtual-microphone-and-speakers slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=mix-for-virtual-mic latency_msec=20 load-module module-null-sink sink_name=silence sink_properties=device.description=silent-sink-for-echo-cancel load-module module-echo-cancel sink_name=virtual-microphone source_name=virtual-microphone source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null source_properties=device.description=Virtual-Microphone sink_properties=device.description=Virtual-Microphone効果音の再生
効果音はフリーの適当なものをダウンロードしてプレーヤーで再生すればいいのですが、便利なWebアプリがあったので、それを使っています。これだけ揃っていればネタ的に困らないです。大変ありがたく使わせて頂いています。
効果音ラボ ポン出し https://soundeffect-lab.info/pon/app.html
[補足] OBS StudioのシーンをZoomで画面共有しつつPC上の音声も共有
他にもやり方があるのかもしれませんが、仮想カメラでのOBS Studioのシーンの配信はそのまま画面共有には出ないので、以下の方法でやってみました。
1.OBS Studioのシーンのウィンドウプロジェクターで画面に出す
OBS Studioのシーンから共有したいシーンを選び、右クリックでウィンドウプロジェクターを選択。
すると、シーンが合成された結果がウィンドウとして開きます。
2.Share Screenでアプリの共有としてウィンドウプロジェクターを共有
Share Screenを選ぶとダイアログが出るので、先程開いたウィンドウプロジェクターを共有します。
このとき、ダイアログの左下にある Share computer sound にチェックを入れていると、効果音や音楽などをZoom上に流すことができます(少し前のZoomのバージョンまでは Windows版のみの機能でしたが、今は Linux版でも使えます)。
- 投稿日:2020-07-25T14:23:48+09:00
OSD335Xをカスタム基板でU-bootを動かすまで(メモ)
2020/07/25 初記述
ここまでのあらすじ
OSD3358-512M-BCB を買った。
https://www.mouser.jp/ProductDetail/415-OSD3358-512M-BCB基板作った。
https://twitter.com/nonNoise/status/1278465569499447298?s=20実装した。
https://www.youtube.com/watch?v=acrJceh3bkU電源投入
上手くいった。
シリアル(UART0)よりCCCCCCC・・・・・が大量に流れれ来る。
シリアルの設定は
*Baud rate: 115,200
*Data bits: 8
*Parity: None
*Stop bits: 1
*Flow control: NoneU-bootのバイナリデータの準備
どうもコンパイルが必要らしい。
Ubuntuの環境でコンパイルする。
新規にVertualBoxでUbuntu環境を整えた。ARMのGCC環境セットアップ
tar xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
export CC=[PWD]/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
※[PWD]は各自PWDコマンドでディレクトリアドレスを代入してください。U-Bootのコンパイル
git clone https://github.com/u-boot/u-boot
cd u-boot/
git checkout v2018.01 -b tmp※参考通りにしたので、なんか古い。どこかで最新にする予定。
U-Bootにパッチを充てる
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2018.01/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2018.01/0002-U-Boot-BeagleBone-Cape-Manager.patch
wget -c https://raw.githubusercontent.com/RobertCNelson/Bootloader-Builder/master/patches/v2018.03-rc1/0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patchpatch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch
patch -p1 < 0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patch※こんな仕組みがあるんだ。BeagleBoneの影が見える。カスタムしたい。
U-BootをMakeする。
export CC=[PWD]/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
※[PWD]は各自PWDコマンドでディレクトリアドレスを代入してください。make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
make ARCH=arm CROSS_COMPILE=${CC}必要なファイルをWindowsに引き渡す
ARMのU-Bootには2種類のファイルが必要
u-boot-spl.bin(初段起動用)とu-boot.img(次段起動用)u-boot-spl.binは、u-boot/splの中になります。
TeraTermで書き込む
海外の人もTeraTerm使うんだ。
ターミナルにCCCCC.....とCが流れている状態を確認。
ファイル -> 転送 -> XMODEM -> 送信
u-boot-spl.bin を選択
左下の1K にチェックを入れる
転送される。ファイル -> 転送 -> YMODEM -> 送信
u-boot.img を選択
転送される。
最初、0%の状態で少し間があるけど、根気強く(1分程度)バーが動くまで我慢しましょう。それで?
ただ、この状態だと、二つのU-BootプログラムはRAMに展開されたままなので、resetや電源再投入をすると、再びCCCC....が表示される。
U-Bootのデバックを行うなら、この状態が最も最適。U-Bootのログを見ると、EEPROMがエラーだったり、USBやEthernetがなかったりと文句を言ってくる。
このままではいけないので、U-Bootのカスタムが必要そう。
とりあえず、U-Bootを書き込む手順だけまちょめた。先は長そうだ。(楽しみだが)ふふふ。
参考文献
https://octavosystems.com/forums/topic/osd3358-boot/
本当のメモ(1)
エラーが出たから対処済みだが、念のため残しておく。
bad value (‘armv5’) for ‘-march=’ switch
この記事が正しいか、再度コンパイルしようと思ったら、make ARCH=arm CROSS_COMPILE=${CC}で発生したエラー
どうもUbuntuを再起動させた事で、export がクリアされたらしい。(へぇ~)
なので、コンパイル前に
export CC=[PWD]/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
を再度書くように記事を変更した。本当のメモ(2)
U-Bootをシリアルで書き込むときに、X-MODEMとY-MODEMが出てきて、なんじゃそりゃって顔したので、調べてみた。
https://ja.wikipedia.org/wiki/XMODEM
https://ja.wikipedia.org/wiki/YMODEM
知らなかった(にわかですみません)
TeraTermは便利で使いやすいが、自動化したいときに困るのでPythonでライブラリ探してみた。
https://pythonhosted.org/xmodem/
https://github.com/alexwoo1900/ymodem
なるほど?
- 投稿日:2020-07-25T13:11:55+09:00
ローカルのDockerにLAMP環境を構築
はじめに
ローカルのDockerにLAMP環境を構築する方法です。
以下の環境を構築します。
Windows10Proに構築します。
- CentOS7.4.1708
- PHP7.2
- Laravel5.5
- Apache
- MySQL5.7
- phpMyAdmin]
※予め出来ているDockerファイルを利用するため、Dockerファイルの作成方法などを記載するわけではありません。
Docker Desktopのインストール
以下のサイトからDocker Desktopをインストールします。
https://www.docker.com/get-startedDockerファイル群の配置
以下から、ApaLara.zipをDLし、任意の場所に配置します。
https://github.com/shinjinakatamari/LAMP配置フォルダの追加
DockerDeskTopを開き、のsetting>Resources>FILE SHARINGで設定フォルダを追加し、Apply&Restartをクリックする
コマンドの実施
コマンドプロンプトを起動し、以下のコマンドで、配置フォルダに移動する。
cd c:¥・・・以下のコマンドを実行し、Dockerの作成と立ち上げを行う。
docker-compose build docker-compose up -d起動確認
http://localhost/
上記にアクセスすると、Laravelのページが表示される。http://localhost:8080/
上記にアクセスすると、PHPMYAdminのページが表示される。
- 投稿日:2020-07-25T12:10:47+09:00
Windows10 HDDをサイズが小さいSSDに入れ替えてみた
Windows10 の内蔵ディスクをSSDに換装
CPUはCorei5、MEM 6GB だけど、ディスクがHDD のパソコンを速く出来ないか。
と相談を受けました。
やっぱり、Windows10で古いHDDだと全体的に遅いですよね。で、HDDの使用量が少なかったので、安価に済ませるためHDDよりも容量の少ないSSDに移行してみました。
換装後はなかなか快適なパソコンになってます。その時の事をメモにします。
- 作業メモです。
環境によっては同じ結果が得られないかも知れません。- こんな事をするためのソフトが売られてます。 大事なパソコンの場合そういった物を利用した方が無難だと思います。
準備する物
- 換装用のSSD:今回は crucial BX500 240GB 3,480円を使いました。
- 2.5インチHDDケース(SSD接続用):持ってたのを使用、買っても2千円しない位
- Linuxを起動するためのUSBメモリ:USBメモリ起動のKali Linuxを使いました。
HDDのデータ整理(いらないファイルを削除)
コピーするディスクの最後のパーティション(通常最後のドライブ)から、不要なファイルを削除するか、別のドライブやUSBメモリなどに退避して空き容量を確保します。
確保する容量は HDD容量とSSD容量の差分以上になるようにしてください。HDD パーティション容量変更
USBメモリから起動したKali LinuxのGpartedを使ってパーティションの容量を削減します。
削減後のHDD使用容量がSSD容量より小さくなるようにしてください。
未使用領域は換装後にシステムに組み入れるから無駄になるわけじゃありません。
という事で、ギリギリを狙うわず思い切って減らしてください。
使用量がSSDより大きい状態だと、コピーした後ファイルシステムの修復が必要になります。
- パーティションを選択
- Resize/Move をクリック
- バーを移動するか、数値を指定して FreeSpaceFollowingを確保
- Resize/Moveをクリック
- Applyをクリック
この時 Free space preceding は絶対いじらないでください。
HDD to SSD のデータコピー
ddコマンドを使って、HDDからSSDにデータをコピーします。
コピー対象ディスクの確認
fdiskコマンドを利用してコピー対象ディスクを特定します。
ディスクのメーカー/モデル/容量/パーティション構成などから判断してください。以下の実行例の場合
コピー元:/dev/sda
コピー先:/dev/sdc
になります。kali@kali:~$ sudo /sbin/fdisk -l Disk /dev/sda: 232.91 GiB, 250059350016 bytes, 488397168 sectors Disk model: TOSHIBA MK2576GS Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x6b6fd128 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 25167871 25165824 12G 27 Hidden NTFS WinRE /dev/sda2 * 25167872 25577471 409600 200M 7 HPFS/NTFS/exFAT /dev/sda3 25577472 256985087 231407616 110.4G 7 HPFS/NTFS/exFAT /dev/sda4 256985088 420825087 163840000 78.1G 7 HPFS/NTFS/exFAT Disk /dev/sdb: 59.49 GiB, 63864307712 bytes, 124734976 sectors Disk model: Flash Drive Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x2259da88 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 64 5625087 5625024 2.7G 17 Hidden HPFS/NTFS /dev/sdb2 5625088 5626559 1472 736K 1 FAT12 Disk /dev/loop0: 2.4 GiB, 2565337088 bytes, 5010424 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdc: 223.58 GiB, 240057409536 bytes, 468862128 sectors Disk model: 00SSD1 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes kali@kali:~$コピー実行
bsとcountはこんな風に決めています。
bs=16000000:コピー単位(ある程度大きい方がコピー性能が上がります)
count=15000: コピー容量/bs (240GB/16MB=15000)
※ちゃんと計算して本当に必要な容量だけコピーするのが良いんでしょうけど、面倒だったので適当です。kali@kali:~$ sudo dd if=/dev/sda of=/dev/sdc bs=16000000 count=15000この時のコピーは2時間程度掛かりました。
コピー経過の確認(任意)
別のターミナルを開いて dd にUSR1シグナルを送ることで dd の進捗を確認する事が出来ます。
kali@kali:~$ sudo bash root@kali:/home/kali# watch -n 60 pkill -USR1 ddディスクの入れ替え
ディスクのコピーが完了したら、パソコンのディスクを入れ替えてください。
入れ替えたディスクを使ってパソコンを起動
パーティション容量を拡張
コピー元HDDで確保したFree Spaceをファイルシステムに組み込みます。
コンピュータの管理>記憶域>ディスクの管理 で最後のパーティションの容量を拡張します。完了!
注意:
作業中スクリーンショットを取り忘れてたので、HDDでの操作画像に換装後のSSDで操作を再現した画像を使ってます。
- 投稿日:2020-07-25T10:52:45+09:00
Raspberry PIにパスワードなしでsshでログインする(鍵認証)
モチベーション
RaspberryPiをサーバっぽく使っているとsshでログインする機会が増えますよね。毎回パスワードを打つのは面倒なので鍵認証を設定しましたというお話です。
Linuxの基本的なお作法だと思うので調べたらいくらでも出てくるのですが、毎回調べるのすらめんどくさいのでここに残しておきます。
authorized_keysの作成
raspberry pi 上で
~/.ssh
の作成(まだない場合のみ)$ mkdir ~/.ssh $ chmod 700 ~/.sshauthorized_keysの作成
$ touch ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys公開鍵の作成
自分のPCで(ログインコマンドを打つ側のpc)
$ ssh-keygen -t rsaいろいろ聞かれますが、とりあえずは全てDefaultで(Enter Keyを押し続ける)
以下に、秘密鍵と公開鍵が作られます。
$ ls ~/.ssh id_rsa id_rsa.pub
id_rsa.pub
をraspberry piに転送する。
注意:RaspberryPi上に同じ名前のファイルがあると意味不明、最悪の場合上書き保存されてしまうのでリネームして転送することをお勧めします。私はimacの鍵なので*.imac
としました。$ scp id_rsa.pub pi@xxx.xxx.xxx.xxx:~/.ssh/id_rsa.pub.imac
公開鍵の登録
再びraspberry piに戻り
~/.ssh
で作業を進めます。
転送がうまく行っていれば以下のようにファイルが置かれます。~/.ssh $ ls authorized_key id_rsa.pub.imac
id_rsa.pub.imac
の内容をauthorized_keysに登録します。cat id_rsa.pub.imac >> ~/.ssh/authorized_keys完成
これで、次からsshでログインする際にパスワードを聞かれることはなくなります。
- 投稿日:2020-07-25T09:03:31+09:00
mvコマンドでファイル(ディレクトリ)名の変更、移動
mvコマンドを使えば、
①ファイル(ディレクトリ名)の変更
②ファイル(ディレクトリ)の移動
の2種類の処理を行うことができます。
ファイル(ディレクトリ)名の変更
$ mv < 変更前のファイル(ディレクトリ)名 > < 変更後のファイル(ディレクトリ)名 >例)
test.txt
というファイルをhoge.txt
というファイル名に変更する場合$ mv test.txt hoge.txtなお、上記の例でコマンドを実行した時に
既にhoge.txtファイルが存在していた場合は、test.txtを名前変更したと同時にもともとあったhoge.txtが上書きされてしまいます。
それを防ぐには、その1つの方法として-i
オプションを付けます。
これにより、mvコマンド実行時に「上書きしていいですか?」と確認されるようになります。$ mv -i test.txt hoge.txtファイルの上書き防止系のオプションは他にもありますので、この記事の最後にオプションを一覧にまとめておきました。
また、mvコマンドでは1つずつしかファイル名の変更はできないので、複数のファイルを一括して変更したい時は
renameコマンド
を使います。ファイル(ディレクトリ)の移動
$ mv < ファイル(ディレクトリ)名 > < 移動先のディレクトリ名 >例)
sample.txt
というファイルをdir
というディレクトリに移動する場合$ mv sample.txt dirちなみに、移動先のディレクトリに
/.
を付けて、dir/.
とした方が安全です。
この/.
には、「ディレクトリ直下の」という意味があります。
理由として、もし「sample.txtファイルをdirディレクトリに移動する」という指示のコマンドを実行した時にdirディレクトリが存在していなかった場合、単にsample.txt
ファイルがdir
という名前のファイルに変更されてしまうという挙動をとるためです。
ファイル名の変更の際の構文である
$ mv < 変更前のファイル(ディレクトリ)名 > < 変更後のファイル(ディレクトリ)名 >
が適用されてしまっているのですね。
なので、以下のようにコマンドを打つのが安全です。$ mv sample.txt dir/.複数のファイル(ディレクトリ)をまとめてディレクトリに移動
mvコマンドでは、複数のファイルを移動することもできます。
例)
sample01.txt
,sample02.txt
,sample03.txt
をまとめてdir
というディレクトリに移動する場合$ mv sample01.txt sample02.txt sample03.txt dir/.ファイル(ディレクトリ)をカレントディレクトリの一つ上の階層に移動
$ mv < ファイル(ディレクトリ)名 > ../mvコマンドの主なオプション一覧
オプション 説明 -b
(--backup)移動先に同名のファイルがあれば、バックアップを取ってから上書きする -f
(-force)移動先に同名のファイルがあれば、強制的に上書きする -i
(–interactive)移動先に同名のファイルがあれば、上書きしてOKか確認する -n
(–no-clobber)移動先に同名のファイル(ディレクトリ)があったら上書きしない -v
(–verbose)移動処理行う際の詳細情報を表示する