20200725のLinuxに関する記事は10件です。

CentOS8のインストール

CentOS8のインストール

文字だけではなく、動画にしてみた。

https://youtu.be/A3y5pghscnA

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

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に追記します

.bashrc
function _update_ps1() {
    PS1=$(powerline-shell $?)
}

if [[ $TERM != linux && ! $PROMPT_COMMAND =~ _update_ps1 ]]; then
    PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

これでターミナルを再起動するとこのように反映されてます
スクリーンショット_2020-07-25_20-57-47.png

Powerline-shellのREADMEにカスタマイズ方法も書かれています

おわりに

Qiita初投稿なのでご指摘あれば助かります

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

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

参考資料

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

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.patch

patch -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

U-Bootのパッチ

U-Bootのパッチについて調べた。
用はU-Bootをカスタムしてオリジナルボード用にしたいんだ。
まず、Pach がそもそも何をしているかを調べた。
何かのコンパイルした内容かなと思ってソースを探していたが見当たらない。
コンパイル前にパッチ当ててるし・・・もしかして・・・
image.png

patchファイルは普通にgitのdiff情報が載ってるファイルだった。
なるほど、パッチコマンドがあったから、何か仕組みがあると思ったら、こういう仕組みか。
そうなると、パッチの差分を把握して、U-Boot本体のソースを書き換えて、差分をパッチにすると自作パッチが出来上がるのかな。
なるほどね、知らなかった。

各パッチについて

gitのdiff情報を見ていくと、どのファイルを弄ったか一目でわかるの便利

◎ 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch

image.png

◎ 0002-U-Boot-BeagleBone-Cape-Manager.patch

image.png

◎ 0002-NFM-Production-eeprom-assume-device-is-BeagleBone-Bl.patch

image.png

パッチの予想

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版でパッチを作り直したいが、そういうのも差分理解、ソース理解があっての技なのだろう。

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

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 にアクセス。dl.png

2.Zoomのインストール

ダウンロードが終わると「クリックしてZoomをインストール」と出るのでクリック。
inst.png

3.インストーラ実行

インストーラが起動するので、「インストール」をクリック。
inst2.png

4.インストール完了
Zoomの青いアイコンができていれば無事インストール完了。
icon.png

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-utils

2.v4l2loopbackのロード

sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1

3.obs-v4l2sinkプラグインのダウンロード
obs-v4l2sink.debパッケージを以下よりダウンロードします。

https://github.com/CatxFish/obs-v4l2sink/releases

4.obs-v4l2sinkプラグインのインストール
ダウンロードしたディレクトリに移動して、以下のコマンドでインストールします。

sudo apt install ./obs-v4l2sink.deb

5.obs-v4l2sinkプラグインのシンボリックリンク作成
インストール先とOBS Studioの参照先が異なるとのことで、シンボリックリンクを以下のコマンドで作成する必要があるとのことです(元記事参照)。

cd /usr/lib/x86_64-linux-gnu/obs-plugins
sudo ln -s /usr/lib/obs-plugins/v4l2sink.so 

6.OBS Studio側の設定

OBS Studioの画面右下「コントロール」にある「設定」をクリックし、現れたダイアログの左から「映像」を選択し、基本解像度とカメラ解像度を合わせる必要があるとのこと。元記事の方に画面スナップ付きで丁寧に説明されているので、そちらを参照ください。

7.仮想カメラの有効化

仮想カメラを有効化、すなわちZoomからカメラとして仮想カメラを選択できるようにします。上記のコマンド、設定がうまくいっていれば、OBS Studioの「ツール」メニューに v4l2sink が現れているはずなので、これをクリックします。

obsmenu.png

以下のダイアログが現れます。

v4l2sink_dlg.png

「Start」を押すと仮想カメラが有効化されます。「Auto Start」をチェックしておくと、都度都度設定しなくても OBS Studio 起動時に自動的に仮想カメラが有効化されます。

今度は、Zoom側でカメラとして仮想カメラを選択します。Zoomミーティングが始まったら、ミーティング画面の左下の Start Video の脇の上矢印をクリックするとカメラの選択肢の中にOBS Camが現れているはずなので、これを選択します。仮想カメラの名前は上記のv4l2loopbackのロード時につけたオプションの card_label="OBS Cam" で指定したものになります。

obscam.png

仮想カメラの永続化

上記で仮想カメラが使えるようになるのですが、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.conf
v4l2loopback

sudoするなどしてスーパーユーザで作成してください。

2./etc/modprobe.dにconfファイルを作成

コマンドラインから modprobe でカーネルモジュールをロードする際につけていたオプションを起動時のロード時に引き渡すために、/etc/modprobe.d にオプションを記述しておきます。自分の場合は、obs_opt.confというファイルを以下のように新規に作って /etc/modprobe.d に置きました。

/etc/modprobe.d/obs_opt.conf
options 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-Microphone

2.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-stereo

3.マイク音声をミックスするための Sink にループバック

pacmd load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=mix-for-virtual-mic latency_msec=20

4.ダミーのエコーキャンセル Sink の生成

エコーキャンセラーの出力は使わないので、null sinkを用意しておきます。

pacmd load-module module-null-sink sink_name=silence sink_properties=device.description=silent-sink-for-echo-cancel

5.仮想マイクの作成

エコーキャンセラーモジュールを使って仮想マイク(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-Microphone

6.Zoom側の設定

ここまで各コマンドの実行でエラーがでなければ設定は成功しています。作成した各 Sink が Zoom から見えるようになります。Zoom側ではマイクとスピーカーとして以下のように選択します。

mix.png

これで、例えば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
pon.png

[補足] OBS StudioのシーンをZoomで画面共有しつつPC上の音声も共有

他にもやり方があるのかもしれませんが、仮想カメラでのOBS Studioのシーンの配信はそのまま画面共有には出ないので、以下の方法でやってみました。

1.OBS Studioのシーンのウィンドウプロジェクターで画面に出す

OBS Studioのシーンから共有したいシーンを選び、右クリックでウィンドウプロジェクターを選択。

winprj.png

すると、シーンが合成された結果がウィンドウとして開きます。

2.Share Screenでアプリの共有としてウィンドウプロジェクターを共有

Share Screenを選ぶとダイアログが出るので、先程開いたウィンドウプロジェクターを共有します。

sharescreen.png

このとき、ダイアログの左下にある Share computer sound にチェックを入れていると、効果音や音楽などをZoom上に流すことができます(少し前のZoomのバージョンまでは Windows版のみの機能でしたが、今は Linux版でも使えます)。

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

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

115929400_3171100156300596_3359527061697752589_o.jpg

電源投入

上手くいった。

シリアル(UART0)よりCCCCCCC・・・・・が大量に流れれ来る。

シリアルの設定は
*Baud rate: 115,200
*Data bits: 8
*Parity: None
*Stop bits: 1
*Flow control: None

U-bootのバイナリデータの準備

どうもコンパイルが必要らしい。

Ubuntuの環境でコンパイルする。
新規にVertualBoxでUbuntu環境を整えた。

ARMのGCC環境セットアップ

wget -c https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

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.patch

patch -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 にチェックを入れる
 転送される。

コメント 2020-07-25 014135.png

ファイル -> 転送 -> YMODEM -> 送信
 u-boot.img を選択
 転送される。
コメント 2020-07-25 014502.png
最初、0%の状態で少し間があるけど、根気強く(1分程度)バーが動くまで我慢しましょう。

無事に?起動する。
コメント 2020-07-25 014806.png

それで?

ただ、この状態だと、二つのU-BootプログラムはRAMに展開されたままなので、resetや電源再投入をすると、再びCCCC....が表示される。
U-Bootのデバックを行うなら、この状態が最も最適。

U-Bootのログを見ると、EEPROMがエラーだったり、USBやEthernetがなかったりと文句を言ってくる。
このままではいけないので、U-Bootのカスタムが必要そう。
とりあえず、U-Bootを書き込む手順だけまちょめた。

先は長そうだ。(楽しみだが)ふふふ。

参考文献

https://processors.wiki.ti.com/index.php?title=AM335x_U-Boot_User%27s_Guide&oldid=151545#Boot_Over_UART

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
なるほど?

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

ローカルの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-started

Dockerファイル群の配置

以下から、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のページが表示される。

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

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より大きい状態だと、コピーした後ファイルシステムの修復が必要になります。

  • 削減前 Screenshot_2020-07-24_13-07-13.png
  1. パーティションを選択
  2. Resize/Move をクリック
  3. バーを移動するか、数値を指定して FreeSpaceFollowingを確保
  4. Resize/Moveをクリック
  5. Applyをクリック

この時 Free space preceding は絶対いじらないでください。

  • 削減後 Screenshot_2020-07-24_13-45-20.png

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をファイルシステムに組み込みます。
コンピュータの管理>記憶域>ディスクの管理 で最後のパーティションの容量を拡張します。

  • 最後のパーティションを選択しボリュームの拡張を選択
    コメント 2020-07-24 135428.png

  • メニューに従って操作1
    コメント 2020-07-24 135507.png

  • メニューに従って操作2
    コメント 2020-07-24 135520.png

  • メニューに従って操作3
    コメント 2020-07-24 135545.png

  • メニューに従って操作4
    コメント 2020-07-24 135600.png

完了!

注意:
作業中スクリーンショットを取り忘れてたので、HDDでの操作画像に換装後のSSDで操作を再現した画像を使ってます。

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

Raspberry PIにパスワードなしでsshでログインする(鍵認証)

モチベーション

RaspberryPiをサーバっぽく使っているとsshでログインする機会が増えますよね。毎回パスワードを打つのは面倒なので鍵認証を設定しましたというお話です。

Linuxの基本的なお作法だと思うので調べたらいくらでも出てくるのですが、毎回調べるのすらめんどくさいのでここに残しておきます。

authorized_keysの作成

raspberry pi 上で~/.sshの作成(まだない場合のみ)

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

authorized_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でログインする際にパスワードを聞かれることはなくなります。

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

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)
移動処理行う際の詳細情報を表示する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む