ロボットシステム学2016第5回

Thu Sep 29 17:13:38 JST 2016 (modified: Fri Nov 29 17:24:23 JST 2019)
views: 680, keywords:

  このエントリーをはてなブックマークに追加 
   

ロボットシステム学

第5回

上田 隆一

2016年10月26日@千葉工業大学

今日の内容

  • ファイルシステムとデバイス

ファイルシステム

  • OS の最重要機能の一つ
  • 機能
    • 誰にでも分かりやすいもの
    • HDDを使えるようにする
    • USBメモリを使えるようにする
  • 人によっては意外なもの
    • 外部の機器(センサ等)を使えるようにする
    • OS と通信する

ローカルファイルシステム

  • ストレージ側のファイルシステム
    • 何百万、何百兆のゼロイチの並びのどこにファイル・ディレクトリ、その他メタデータ等を置くかを規定・実現
  • 主なファイルシステム
    • ext4, ext3, (extended file system): Linux
    • UFS2 (UNIX File System2): FreeBSD
    • HFS+ (Hierarchical File System Plus): Mac OS X
    • NTFS (NT File System), FAT16, FAT32, exFAT: Windows
  • 特殊なファイルシステム
    • procfs, sysfs, tmpfs, スワップファイルシステム

ストレージにデータを書く仕組み

  • ストレージがあったら、いくつかのパーティションに分け、それぞれの形式でファイルシステムをフォーマットして使う
  • ストレージの区分け
    • パーティション[latex]\\rightarrow[/latex]ローカルファイルシステム[latex]\\rightarrow[/latex]ブロックグループ[latex]\\rightarrow[/latex]ブロック
    • 注意: HDD 自体にもセクタ、トラック、シリンダーという階層構造があるが、それは別の話

パーティションの確認

  • $ sudo parted -l
    Model: SD SA16G (sd/mmc)
       Disk /dev/mmcblk0: 15.6GB
       Sector size (logical/physical): 512B/512B
       Partition Table: msdos
       Disk Flags:
    
       Number  Start   End     Size    Type      File system  Flags
       1      4194kB  1089MB  1085MB  primary   fat32        lba
       2      1091MB  15.6GB  14.5GB  extended
       5      1095MB  1158MB  62.9MB  logical   fat16        lba
       6      1162MB  15.6GB  14.5GB  logical   ext4
       3      15.6GB  15.6GB  33.6MB  primary   ext4

iノード、ディレクトリ

  • ファイルを管理するためのデータ
  • iノード番号: ファイルやディレクトリ(これもファイル)の固有番号
    • $ ls -i で、iノード番号が表示できる

    • ディレクトリもファイルなので当然iノード番号を持つ

  • ディレクトリ
    • ディレクトリエントリのリストの管理
    • ディレクトリエントリ
      • ファイルのiノードと名前
      • (ファイル名を変えても変わるのはファイル本体ではない)

仮想ファイルシステム(VFS

  • 主な役割
    • ローカルファイルシステムの違いを吸収
      • write,read 等のシステムコールが呼ばれると各フォーマット用の関数に変換される
      • i ノードという概念がないローカルファイルシステムもi ノードをなんとか再現
  • 機能
    • メモリ上にi ノード(inode 構造体)やディレクトリエントリ(dentry 構造体)を展開してユーザプログラムとやりとり
    • データブロックの内容をメモリ上に保持(キャッシュ)

パーティションの作成

  • partedコマンドを作成
    • 例/dev/sdcに見えるUSBメモリをext4でフォーマット
$ sudo parted /dev/sdc
   GNU Parted 3.2
   Using /dev/sdc
   Welcome to GNU Parted! Type 'help' to view a list of commands.
   (parted) mklabel gpt                                                      
   (parted) unit GB                                                          
   (parted) print                                                            
   Model: TOSHIBA TransMemory-Mx (scsi)
   Disk /dev/sdc: 62.4GB
   Sector size (logical/physical): 512B/512B
   Partition Table: gpt
   Disk Flags:

   Number  Start  End  Size  File system  Name  Flags

 

  • 続き
    • パーティションを作ったらext4でフォーマット
(parted) mkpart
   Partition name?  []? data1                                                
   File system type?  [ext2]? ext4
   Start? 0                                                                  
   End? 62.4                                                                 
   (parted)   q
   $ mkfs.ext4 /dev/sdc1 

マウント・アンマウント

  • 既存のディレクトリにファイルシステムをぶら下げる
    • どこにでもぶら下げられる
  • 例: ~/tmpにさっきのUSBメモリのパーティションをぶら下げる
    • 注意: ~/tmpの中でやると話がややこしくなるので~/で作業を
    • $ echo aaa > ~/tmp/file1    #元のところにファイルを作っておきましょう
         $ ls ~/tmp
          file1
         $ sudo mount /dev/sdc1 ./
         $ sudo mount /dev/sdc1 ~/tmp   #マウント
         $ ls ~/tmp/             #~/tmpが差しているディレクトリが変わる
          lost+found
  • 続き
$ df
   ファイルシス   1K-ブロック      使用     使用可 使用% マウント位置
   (中略)
   /dev/sdc1         59871340     53064   56753856    1% /home/ueda/tmp
   $ sudo umount ~/tmp #アンマウント
   $ ls ~/tmp/ #元に戻る
   file1

擬似ファイルシステム

  • 仮想ファイルシステムとやりとりして機器の機能や
  • OS 内部の情報を提供
  • 主要なもの
    • devtmpfs(/dev/): デバイスファイル置き場
    • procfs(/proc/): プロセスの情報+その他OS の情報
    • sysfs(/sys/): OSの情報(/proc/が混乱したのでこちらに移動)
    • tmpfs(/run/shm/): DRAM 上にファイルを置く仕組み

デバイスドライバ・ デバイスファイル

  • デバイスドライバ
    • 計算機に接続された機器を操作するためのプログラム
      • HDD、ディスプレイ、カメラ、マイク、端末、 ...
  • デバイスファイル
    • デバイスドライバのインタフェース
    • ファイルとして表現されている
      • 機械と言えども、結局データをin/outするという点でファイルとして抽象化可能
    • /dev/の下に存在

/dev/下のファイル

  • $ ls -l /dev/
    • 日付右側の数字(10, 58 等): デバイスの番号
      • メジャー番号(左側): デバイスドライバ固有の番号
      • マイナー番号(右側): デバイスドライバの中で与えられる番号
    • ブロックデバイス、キャラクタデバイスの判別
      • パーミッション前の文字(b: ブロック、c: キャラクタ)
      • ブロックデバイス: データをブロック(塊)単位で読み書き
      • キャラクタデバイス: データをシーケンシャルに出し入れ
      • もう一つ、「ネットワークデバイス」( eth0等のあれ)があるがLinuxでは別扱い

デバイスドライバ

  • カーネルの一部として動作
    • Cで言えばmainを持たない関数の塊
    • 本来はカーネルと同時にコンパイルされるべき
    • ただしそれをやってしまうと時間や手間の無駄
  • Linuxにはカーネルの一部を動的に脱着する仕組みが存在
    • カーネルの一部: カーネルモジュール(拡張子 .ko)

カーネルモジュールの調査

  • ファイルの検索
    • $ sudo find / | grep '\\.ko$'
  • 今使われているカーネルモジュールはlsmodで調査
    • $ lsmod
         Module                  Size  Used by
         binfmt_misc             6388  1 
         bnep                   10340  2 
         hci_uart               17943  1 
         btbcm                   5929  1 hci_uart
         bluetooth             326067  22 bnep,btbcm,hci_uart
         (以下略)

カーネルモジュールの脱着

  • insmod, rmmod
    • 他にmodplobe
  • 例:
    • $ lsmod
         (中略)
         i2c_dev                 5859  0 
         (略)
         $ sudo rmmod i2c_dev
         $ lsmod | grep i2c
         $ 
         $ sudo insmod /usr/src/linux/drivers/i2c/i2c-dev.ko
         $ lsmod
         Module                  Size  Used by
         i2c_dev                 5859  0 
         (以下略)
  • insmodすると/sys/下で情報が見られるようになるので興味のある人は調査を
    • あとでカーネルモジュールを書くときにやります

デバイスドライバを作る

  • 来週から2週にかけて取り組みます
  • デバイスドライバを作る時の制限
    • カーネルモジュールはカーネルの一部なので、今動いているカーネルと整合性がないと動かない
    • 今動いているカーネルのバージョンにあったLinuxのヘッダファイルが必要
  • Raspbianの場合
    • 基本的に自分でLinuxのソースコードをダウンロードして、一度カーネルを作るのが面倒なようで手っ取り早い
      • これで整合性のあるヘッダファイルが得られる

カーネルの再構築(宿題)

  • LinuxをGitHubからクローンしてビルドしてカーネルを作ります
  • 手順
    1. $ git clone https://github.com/ryuichiueda/raspberry_pi_kernel_build_scripts.git
         $ cd raspberry_pi_kernel_build_scripts
         $ sudo ./kernel_build_and_install_for_pi2_pi3.bash
         $ sudo reboot
  • この作業で使ったシェルスクリプト「kernel_build_and_install_for_pi2_pi3.bash

カーネルの入れ替わりの確認

  • uname -aでビルドされた日時を確認
pi\@raspberrypi:~ $ uname -a
   Linux raspberrypi 4.4.22-v7+ #1 SMP Mon Sep 26 13:11:18 JST 2016 armv7l GNU/Linux