2020年4月19日日曜日

verilog : 多ビット信号の配列 (二次元配列)

目的:

多ビット信号の配列(二次元配列)を使用する。

宣言:

レジスタ(メモリ)
reg  [7:0] r_data[0:127]    // 8bit幅 128 個のレジスタ宣言

信号(Wire)
wire [7:0] w_data[0:127]    // 8bit幅 128 組の ワイヤ宣言

Verilog では ポートに二次元配列は使用できない。

代入:

wire       sig_1b ;
wire [7:0] sig_8b ;
assign w_data[14] = sig ;        // 8bit 幅の信号を 15番目の 8bit信号 に代入
assign sig_1b = w_data[127][7] ; // 1bit 幅の信号に 127番目の bit7(MSB)を代入

例:

回路図

 ( 各BIT_WIDTH 幅の FF の MSB を 束ねて dt_msb 信号として出力 )

verilog (モジュール)
FF は generate 文を使用して for - next で 記述。
ポートは二次元配列で記述できない為、内部で宣言した wire に 1つづつ assign 。
二次元配列から一次元配列へのアサインは「多ビット信号の配列(二次元配列)と入出力ポート 」を参照。
// -----------------------------------------------------
//   Sample module
//
//   Module Name : test_md1
//   Version     : 0.00
// -----------------------------------------------------
 
module test_md1 #(                      // Module name : test
  parameter BIT_WIDTH = 4 ,             // parameter list
  parameter DATA_NUM  = 8               // parameter list
) (                                     //
  clr,                                  // port list
  clk,
  enable,
  set,
  data_1,
  data_2,
  data_3,
  data_4,
  data_5,
  data_6,
  data_7,
  data_8,
  out_dt1,
  out_dt2,
  out_dt3,
  out_dt4,
  out_dt5,
  out_dt6,
  out_dt7,
  out_dt8,
  dt_msb
) ;
 
// port declaration ----------------
input                  clr ;
input                  clk ;
input                  enable ;
input                  set ;
input  [BIT_WIDTH-1:0] data_1 ;
input  [BIT_WIDTH-1:0] data_2 ;
input  [BIT_WIDTH-1:0] data_3 ;
input  [BIT_WIDTH-1:0] data_4 ;
input  [BIT_WIDTH-1:0] data_5 ;
input  [BIT_WIDTH-1:0] data_6 ;
input  [BIT_WIDTH-1:0] data_7 ;
input  [BIT_WIDTH-1:0] data_8 ;
output [BIT_WIDTH-1:0] out_dt1 ;
output [BIT_WIDTH-1:0] out_dt2 ;
output [BIT_WIDTH-1:0] out_dt3 ;
output [BIT_WIDTH-1:0] out_dt4 ;
output [BIT_WIDTH-1:0] out_dt5 ;
output [BIT_WIDTH-1:0] out_dt6 ;
output [BIT_WIDTH-1:0] out_dt7 ;
output [BIT_WIDTH-1:0] out_dt8 ;
output [DATA_NUM-1:0]  dt_msb ;
 
// parameter declaration -----------
parameter DLY = 1 ;
 
// internal signal declaration -----
wire                 set_enable ;

wire [BIT_WIDTH-1:0] in_data[1:DATA_NUM] ;
reg  [BIT_WIDTH-1:0] lt_data[1:DATA_NUM] ;
 
// logical description -------------
assign set_enable = enable & set ;

assign in_data[1] = data_1 ;
assign in_data[2] = data_2 ;
assign in_data[3] = data_3 ;
assign in_data[4] = data_4 ;
assign in_data[5] = data_5 ;
assign in_data[6] = data_6 ;
assign in_data[7] = data_7 ;
assign in_data[8] = data_8 ;

generate
  genvar i ;
  for (i=1; i<DATA_NUM+1; i=i+1) 
    begin : dtlatch
      always @(posedge clk or posedge clr)
        if (clr) 
          lt_data[i]  <= #DLY  {BIT_WIDTH{1'b0}} ;
        else if (set_enable)
            lt_data[i]  <= #DLY  in_data[i] ;

      assign dt_msb[i-1] = lt_data[i][BIT_WIDTH-1] ;
    end

endgenerate
 
assign out_dt1 = lt_data[1] ;
assign out_dt2 = lt_data[2] ;
assign out_dt3 = lt_data[3] ;
assign out_dt4 = lt_data[4] ;
assign out_dt5 = lt_data[5] ;
assign out_dt6 = lt_data[6] ;
assign out_dt7 = lt_data[7] ;
assign out_dt8 = lt_data[8] ;
 
endmodule

verilog (上位階層)
//   Sample test
//
//   Module Name : test
//   Version     : 0.00
// -----------------------------------------------------
 
module test(
  clr,                                  // port list
  clk,
  enable,
  set,
  data_1,
  data_2,
  data_3,
  data_4,
  data_5,
  data_6,
  data_7,
  data_8,
  out_dt1,
  out_dt2,
  out_dt3,
  out_dt4,
  out_dt5,
  out_dt6,
  out_dt7,
  out_dt8,
  dt_msb
) ;
 
// port declaration ----------------
input        clr ;
input        clk ;
input        enable ;
input        set ;
input  [7:0] data_1 ;
input  [7:0] data_2 ;
input  [7:0] data_3 ;
input  [7:0] data_4 ;
input  [7:0] data_5 ;
input  [7:0] data_6 ;
input  [7:0] data_7 ;
input  [7:0] data_8 ;
output [7:0] out_dt1 ;
output [7:0] out_dt2 ;
output [7:0] out_dt3 ;
output [7:0] out_dt4 ;
output [7:0] out_dt5 ;
output [7:0] out_dt6 ;
output [7:0] out_dt7 ;
output [7:0] out_dt8 ;
output [7:0]  dt_msb ;
 
test_md1 #(
  .BIT_WIDTH (8) 
)i_test(
  .clr      (clr),
  .clk      (clk),
  .enable   (enable),
  .set      (set),
  .data_1   (data_1),
  .data_2   (data_2),
  .data_3   (data_3),
  .data_4   (data_4),
  .data_5   (data_5),
  .data_6   (data_6),
  .data_7   (data_7),
  .data_8   (data_8),
  .out_dt1  (out_dt1),
  .out_dt2  (out_dt2),
  .out_dt3  (out_dt3),
  .out_dt4  (out_dt4),
  .out_dt5  (out_dt5),
  .out_dt6  (out_dt6),
  .out_dt7  (out_dt7),
  .out_dt8  (out_dt8),
  .dt_msb   (dt_msb)
) ;

endmodule


verilog (テストベンチ, 呼び出し側)
// ----------------------------------------------------------
//   test bench
//
//     for test.v
// ----------------------------------------------------------

`timescale 1ns / 1ps

module testbench ;

// testbench logic -------------------
reg   clr;
reg   clk;
reg   [7:0] in_data_1 ;
reg   [7:0] in_data_2 ;
reg   [7:0] in_data_3 ;
reg   [7:0] in_data_4 ;
reg   [7:0] in_data_5 ;
reg   [7:0] in_data_6 ;
reg   [7:0] in_data_7 ;
reg   [7:0] in_data_8 ;
reg   enable ;
reg   set ;
wire  [7:0] out_data_1 ;
wire  [7:0] out_data_2 ;
wire  [7:0] out_data_3 ;
wire  [7:0] out_data_4 ;
wire  [7:0] out_data_5 ;
wire  [7:0] out_data_6 ;
wire  [7:0] out_data_7 ;
wire  [7:0] out_data_8 ;

wire  [7:0] data_msb ;

test  i_test(
  .clr      (clr),
  .clk      (clk),
  .enable   (enable),
  .set      (set),
  .data_1   (in_data_1),
  .data_2   (in_data_2),
  .data_3   (in_data_3),
  .data_4   (in_data_4),
  .data_5   (in_data_5),
  .data_6   (in_data_6),
  .data_7   (in_data_7),
  .data_8   (in_data_8),
  .out_dt1  (out_data_1),
  .out_dt2  (out_data_2),
  .out_dt3  (out_data_3),
  .out_dt4  (out_data_4),
  .out_dt5  (out_data_5),
  .out_dt6  (out_data_6),
  .out_dt7  (out_data_7),
  .out_dt8  (out_data_8),
  .dt_msb   (data_msb)
) ;

initial begin
  clk = 0 ;
  clr = 1 ;
  #10 clr = 0 ;
  forever begin
    #10 clk = ~clk ;
  end
end

// scenario --------------------------
initial begin
  $dumpfile("tb.vcd");
  $dumpvars(0,testbench) ;

  enable    = 1'b0 ;
  set       = 1'b0 ;
  in_data_1 = 8'd0 ;
  in_data_2 = 8'd0 ;
  in_data_3 = 8'd0 ;
  in_data_4 = 8'd0 ;
  in_data_5 = 8'd0 ;
  in_data_6 = 8'd0 ;
  in_data_7 = 8'd0 ;
  in_data_8 = 8'd0 ;

  #200 enable    = 1'b1 ;
       in_data_1 = 8'h01 ;
       in_data_2 = 8'h92 ;
       in_data_3 = 8'h23 ;
       in_data_4 = 8'hb4 ;
       in_data_5 = 8'hc5 ;
       in_data_6 = 8'h56 ;
       in_data_7 = 8'he7 ;
       in_data_8 = 8'h78 ;
  #101 set       = 1'b1 ;
  #20  set       = 1'b0 ; 
  #100 enable    = 1'b0 ;
       in_data_1 = 8'hff ;
       in_data_2 = 8'hff ;
       in_data_3 = 8'hff ;
       in_data_4 = 8'hff ;
       in_data_5 = 8'hff ;
       in_data_6 = 8'hff ;
       in_data_7 = 8'hff ;
       in_data_8 = 8'hff ;
  #101 set       = 1'b1 ;
  #20  set       = 1'b0 ; 
  #200 ;
  $finish;
  end

endmodule

シミュレーション結果


2020年4月18日土曜日

verilog : module のパラメタライズ

目的:

ビット幅等をパラメータ化してmoduleを再利用しやすいようにする。

構造:


module側

module <モジュール名> #(
 パラメータリスト
) (
 ポートリスト
) ;
 パラメータ宣言 (PARAMETER)
 ネット宣言 (wire, reg)
 論理記述
  ( assign, always, module接続, 等)
endmodule

 呼び出し側


 <モジュール名>  #(
 パラメータリスト
) <インスタンス名> (
 ポートリスト
) ;

呼び出し側の #( パラメータリスト) は省略可能。
省略時は、モジュールで設定したデフォルト値を使用。
 

パラメータ化された reg への固定値代入


固定値の代入は、連接を使用して以下の様に書ける。
parameter  WID = 8 ;
reg [WID-1:0]  data ;
( all '1' を代入 )
 data <= {WID{1'b1}} ;
( 下位 4bit に 0x7 を大入)
 data <= {{(WID-4){1'b0}}, {4'h7}} ;

例:

ビット幅をパラメータ化した例を示す。
回路図
 verilog (モジュール)
モジュールは、デフォルト 4bit 幅で記述
// -----------------------------------------------------
//   Sample module
//
//   Module Name : test_md1
//   Version     : 0.00
// -----------------------------------------------------
 
module test_md1 #(                      // Module name : test
  parameter BIT_WIDTH = 4               // parameter list
) (                                     //
  clr,                                  // port list
  clk,
  enable,
  set,
  data,
  out_dt
) ;
 
// port declaration ----------------
input                  clr ;
input                  clk ;
input                  enable ;
input                  set ;
input  [BIT_WIDTH-1:0] data ;
output [BIT_WIDTH-1:0] out_dt ;
 
// parameter declaration -----------
parameter DLY = 1 ;
 
// internal signal declaration -----
wire                 set_enable ;

reg  [BIT_WIDTH-1:0] lt_data ;
 
// logical description -------------
assign set_enable = enable & set ;
 
always @(posedge clk or posedge clr)
  if (clr) 
    lt_data  <= #DLY  {BIT_WIDTH{1'b0}} ;
//  lt_data  <= #DLY {{(BIT_WIDTH-4){1'b0}},{4'h7}} ;
else if (set_enable)
    lt_data  <= #DLY  data ;
 
assign out_dt = lt_data ;
 
endmodule

 verilog (上位階層)
// -----------------------------------------------------
//   Sample test
//
//   Module Name : test
//   Version     : 0.00
// -----------------------------------------------------
 
module test (
  clr,
  clk,
  enable,
  set,
  data,
  out_dt
) ;

// port declaration ----------------
input        clr ;
input        clk ;
input        enable ;
input        set ;
input  [7:0] data ;
output [7:0] out_dt ;
 
// testbench logic -------------------

test_md1 #(
  .BIT_WIDTH (8) 
)i_test_md1(
  .clr    (clr),
  .clk    (clk),
  .enable (enable),
  .set    (set),
  .data   (data),
  .out_dt (out_dt)
) ;

endmodule

 verilog (テストベンチ, 呼び出し側)
// ----------------------------------------------------------
//   test bench
//
//     for test.v
// ----------------------------------------------------------

`timescale 1ns / 1ps

module testbench ;

// testbench logic -------------------
reg   clr;
reg   clk;
reg   [7:0] in_data ;
reg   enable ;
reg   set ;
wire  [7:0] out_data ;

test  i_test(
  .clr    (clr),
  .clk    (clk),
  .enable (enable),
  .set    (set),
  .data   (in_data),
  .out_dt (out_data)
) ;

initial begin
  clk = 0 ;
  clr = 1 ;
  #10 clr = 0 ;
  forever begin
    #10 clk = ~clk ;
  end
end

// scenario --------------------------
initial begin
  $dumpfile("tb.vcd");
  $dumpvars(0,testbench) ;

  enable  = 1'b0 ;
  set     = 1'b0 ;
  in_data = 8'd0 ;

  #200 enable  = 1'b1 ;
       in_data = 8'h55 ;
  #101 set     = 1'b1 ;
  #20  set     = 1'b0 ; 
  #100 enable  = 1'b0 ;
       in_data = 8'haa ;
  #101 set     = 1'b1 ;
  #20  set     = 1'b0 ; 
  #200 ;
  $finish;
  end

endmodule

シミュレーション結果




2020年4月17日金曜日

raspberry pi : スマホ(android) から Samba のファイルが見えない

現象:

スマホ(android)にインストールした X-Plore から Samba のファイルが見えない

対処:

X-Plore に設定した Raspberry Pi 4 への ユーザ名を削除することでファイルが見える様になった。

状況:

スマホにインストールした X-Plore から Raspberry Pi 4 に入れた Samba (V. 4.9.5) のファイルが見えない。
 ( ディレクトリは見えるが、中を見れない )
Windows10 からは 問題なくファイルにアクセス可能。

Raspberry Pi 3 の samba (V.  4.2.14) は アクセスできている。
設定は、同様の設定。(と思っている)

X-Plore の 表示では、
 Raspberry Pi 4 : SMB1
 Raspberry Pi 3 : SMBv2
となっている。

Log ( /var/log/samba/log. ) を確認したところ、 " Bad SMB2 signature for message" のメッセージがある。
また、( /var/log/samba/log.[IPアドレス] ) を確認すると、"No such user (ユーザ名) [?] - using guest account"のメッセージがある。

X-Plore に設定していた Raspberry Pi 4への ユーザ名 を消したところ、ファイルが見えるようになった。

何が悪いのか 不明。
設定が悪いのか ?,   X-Plore の 問題か ?,  samba の 問題か ?

2020年4月16日木曜日

raspberry pi : VPNサーバーのインストール

目的:
自宅外から自宅のネットワークにアクセスできるようにする。
 
概要:
VPNサーバーとして Softether をインストールし、VPN接続で 自宅外から SSH接続やネットワークドライブ(samba) へのアクセスを行えるようにする。


手順:
  1. bridge-utils のインストール
    VPN接続でVPNサーバー自身(VPNサーバーをインストールした raspberry pi) にアクセスできるようにする為、仮想ブリッジを経由して物理NICアクセスする必要がある。
    1. bridge-utils をインストールする
      $ sudo apt install bridge-utils
       
    2.  /etc/network/interfaces に設定を追加
      $ sudo vi /etc/network/interfaces
      auto br0
      iface br0 inet manual
      bridge_ports eth0      <--- ブリッジ接続するポートを設定
      bridge_maxwait 10
      
       
    3. dhcpcd.conf でIPアドレスを設定する。
      $ sudo vi /etc/dhcpcd.conf
      denyinterfaces eth0
      
      interface br0
      static ip_address=192.168.1.91/24
      static routers=192.168.1.1
      static domain_name_servers=192.168.1.1 8.8.8.8
      
      ブリッジ(br0) に IPアドレス等を設定する。
      ブリッジ接続するポート(eth0) の 設定は削除(コメントアウト) し、
      denyinterfaces で DHCP によるIPアドレスの割り当てが無いようにする。
      denyinterfaces の 設定は、ポートの設定(他ポートも含む)よりも前に記述する。
        
    4.  リブートする
      $ sudo reboot
      リブートして、ifconfig 等で設定を確認する。
       
     
  2.  SoftEther のインストール
    1. SoftEther ソフトウェアの URL 確認 (WEBブラウザで確認)
      SoftEtherダウンロードセンター
      にアクセスする。
       「コンポーネントを選択」で 「SoftEther VPN Server」 を選択
       「プラットフォームを選択」で 「Linux」を選択
       「CPU を選択」 で 「ARM EABI (32bit)」を選択
       最新版のダウンロードファイルのURL を取得する。
        ( 右クリック して リンクのアドレス(URL)を コピーする )
       
    2. SoftEther ソフトウェアをダウンロードし、解凍する。
      以降は root で作業を行う。
      任意のディレクトリで、
      $ su
      # wget [取得した URL]
      # tar zxvf [ダウンロードしたファイル名]
          --> vpnserver ディレクトリができる。
       
    3. Make を実行
      vpnserver ディレクトリに移動して make を実行する。
      # cd vpnserver
      # make
          --> licence agreement を読み (1を選択)、同意 (1を入力) する。
          ( Ver 4.38 では 入力の要求は無かった。 2021.09/25 )
       
    4. vpnserverディレクトリを /usr/local に移動する。
      # cd ..
      # mv vpnserver /usr/local/
       
    5. パーミッションを変更
      # cd /usr/local/vpnserver
      # chmod 600 *
      # chmod 700 vpncmd
      # chmod 700 vpnserver
       
    6. 自動起動のサービスを作成する
      # vi /etc/systemd/system/vpnserver.service
      [Unit]
      Description=SoftEther VPN Server
      After=network.target network-online.target
      
      [Service]
      User=root
      ExecStart=/usr/local/vpnserver/vpnserver start
      ExecStop=/usr/local/vpnserver/vpnserver stop
      Type=forking
      RestartSec=3s
      WorkingDirectory=/usr/local/vpnserver/
      #ExecStartPost=/bin/sleep 10 ; brctl addif br0 tap_vlan
      
      [Install]
      WantedBy=multi-user.target
      
      コメントアウトした行は、管理マネージャで tap を設定した後、コメントアウトを解除する。
        
    7. サービスを起動する
      # systemctl start vpnserver

      起動確認
      # systemctl status vpnserver.service
       
    8. 自動起動を有効にする
      # systemctl enable vpnserver.service
       
    9. リブートして、サービスを確認する
      # reboot
      $ sudo systemctl status vpnserver.service
       
  3. 管理マネージャーの設定
    1. Windows PC に管理ソフトウェアをインストールする。
      SoftEtherダウンロードセンター
      にアクセスする。
       「コンポーネントを選択」で
         「SoftEther VPN Server Manager for Windows」 を選択
       「プラットフォームを選択」で
         「Windows (.Zip package without installeers)」を選択
      ダウンロードしたファイルを解凍し、vpnsmgr.exe を起動する。
       
    2. SoftEther VPN Server への接続設定
      「新しい接続設定」をクリック
      「接続設定名」 に接続先の 任意の名前を設定
      「ホスト名」 に SoftEther VPN Server をインストールした raspberry pi のIPアドレスを設定
      「ポート番号」に 443 を設定
      「OK」 を押下
       
    3. SoftEtheer VPN Server へ接続
      「接続」をクリック
      管理者のパスワード設定ダイアログが開くので、パスワードを設定。
       
    4. 簡易セットアップ
      SoftRther VPN Server / Bridge 簡易セットアップ ダイアログが開くので以下を設定。
      「リモートアクセス VPN サーバー」にチェックして 「次へ」を押下
      「はい」を押下
      「仮想 HUB 名」を入力し、「OK」を押下。(Default は VPN)
      「ダイナミック DNS ホスト名の変更」に任意の名前を設定し「閉じる」を押下
      「L2TP over IPsec」 にチェックし、上で入力した仮想HUB名を選択。
       事前共有鍵(9文字以内推奨)を決めてOKをクリックする。
      「VPN Azure 無効にする」を選択して「OK」 を押下。
      「VPN 接続を受け入れるためのユーザーの作成」で、「ユーザを作成する」を押下。
      「ユーザー名」に任意の名前 を入力、
      「認証方法」にパスワード認証 を選択、
      「パスワード認証」にパスワード を設定して 「OK」を押下
       確認画面で OK を押下する。
       作成したユーザ名が表示されたら、閉じるを押下する。
      「ローカルブリッジの設定」で、raspberry pi の LAN のポート名 (eth0 等)を選択して 閉じる を押下。
       
    5. ローカルブリッジの設定
      「ローカルブリッジ設定」を押下
       上で設定した仮想HUB を選択して、「ローカルブリッジの削除」を押下
      「新しいローカルブリッジの定義」で
       「仮想HUB名」を入力。(例えば VPN)
       「作成する種類」で 「新しいtapデバイスとのブリッジ接続」を選択
       「新しいtapデバイス名」を設定。(例えば、vlan)
       「ローカルブリッジを追加」を押下。
      「閉じる」を押下
      「暗号化と通信関係の設定」を押下
      「暗号化アルゴリズム名」を「DHE-RSA-AES256-SHA」に変更して「OK」を押下
       
    6. 自動起動のサービスの修正
      $ sudo vi /etc/systemd/system/vpnserver.service 
      自動起動サービスの コメントを外す。
      ローカルブリッジの設定で 「新しいtapデバイス名」を vlan 以外に設定した場合は、”tap_vlan" を "tap_[新しいtapデバイス名]” に変更する。
    7. raspberry pi をリブートする
      管理マネージャを閉じ、raspberry pi をリブートし、tap が ブリッジされている事を確認する。
      $ sudo reboot
      $ brctl show br0
      bridge name    bridge id             STP enabled    interfaces
      br0            8000.5ea8b6f10493     no             eth0
                                                          tap_vlan
      
       
  4. ルータ設定
    ルータのポートマッピングで、500/UDP, 4500/UDP を ラズベリーパイのIPアドレスにマッピングする。
    設定方法は、各ルータのマニュアルを参照。
     
  5. ファイアウォール解放
    ラズベリーパイのファイアウォール設定で、500/UDP, 4500/UDP を通過させるように設定する。
    sudo ufw allow 500/udp
    sudo ufw allow 4500/udp
     
  6. 通信確認
    スマホ等からVPN 接続できることを確認する。
    ・android の場合の例 (4G 等で接続)
    設定 - ネットワークとインターネット - VPN
    で、右上の + をクリックし、VPNプロファイルの編集を行う。
    (機種 や android バージョンによって 異なるかも)
     名前       : 任意の名前
     タイプ     :L2TP/IPSec PSK
     サーバーアドレス:ダイナミック DNS ホスト名 に設定した名前
     IPSec事前共有鍵 :設定した 事前共有鍵
     ユーザ名    :設定した ユーザ名
     パスワード   :設定した パスワード
    等を設定して保存後、接続できる事を確認する。
    (スマホは、4G 等の異なるネットワーク で接続していること。)

    ・Windows10 の場合の例 (テザリング等で接続)
    設定 - ネットワークとインターネット - VPN
    で、 +(VPN接続を追加する) をクリックし、VPN接続を追加する。
     VPNプロバイダー    :Windows(ビルトイン)
     接続名          : 任意の名前
     サーバー名またはアドレス:ダイナミック DNS ホスト名 に設定した名前
     VPNの種類       :事前共有キーを使ったL2TP/Ipsec
     事前共有キー      :設定した 事前共有鍵
     サインイン情報の種類  :ユーザー名とパスワード
     ユーザ名        :設定した ユーザ名
     パスワード       :設定した パスワード
    等を設定し、接続できる事を確認する。
    (Windows は、テザリング等 の異なるネットワーク で接続していること。)
     
  7. LOG の所在
    VPNサーバーインストールディレクトリ下に log ディレクトリがある。
    接続できない場合等、server_log ディレクトリ内の log を確認して原因調査を行う。

    /usr/local/vpnserver/server_log/vpn_********.log

2020年1月17日金曜日

linux : サービスの作成、管理

目的:

Linux での サービスの作成、管理について記しておく。

概要:

サービスの作成、管理は systemctl で行う。
systemctl は rootで実行, または sudo をつけて実行する。
サービスは、"unit" 単位で管理される。

systemctl コマンド:


  • サービス起動
    $ sudo systemctl start [unit名]
  • サービス停止
    $ sudo systemctl stop [unit名]
  • サービス再起動
    $ sudo systemctl restart [unit名]
  • サービスリロード(再読み込み)
    $ sudo systemctl reload [unit名]
  • サービスステータス表示
    $ sudo systemctl status [unit名]
  • サービス自動起動有効
    $ sudo systemctl enable [unit名]
  • サービス自動起動無効
    $ sudo systemctl disable [unit名]
  • サービス自動起動設定確認
    $ sudo systemctl is-enabled [unit名]
  • サービス一覧
    $ sudo systemctl list-unit-files --type=service
  • 設定ファイルの再読込
    $ sudo systemctl daemon-reload

サービスの作成:

  1. サービスで実行する処理(スクリプト等)を作成する。
  2. /etc/systemd/system に unit定義ファイル (下記参照) を作成する。
  3.  sudo systemctl list-unit-files --type=service で作成したサービスが表示されることを確認する。
  4.  サービスを起動する。(systemctl start [unit名])
  5. 自動起動を設定する。(systemctl enable [unit名])

unit定義ファイル:

unit定義ファイルの例

[Unit]
# サービスの説明。内容は任意
Description=unit file sample
# このUnitより先に起動するべきUnitを設定
After=network.target
 
[Service]
# 実行するコマンドやスクリプトを記述
ExecStart=/usr/bin/test.sh
# サービス停止時の Kill する単位を設定
KillMode=process
# プロセスの起動方法を指定
Type=simple
# サービス停止時の再起動条件 (no は再起動しない)
Restart=no

[Install]
# 該当ユニットへの弱い依存関係を設定
WantedBy=multi-user.target

log 確認:


サービスの log確認は、
$ sudo journalctl -u [unit名]

で行う。
このlog は、/var/run/log/journal にバイナリ形式で保存され、再起動で消えるため、 log は直近の起動後のみが確認できる。
再起動で消えないようにする為には、 /var/log に journal ディレクトリを作成し、再起動する。

$ sudo mkdir /var/log/journal

$ sudo reboot

2019年12月31日火曜日

raspberry pi : wordpress サイトの移行

目的:

raspberry pi 3 の wordpress のサイトを raspberry pi 4 に移行する。

手順:

wordpress のインストールは済んだ状態で移行作業を開始。
  1. プラグイン 「All-in-One WP Migration」のインストール
    両方の raspberry pi の wordpress に   プラグイン 「All-in-One WP Migration」 をインストール、有効化する。
     
  2. 旧 wordpress のエクスポート
    1. 旧 wordpress (raspberry pi 3) で 管理画面の左メニューから「All-in-One WP Migration」→「エクスポート」を選択。
    2. "エクスポート先" から "ファイル" を選択。
    3. 準備終了後、"***** をダウンロード" を押下してファイルを保存する。
       
  3. rapsberry pi 4 の 最大アップロードファイルサイズを大きくする。
    1. .htaccessを有効にする。
      $ sudo vi /etc/apache2/apache2.conf
      で  <Directory /var/www/> セクションの
      AllowOverride None  を
      AllowOverride All    に変更。
       
    2. .htaccess に 最大アップロードファイルサイズの設定を行う。
      $ sudo vi /var/www/html/wordpress/.htaccess
      /var/www/html/wordpress/.htaccess に 以下を追記。
    3. php_value upload_max_filesize 128M
      php_value post_max_size 128M
      php_value memory_limit 256M
      php_value max_execution_time 300
      php_value max_input_time 300
      

  4.  apache2 を再起動する。
    $ sudo /etc/init.d/apache2 restart

     
  5. 新 wordpress にインポートする。
    新 wordpress (raspberry pi 4) で  管理画面の左メニューから「All-in-One WP Migration」→「インポート」を選択。
    最大アップロードサイズが設定通りであることを確認。
    ダウンロードしたファイルをドラッグアンドドロップすると、インポートが開始される。

2019年12月30日月曜日

raspberry pi : WEBサーバ (apache, wordpress 他) の インストール

目的:

WEBサーバを立てる。
当面、宅内のローカルWEBサーバとする。

手順:

WEBサーバ として、apache, PHP, mySQL, workpress をインストールする。
  1. apache のインストール
    • apache2 のインストール
      $ sudo apt install apache2
      別PC から http://[ラズベリーパイのIPアドレス] で、
      Apache2 Debian Default Page
      It works!
      とかの表示がでれば、OK
    •  apache2 のグループを自IDに追加
        自分のグループに www-data を追加しておく。
      $ sudo gpasswd -a [自ユーザ名] www-data
    • エラー発生時のバージョン情報等を表示させなくする
      エラー発生時等に、apacheバージョン,サーバー名等を表示させない様にしておく。
      $ sudo vi /etc/apache2/conf-available/security.conf
      を以下の通り編集する。
      (全サイトにて起用する場合。個別サイトでの対応時は、別ファイル)
      ServerSignature Off    <=== コメントアウトを外す
      #ServerSignature On    <=== コメントアウトする
      

  2. webサーバーのルート、設定ファイル等
    • 設定ファイルの所在
      apach2 全体の 設定ファイルは、
      /etc/apache2/apache2.conf
      サイトの設定ファイルは、
      /etc/apache2/sites-available
      にある。ここには、複数の .conf があるが、
      /etc/apache2/sites-enabled
      にリンクされたファイルが有効なファイル。
      初期状態では、000-default.conf が リンクされている。
    • /etc/apache2/sites-enabled への リンク/リンク解除のコマンド
      リンク/リンク解除のコマンドは、
      $ sudo a2ensite     //リンクを張る
      $ sudo a2dissite    //リンク解除
       
    • ドキュメントルート
      sites-enabled に リンクされた .conf に webサーバーのルート(ドキュメントルート)が設定されている。
      例えば、
      DocumentRoot /var/www/html
      が、webサーバーのルート。

      http://[ラズベリーパイのIPアドレス] で表示されるのは、
      /var/www/html/index.html
      の内容。初期状態では、”Apache2 Debian Default Page” が表示される。
      必要に応じて、index.html を書き換える。
       
  3. PHP7.3 インストール
    $ sudo apt install php7.3
     
  4. PHP7.3-mysql インストール
    $ sudo apt install php7.3-mysql
     
  5. MariaDB インストール
    $ sudo apt install mariadb-server
     
  6. MariaDB 初期設定
    $ sudo systemctl start mariadb.service
    $ sudo /usr/bin/mysql_secure_installation

    Enter current password for root (enter for none):
     のメッセージは、初期状態では未設定の為 Enter (空打ち)。

    Set root password? [Y/n]
     は Y で、root のパスワードを入力する。

    その他の入力は Y を入力。
     
  7. phpmyadmin インストール
    $ sudo apt install phpmyadmin

    自動再設定をする web サーバ:
     apache2 を選択

    phpmyadmin 用のデータベースを dbconfig-common で設定しますか?
     はい を選択

    phpmyadmin 用の MySQL アプリケーションパスワード:
     MariaDB に設定したパスワードと同じパスワードを設定
     
    apacheに設定を読ませる為、/etc/apache2/apache2.conf を修正
    $ sudo vi /etc/apache2/apache2.conf
    最下行に次の記述を追加。
    Include /etc/phpmyadmin/apache.conf
     
    
  8. MariaDB に ユーザを登録
    phpmyadmin でアクセスする場合、root で ログイン しようとすると、
    #1698 - Access denied for user 'root'@'localhost'
    となる。この為、新しいユーザを登録する。(参考)
    $ sudo mysql -u root
     で MariaDBに接続。
    CREATE USER 'hoge'@'localhost' IDENTIFIED BY 'hogepasswd';
     で ユーザを追加。
    GRANT ALL ON *.* TO 'hoge'@'localhost' WITH GRANT OPTION;
     で 管理者用権限 を 付与する。
    \q で MariaDB から抜ける。
     
  9. 起動確認
    apache2 を再起動する。
    $ sudo /etc/init.d/apache2 restart
    再起動後、 http://[ラズベリーパイの IPアドレス]/phpmyadmin/ にアクセスし、
    ログイン画面が表示されることを確認する。
    追加した ユーザで ログインができることを確認する。
    画面左上のアイコンの 左から2番目のアイコン(ログアウト) を押下して抜ける。
     
  10. phpMyAdmin セキュリティ対策
    将来サーバーを公開した場合等、phpMyAdmin が攻撃対象となる可能性がある為、
    対策が必要。対策として、以下を実施。
    1. エイリアスの変更。
      /etc/phpmyadmin/apache.conf
      の 3行目のエイリアス設定を変更し、phpmyadmin とは異なる名称にする。
      $ sudo vi /etc/phpmyadmin/apache.conf
      (変更前)  Alias /phpmyadmin /usr/share/phpmyadmin
      (変更後)  Alias /[新しい名前]    /usr/share/phpmyadmin
      変更後、apache2 を再起動する。
      $ sudo /etc/init.d/apache2 restart

      今後、phpmyadmin にアクセスする場合は、
       http://[ラズベリーパイの IPアドレス]/[Ailias に設定した名前]/
      で行う。
       
    2. ローカルLAN内からのアクセスに限定する。
      自宅内からのアクセスに限定できる場合は、以下の設定を行い、特定のIPからのアクセスからしか受け付けないようにする。
      $ sudo vi /etc/phpmyadmin/apache.conf
      /etc/phpmyadmin/apache.conf の 8行目あたり ( <Directory /usr/share/phpmyadmin> セクション ) に、以下を追加する。
      Order Deny,Allow
      Deny from All
      Allow from 192.168.1.
      
       
  11. wordpress インストール
    1. wordpress 用データベース設定
      phpMyAdmin にログインして、データベースを設定
      データベースタブから、”データベースを作成する” で作成。
      例えば、データベース名 に wordpress を入力して "作成" を押下。
       (まだ、テーブルは無い)
      特権タブ を選択し、"wordpress" からのアクセス用ユーザーを追加する。
      "Add user account" を押下し、
      ユーザー名、パスワードを入力し、
      ”パスワードを生成する" で "生成する" を押下して生成されたパスワードを控え、
      実行を押下。
    2. wordpress をダウンロード
      /var/www/html で、パッケージを取得し、解凍する。
      $ cd /var/www/html
      $ sudo wget http://wordpress.org/latest.tar.gz
      $ sudo tar xzf latest.tar.gz
      $ sudo rm -rf latest.tar.gz
      $ sudo chown -R www-data:www-data /var/www/html/wordpress

      最後にリブートする。
      $ sudo reboot  
       
  12. wordpress 設定
    http://[ラズベリーパイの IPアドレス]/wordpress/
    にアクセスすると設定画面となる。
    日本語を選択して "続ける"
    "さあ、始めましょう!" を押下。
    データベース名、ユーザ名、パスワードに 上(11) で設定した値を入力。
    その他は初期状態のまま、"送信"
    "インストール実行" を押下。
    サイトのタイトル、ユーザ名、パスワード、メールアドレス を入力し、"wordpressをインストール"を押下。
    "ログイン" を押下し、設定したユーザ名、パスワードを入力すると、"ダッシュボード" が表示される。
    以上の設定は、
    /var/www/html/wordpress/wp-config.php
    で 修正できる。
     
    尚、この後は
    http://[ラズベリーパイの IPアドレス]/wordpress
    にアクセスすると サイトが表示される。
    管理画面は、
    http://[ラズベリーパイの IPアドレス]/wordpress/wp-login.php
    で ログイン できる。
     

2019年12月29日日曜日

raspberry pi : DLNAサーバー(minidlna)インストール

目的:
ビデオ等、動画をテレビで見れるように DLNAサーバーをインストールする。
 
手順:
  1. minidlna のインストール
    $sudo apt install minidlna
     
  2. log の確認
    $cat /var/log/minidlna.log
    で log を確認する。

    WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permission to increase this limit.  Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.

    の様なワーニングが発生している場合、inotify で監視できる数のデフォルトが十分では無い為、inotify の監視数を増やす。
     
  3. inotify の監視数を増やす
    $sysctl fs.inotify.max_user_watches
    で、inotify の監視数を確認する。
    fs.inotify.max_user_watches = 8192
    で、8192 となっている。
    /etc/sysctl.d/90-inotify.conf を作成し、以下を記述する。(参考)
    $sudo vi /etc/sysctl.d/90-inotify.conf
    # Increase inotify max watchs per user for local minidlna
    fs.inotify.max_user_watches = 100000
    

    記述後、再起動して inotify 監視数が増えたことを確認する。
     
  4. minidlna 設定
    $sudo vi /etc/minidlna.conf
    で、
    #media_dir=/var/lib/minidlna
    の行を修正して、ソースファイルのあるフォルダを指定する。
    media_dir=/mnt/hdd2/VIDEO
     
  5. 確認
    $sudo /etc/init.d/minidlna stop
    $sudo /etc/init.d/minidlna start
    後、動画ファイルが配信されることを確認する。

raspberry pi : USB HDD (NTFS) の接続

目的:


Windows で使用していた USB HDD をマウントして使用できるようにする。

 手順:

    1.  NTFSフォーマットを扱えるようにする。
      NTFS フォーマットを扱うために ntfs-3g を使用する。
      インストールされているか確認。
      $sudo dpkg -l | grep ntfs-3g
      ---- インストールされている。
      もし、インストールされていない場合は、インストール。
      $sudo apt install ntfs-3g
       
    2.  USB HDD の確認
      $sudo fdisk -l
      で、USB HDD が接続されていることを確認。
      例:
      Device     Start        End    Sectors  Size Type
      /dev/sdb1   1024 5860532223 5860531200  2.7T Microsoft basic data
       
    3. マウントポイントを作成し、アクセス権を変更。
      $sudo mkdir /mnt/hdd2
      $sudo chmod 777 /mnt/hdd2
       
    4. USB HDD をNTFSでマウントする
      $sudo mount -t ntfs-3g /dev/sdb1 /mnt/hdd2
       
    5. 起動時に自動的にマウントするようにする
      $sudo blkid /dev/sda1
      で UUID を確認。

      /etc/fstab に
      UUID=”************” /mnt/hdd2 ntfs-3g defaults,nofail 0 0
      を追記する。( ”************” は 確認した UUID )
       
    6. リブート し、マウントされていることを確認。
      $sudo reboot
      $ df | grep /mnt/hdd2
      で、マウントされていることを確認する。
       

raspberry pi : ファイヤウォールの設定



目的:

セキュリティ向上の為、ファイアウォールの設定を行う。

手順:

ufw (Uncomplicated FireWall) を使用して ファイアウォールの設定を行う。
  1. ファイアウォールの設定ツール ufw をインストール。
    $sudo apt-get install ufw

    でインストールする。
    インストール直後は、ufw は無効になっている。
    $sudo ufw status
    Status: inactive
     
  2. ファイアウォールのルールを決める。
    ファイアウォールの設定の方針の例 としては、
    1. 外部からの通信は遮断
      但し、HTTP用の 80, 8080 は解放
      外部から SSH接続する必要がある場合は、22 以外の任意番号を割り当てる。 
    2. 内部(ローカルアドレス) からの通信は許可
       
  3.  ファイアウォールを設定する。
    上の例の場合、
    • デフォルトは、外部通信をすべて拒否に設定
      $sudo ufw default deny
    • http用 8080 を許可
      $sudo ufw allow 8080
    • http用 80 を許可
      $sudo ufw allow 80
    • ローカルからの全ポートアクセス を許可
      $sudo ufw allow from 192.168.1.0/24
      $sudo ufw allow from fe80::/10
       (IPV6 リンクローカルアドレスから も 許可 ) 

  4. ファイアウォールを起動
    $sudo ufw enable
     
  5. 設定内容の確認, 削除等。
    設定内容確認
     $sudo ufw status
     で設定内容が確認できる。番号付きで表示する場合は
     $sudo ufw status numbered
     とする。
     修正する場合は、削除して再度設定する。
    削除
     $sudo delete <番号>
    ファイヤウォールの停止
     $sudo ufw disable
     
  6. その他
    ファイヤウォール設定例

    ローカルアドレスから Port22 への TCP プロトコル を許可する場合
    $sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

raspberry pi : 有線LAN Link Down/Up 繰り返す。

現象:

 raspberry pi 4 で、有線LAN が Link Down , Link Up を繰り返す。


原因:

不明。
Hub (BUFFALO LSW4-GT-5EP)に接続すると Link Down/Up を繰り返す。
ルータ (Aterm BL900HW)に接続すると 発生しない。


対処 (暫定) :

  1. 接続先を変更
  2. 外付けの USB3.0 接続有線LAN アダプタを使用。


経緯:

 /var/log/syslog を確認したところ、 eth0 が Link Down, Link Up を繰り返しているのを発見。

kernel: [ 7117.267745] bcmgenet fd580000.genet eth0: Link is Down

が 繰り返し発生している。
発生間隔 1分 ~ 40分 で 一定ではない。平均 1回/15分ぐらい。

そういえば、まれに 数秒間 キー入力が反応しないことがあった。
ググってみるも、よく判らない。

試しに USB3.0 接続の有線LANアダプタ(ELECOM EDC-GUA3-B)を接続してみる。アダプタは、USB3.0 ポートに接続するだけで認識。
ifconfig で eth1 が追加されているのを確認。
/etc/dhcpcd.conf で eth0 の設定を et1 に設定。et0 は 別IPアドレスに変更。
LANアダプタのみ LANケーブルを接続。
リブートして、今までと同じように接続できることを確認。

2日以上経過したが、Link Down は発生していないことを確認。USB3.0 接続 の 有線LANアダプタ では Link is Down は 発生しない模様。

2020/1/26 追記
接続先を Hub (BUFFALO LSW4-GT-5EP) から ルータ(Aterm BL900HW) に変更したところ、Link Down/Up は 発生しない。
Hub に戻すと 発生する。








2019年12月23日月曜日

raspberry pi : 定期実行について(cron)

目的:
スクリプト等の処理を定期的に実行する。

手順:
定期的に実行する為にcronを使用する
crontab を使用して、ユーザ毎に定期的に行う処理を登録する。
root権限が必要な場合は、root ユーザで行う。(sudo をつければ OK)
  1. 設定確認
    crontab -l

    実行時に root権限が必要な場合 (root ユーザ での cron 設定)
    sudo crontab -l

    設定していない場合、”no crontab for <ユーザー名>”と言われる。
     
  2. 設定方法
    crontab -e

    実行時に root権限が必要な場合 (root ユーザ で処理を実行する場合)は
    sudo crontab -e

    で設定する。エディタが開き、編集可能となる。
    (/var/spool/cron/crontabs/ユーザ名 に保存される)

    設定は、
    00 03 * * 1 sh /home/hogehoge/script/test.sh
    
    の様に、実行する ‘分’ ‘時’ ‘日’ ‘月’ ‘曜日’ ‘コマンド’ の順に指定する。
    曜日は 0:日, 1:月, 2:火, — ,6:土,7:日 を指定する。
    上記の場合、毎週月曜日の AM3:00 に実行する。

2019年12月22日日曜日

raspberry pi : sambaのインストール

目的:

Windows からアクセス可能なファイルサーバーとする。

手順:

  1. samba をインストール
    sudo apt-get update
    sudo apt-get install samba

    途中、
    「あなたのコンピュータがネットワーク上の DHCP サーバから IP アドレス情報を取得しているのであれば、DHCP サーバはネットワーク上にある WINS サーバ (NetBIOS ネームサーバ) についての情報を提供することもできます。DHCP で提供される WINS 設定は /var/lib/samba/dhcp.conf から自動的に読み込まれるため、smb.conf ファイルを変更する必要があります。

    この機能を使うためには、dhcp-client パッケージがインストールされている必要があります。

    DHCP から WINS 設定を使うよう smb.conf を変更しますか?」

    という選択画面が表示され、 いいえ で答えた。
     
  2. 共有するディレクトリを作成
    接続したUSB HDD 等 に 共有用のディレクトリを作成する。
    [例]
    ・ディレクトリ作成
    sudo mkdir /mnt/hdd1/data

    ・グループ 変更 : グループは必要に応じて変更
    sudo chgrp group1 /mnt/hdd1/data

    ・アクセス権 変更 : アクセス権は必要に応じて設定
    sudo chmod 774 /mnt/hdd1/data
     
  3. samba 設定
    sudo vi /etc/samba/smb.conf
    で 以下を修正/追加

    修正 : ワークグループ名を自環境に合わせて設定する。
    [global]
    
    ## Browsing/Identification ###
    
    # Change this to the workgroup/NT-domain name your Samba server will part of
       workgroup = WORKGROUP   <=== 必要に応じて変更する
    

    設定追加 : 設定ファイルの末尾に 共有ディレクトリの設定を追加。
    以下の例では、アクセス権は設定せず、強制的に 'myname' というユーザとしてアクセスする様に設定。
    [data]                    <=== 共有名, Windowsから見える名前
    comment = Raspberry Pi    <=== ディレクトリの説明に記述されるコメント
    path = /mnt/hdd1/data     <=== 共有フォルダのパス
    read only = No            <=== 読み込みも書き込みも可能
    guest ok = Yes            <=== ゲスト権限で接続
    force user = myname       <=== 強制的にユーザ名をmyname にする。
    

    アクセス権の設定等は、別途試すこととする。
     
  4. samba の再起動
    sudo service smbd restart
    sudo service nmbd restart

    で、samba の再起動を行う。
     
  5. Windows からアクセス
    エクスプローラ から 'ネットワーク' 下に見えていることを確認。
    また、ファイルの作成等が Windows からできることを確認。

2019年12月21日土曜日

raspberry pi : SDカードの定期バックアップ

目的:

ラズベリーパイのバックアップを定期的に取る。
バックアップは、SDカードの中身を丸ごと外付けの USB HDD に イメージファイルとしてバックアップする。

手順: 

  1.  SDカードのデバイス名を確認する。
    fdisk -l を実行し、SDカードのデバイス名を確認する。
    自環境では、/dev/mmcblk0
     
  2. バックアップ取得用スクリプト
    バックアップは dd コマンドを使用して 外付けの USB HDD に 取得する。
    以下の様なスクリプトを作成し、バックアップファイルを作成した後、バックアップファイルが指定ファイル数を超えた場合は古いファイルを削除するようにした。
     ( バックアップ先ディレクトリ名等、各環境に合わせて修正が必要 )
    vi backup.sh
    で作成後、
    chmod 770 backup.sh
    で 実行権限を付与。
      
    #!/bin/sh
    
    #バックアップファイル数の上限
    MAXFNUM=4
    
    #バックアップ先のディレクトリ
    BKDIR=/mnt/hdd1/backup/raspi_bkup/
    
    #バックアップファイル名
    BKFNAME="rp4bup_"`date +%Y%m%d`.img
    
    #バックアップ実行
    echo "Back Up start    : " `date '+%y/%m/%d %H:%M:%S'`
    dd bs=4M if=/dev/mmcblk0 of=${BKDIR}${BKFNAME}
    echo "Back Up Complete : " `date '+%y/%m/%d %H:%M:%S'`
    ##echo "Backup Complete !"
    
    #古いバックアップファイルの削除
    num=0
    for FN in `ls -tl ${BKDIR}rp4bup_*.img | awk '{print $9}'`
    do
      if [ ${num} -ge ${MAXFNUM} ];
        then
          rm ${FN}
          echo "delete " ${FN}
      fi
      num=$(($num + 1)) 
    done
    

    上記スクリプトでは、バックアップファイルが 4つを超えた場合、古いバックアップファイルを削除する。

    上記 スクリプトをテストし、問題ないことを確認する。
    sudo ./backup.sh
    自環境での確認時、バックアップ時間は 32GB のSDカード使用で約13分かかった。 
     
  3. スクリプトを定期的に実行
    上記スクリプトを cron で定期実行する。
    SDカードアクセスに root権限が必要なため、
    sudo crontab -e
    で設定する。設定内容は、
    実行する ‘分’ ‘時’ ‘日’ ‘月’ ‘曜日’ ‘コマンド’ の順に指定する。
    曜日は 0:日, 1:月, 2:火, — ,6:土,7:日 を指定する。
    今回は、

    00 03 * * 1 sh <スクリプトを保存したフォルダ>/backup.sh
    

    とした。(毎週 月曜日 3:00 にbackup.sh を実行。)



raspberry pi : ネットワークドライブのマウント

目的:

 Windows の共有ファイルやNASにアクセスできるようにする。

手順:

  1. CIFS インストール確認
    cifs-utils が インストールされているか確認。
    dpkg -l | grep cifs-utils

    インストールされていなければ、インストールする。
    sudo apt-get install cifs-utils
     
  2. マウント先のディレクトリを作る
    sudo mkdir /mnt/<マウント先ディレクトリ名>

  3. マウント
    作成したディレクトリにネットワークドライブをマウントする。
    sudo mount -t cifs //サーバー名/共有名 /mnt/<マウント先ディレクトリ名> -o user=<ユーザ名>,password=<パスワード>,iocharset=utf8

    マウント時に "mount error(112): Host is down" のエラーが発生する場合、-o に vers=2.0 または vers=1.0 を追加する。
    自環境の NAS では vers=1.0 が必用だった。

    sudo mount -t cifs //HOGE/hogehoge /mnt/hogehoge -o vers=1.0,user=myname,password=mypasswd,iocharset=utf8
    
     
  4. 起動時の自動マウント
    起動時に自動でマウントされる様に  /etc/fstab  に以下の行を追加する。
    (uid, gid の値は id コマンドで確認しておくこと。)
    //サーバー名/共有名 /mnt/<マウント先ディレクトリ名> cifs username=<ユーザ名>,password=<パスワード>,iocharset=utf8,rw,uid=1000,gid=1000,defaults 0 0

    3. で vers= 1.0 が必用だった場合、 /etc/fstab も同様に 追加する。
    //サーバー名/共有名 /mnt/<マウント先ディレクトリ名> cifs vers=1.0,username=<ユーザ名>,password=<パスワード>,iocharset=utf8,rw,uid=1000,gid=1000,defaults 0 0

    //HOGE/hogehoge /mnt/hogehoge cifs vers=1.0,username=myname,password=mypasswd,iocharset=utf8,rw,uid=1001,gid=1001,defaults 0 0
    

  5.  ネットワーク起動後にマウントする為の設定 (2021.9.23 追記)
    ネットワーク起動前にマウントすると失敗する為、ネットワークの起動を待ってからマウントする様に設定する。

    sudo raspi-config

    で、ラズベリーパイのVNC設定を行う。
      (raspbian のバージョンにより メニューは異なる可能性が有る)
      1 System Options  を選択して Return
      S6 Network at Boot  を選択して Return
      <はい> を選択して Return
      <了解> を選択して Return
    以上で、ネットワーク起動を待ってから ブート する様になる。

  6. 再起動確認
    再起動してマウントができることを確認する。

    マウントできていない場合、
    sudo mount -a
    を実行し、マウントできるか、確認する。

    マウントできない場合は、 /etc/fstab を見直す。

    マウントできる場合は、起動時のマウントまでにネットワークの準備が間に合っていない可能性が考えられる。この場合、/etc/fstab の記述の defaults を noauto,x-systemd.automount に変更してみる。
    //サーバー名/共有名 /mnt/<マウント先ディレクトリ名> cifs vers=1.0,username=<ユーザ名>,password=<パスワード>,iocharset=utf8,rw,uid=1000,gid=1000,noauto,x-systemd.automount 0 0

    //HOGE/hogehoge /mnt/hogehoge cifs vers=1.0,username=myname,password=mypasswd,iocharset=utf8,rw,uid=1001,gid=1001,noauto,x-systemd.automount 0 0
    

    自環境では、fstab に  noauto,x-systemd.automount を指定して 起動時にマウントできるようになった。

2019年12月15日日曜日

raspberry pi : OS インストール(SSH)

目的:

ラズベリーパイ4 に rasbian OS をインストールする。
ラズベリーパイ 用には モニタ、キーボード、マウス は接続せず、 Windows PC からのSSH接続 等で行う。

手順: 

Raspberry pi の モニタ、キーボード、マウス は 接続しない前提での インストール手順。
LAN は 有線LAN。


(1) OS ダウンロード

http://www.raspberrypi.org/downloads/
からダウンロードする。
但し、上記( 公式サイト) からのダウンロードが失敗ばかりでダウンロードできない。
以下のミラーサイトからダウンロードした。(2020/11/13 URL 更新)
・Raspbian Buster with desktop and recommended software  (旧)
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_full/images/
・Raspberry Pi OS with desktop and recommended software
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/
  デスクトップ環境 + 公式おすすめのソフトウェア

・Raspbian Buster with desktop   (旧) 
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
・Raspberry Pi OS with desktop
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_armhf/images/
   デスクトップ環境
 
・Raspbian Buster Lite  (旧) 
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/
・Raspberry Pi OS Lite
    http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_armhf/images/
   デスクトップ環境 (X Window)  なし
 
今回は、"Raspbian Buster with desktop" を使用。

(2) SDカードをフォーマット

SDカードを "SDFormatter" で 上書きフォーマット。

(3) OS を SDカードに書き込み

ダウンロードしたファイル を SD に書き込む。
書き込みには、balenaEtcher を使用した。
balenaEtcher は、.zip ファイルのまま書き込める。

(4) SSH ファイル を SDカードに書き込み

空のSSH ファイルを SDカードの boot ディレクトリに作成する。
Windows の エクスプローラで SDカードを開くと boot ディレクトリが表示される。
ここに、右クリックメニュー から 新規作成 > テキスト文書 を選択し、
ファイル名を SSH に変更する。 (拡張子は無し。中身は不要。ファイルサイズ 0 )

(5) Power ON

Raspberry Pi に 電源、LAN を接続し、SDカードを挿入して電源onする。

(6) SSH でLOGIN

raspberry pi に SSH で LOGIN する。
IPアドレスは DHCP で割り当てられた IP アドレスで 立ち上がるため、IPアドレスは推定で指定する。
 NetEnum 等で ネットワーク上に存在する IPアドレス (ping の通ったアドレス)  を調べ、アタリをつける。
SSH 接続時の初期値は  ID : pi,  パスワード : raspberry。
SSH 接続は、Windows 上 の端末から、例えば 以下の様に 行う。

ssh pi@192.168.1.131

(7) VNC接続設定

VNC 接続設定を行った後、VNC で接続して初期設定を行う。
まずは、VNC 接続できるようにする。

sudo raspi-config

で、ラズベリーパイのVNC設定を行う。
  •  VNC の有効化
     5 Interfacing Options  (Return)
      ( 又は  3 Interface Options  (Return)  )
     P3 VNC  で Yes を選択
  •  画面解像度設定 (これをやらないと VNC 接続できなかった )
    7 Advanced Options  を選択して Return。
     ( 又は  2 Display Options を選択して Return )
    A5 Resolution     を選択して Return。
    DMT Mode 82 1920x1080 60Hz 16:9  を 選択して Return

    Finish  を選択して Return で リブートする。
 VNC Vewer を立ち上げ、接続 すると、初期設定画面が表示される。

(8) 初期設定

  1. NEXT
  2. Country を JAPAN にして NEXT
  3. piユーザ のパスワードを設定して NEXT
  4. Set Up Screen は そのまま NEXT
  5. WiFi 設定は必要に応じて設定してNEXT。 不要の時は Skip
  6. Update Software は そのまま NEXT。 → なにか ERROR になった。
  7. Restart。
     

(9) パッケージ更新

SSH 接続で、

sudo apt-get updateで、パッケージ管理ツールをアップデートする。
 (パッケージリストの更新)

sudo apt-get upgrade
で、アップグレードをする。(インストールされてるパッケージの更新)

(10) IPアドレス固定

/etc/dhcpcd.conf に以下を追記して IPアドレスを固定。
 ( /etc/dhcpcd.conf 内に 記述例があるので、それを参考に記述 )
sudo vi /etc/dhcpcd.conf
 
 

interface eth0
static ip_address=***.***.***.***/24        // IPアドレスを指定する
static routers=***.***.***.***              // ルーターのIPアドレスを指定する
static domain_name_servers=***.***.***.***  // DNS の IPアドレスを指定する


 VNC 接続で 画面右上 ↑↓ を右クリックして出てくる Wireless & wired NetWork Settings から IPアドレスを設定したら NetWork に接続できなくなった。
この為、/etc/dhcpcd.conf で 設定した。

設定後、

sudo reboot
でリブートし、設定した IPアドレスで接続できることを確認。
 

[2019/12/29 追記/修正] 
有線LAN で Link Down, Link Up の繰り返しが発生。

この為、外付け 有線 LAN アダプタ を使用した。
詳細は、"有線LAN Link Down/Up 繰り返す。" を参照。







2019年12月13日金曜日

raspberry pi : DNSサーバーを立てる

目的:

SSH 接続時等、IPアドレスではなく ホスト名でアクセスできる用、ローカル の DNS サーバーを立てる。

手順:

 DNSサーバーは、軽量で 設定が楽 と言われる dnsmasq とする。
  1. DNSサーバーをインストール
    sudo apt-get install dnsmasq
    で、インストールする。
     
  2. 自動でサービスが開始されるため、一旦停止させる。
    sudo service dnsmasq stop
     
  3. 設定ファイルを編集する。
    sudo vi /etc/dnsmasq.confで、以下を修正
    # Never forward plain names (without a dot or domain part)
    #domain-needed
    domain-needed             <— コメントアウトを解除
    
    # Never forward addresses in the non-routed address spaces.
    #bogus-priv
    bogus-priv                      <— コメントアウトを解除
    
    # Add local-only domains here, queries in these domains are answered
    # from /etc/hosts or DHCP only.
    #local=/localnet/
    local=/local/                   <— 追加 (ドメイン名 : local )
    
    # Set this (and domain: see below) if you want to have a domain
    # automatically added to simple names in a hosts-file.
    #expand-hosts
    expand-hosts                      <— コメントアウトを解除
    
    # Set the domain for dnsmasq. this is optional, but if it is set, it
    # does the following things.
    # 1) Allows DHCP hosts to have fully qualified domain names, as long
    #     as the domain part matches this setting.
    # 2) Sets the “domain” DHCP option thereby potentially setting the
    #    domain of all systems configured by DHCP
    # 3) Provides the domain part for “expand-hosts”
    #domain=thekelleys.org.uk
    domain=local                  <— 追加 (ドメイン名 : local )

  4. /etc/hosts に名前を登録する。
    sudo vi /etc/hosts
    で、以下を追加する。
     <IPアドレス> host名.ドメイン名 host名
    例えば、
    192.169.1.100 hogehoge.local hogehoge
    ( host名 : hogehoge, ドメイン名 : local )
     
  5. サービスを起動する
    sudo service dnsmasq start
—————————————————————————–
andoroid, Windous PC の ネットワーク設定 の DNS サーバーに  raspberry pi の IPアドレス(IPV4) を設定することで android や Windous の コマンドプロンプト, WSL から ホスト名で ping が通った。
また、WSL から nslookup で IPアドレスが取得できることを確認できた。

但し、コマンドプロンプトから nslookup を行ったところ、DNS サーバー のアドレスがIPV6 となっていて、IPアドレス の取得ができない。
ping は ホスト名で実行して 応答があるのだが、、、

WSL 等から ホスト名で SSH 接続 はできたため、とりあえず 良し としておく。


2019年12月8日日曜日

raspberry pi : Windows からリモート接続(GUI)する

目的:

Windows PC から Raspberry Pi に GUI でリモート接続する。
これにより、Raspberry Pi に キーボードやマウスを接続しなくても GUI 操作ができる。

手順:

  1.  Raspberry Pi の VNCを有効にする
    (1)  Raspberry Pi のデスクトップ画面を立ち上げる。
    (2)  MENU – 設定 – RaspberryPiの設定 で、「インタフェース」タブにある
      VNC を 有効にする。
    (3) デスクトップからログアウトする。
     
  2. Windows PC に VNC Viewer をインストールする。
    (1) ダウンロードサイト から VNC Viewer をダウンロードする。
    (2) VNC Viewer をインストールする。
    (3) VNC Viewer を起動し、Raspberry Pi の IPアドレスを入力し、Enter。
    (4) ユーザ名、パスワードを入力し、Enter。
    (5) デスクトップ画面が表示される。

2019年12月7日土曜日

raspberry pi : パッケージのインストール等に関するコマンド

目的:

パッケージのインストール等に関するコマンドについて記しておく。

コマンド:

  • パッケージリストの更新
    sudo apt update
     
  • パッケージの検索
    sudo apt search [キーワード]
     
  • パッケージ更新(アップデート)
    sudo apt upgrade
     
  • パッケージの更新で、除外したいパッケージがある場合、以下で指定する
    echo [パッケージ名] hold | sudo dpkg –set-selections
     
  • パッケージ更新の除外を解除する場合は、
    echo [パッケージ名] install | sudo dpkg –set-selections
     
  • パッケージのインストール
    sudo apt install [パッケージ名]
     
  • インストールされているパッケージの確認
    dpkg -l
     ( インストールされている全てのパッケージを表示 )

    dpkg -l | grep  [パッケージ名]
       ( 特定パッケージのみ表示する場合)

  • パッケージのアンインストール
    sudo apt remove [パッケージ名]
     ( 設定ファイルは削除されない )

    sudo apt purge [パッケージ名]
     ( 設定ファイルごと削除 )

2019年12月4日水曜日

raspberry pi : ホスト名の変更

目的:

Raspbery pi4 の ホスト名 (raspberrypi ) を変更する。

手順:

/etc/hostname と /etc/hosts に記載されている名前を変更し、リブートする。

sudo vi /etc/hostname
sudo vi /etc/hosts

で、それぞれ raspberrypi と書かれたところを 新しいホスト名に変更。
その後、

sudo reboot

でリブート。
この時、
sudo: ホスト raspberrypi の名前解決ができません: ホスト名にアドレスが割り当てられていません
のメッセージが発生するが、リブートする。

リブート後は、新しいホスト名となる。