ラズベリー物語と外付けHDD。 プラットフォームの最初の開発経験

こんにちは、Habr! 数週間前、オタクの手はとかされました-かなりセンセーショナルで有名なシングルボードミニコンピューターRaspberry Piを買いたかったのです。 このモデルは、「クールな」バージョン-512MBのRAMを搭載したバージョン「B」を選択しました。



この投稿は何か他のものについてです。 セットアップでのすべての操作の後、いわば「動作中」のマシンを試してみたかったのです。 アイデアはほとんどすぐに生まれました。 自宅には、コンピューター3台、スマートフォン2台、バジェットルーター、および外部2Tbハードドライブ(Seagate Expansion External)があります。 HDD接続インターフェイスはUSBです。 コネクタのルーターには、イーサネットと電源コード用の穴しかありません。 すべてのデバイスはWiFi経由でのみルーターに接続し、コンスタントモードで動作するものはありません。 しかし、その後、ラズベリーが表示されます。 ボードのミニチュアサイズにより、[HDD <= USB => RPi <= Ethernet => DIR300NRU(ルーター)<= WiFi => LAN]という形式のシステムを直接窓枠に配置し、ローカルネットワーク上のディスクを使用できます。 。 RPiはLinux OSファミリーで動作します。つまり、Raspbianをインストールしました。 sambaサーバーをインストールしてドライブを共有しているように見えますが、それは簡単すぎるでしょう。 最後のタスクはより複雑になりました:スマートフォンが現在このネットワークに接続されている場合にのみ、ローカルネットワークで外部ドライブを使用可能にする必要があります。 したがって、デーモンを作成し、Pythonで作成します。 行こう!



最初に、最初に...サンバ!



最初に、sambaとironを構成する必要があります。 USBを介してRaspberryにフックし、イーサネットを介してRaspberryをルーターに接続します。 すべてをコンセントに差し込みます。 SSH経由でRPiに接続します。WindowsではクライアントとしてPuTTYを使用しています。

Raspbianには、ディスクのNTFSパーティションを書き込み用に接続する方法はありません。読み取り専用としてのみマウントされ、ローカルネットワーク上の自身へのアクセスを許可しません。

問題ありません。必要なドライバーをインストールします。

pi@raspberrypi ~ $ sudo apt-get install ntfs-3g
      
      





次に、マウントするパーティションの名前を知る必要があります。次のようにします。

 pi@raspberrypi ~ $ sudo fdisk -l
      
      





そして、次のようなものが得られます。

ディスク/ dev / sda:2000.4 GB、2000398931968バイト

255ヘッド、63セクター/トラック、243201シリンダー、合計3907029164セクター

単位= 1 * 512 = 512バイトのセクター

セクターサイズ(論理/物理):512バイト/ 512バイト

I / Oサイズ(最小/最適):512バイト/ 512バイト

ディスク識別子:0x0006573a



デバイスブートスタートエンドブロックIDシステム

/ dev / sda1 2048 409602047 204800000 83 Linux

/ dev / sda2 409602048 419842047 5120000 82 Linuxスワップ/ Solaris

/ dev / sda3 419842048 3907028991 1743593472 7 HPFS / NTFS / exFAT



私の外付けHDDの名前はsdaです。パーティションはsda3と呼ばれますが、他の何かがあるかもしれません。 覚えておいてください。

次に、マウントする場所を探します。 デフォルトでは、ドライブは/ media / VolumeNameに自動的にマウントされます。 わざわざそこに残さないことにしました。 ディレクトリへのパスは次のとおりです:/ media / DataR。



次に、sambaサーバー自体を構成します。 書き込み用に構成ファイルを開きます。

 pi@raspberrypi ~ $ sudo nano /etc/samba/smb.conf
      
      





ネットワーク上で構成について詳しく読むことができます。構成ファイルを与えるだけです:

 [global] workgroup = WORKGROUP server string = RPi Fileserver netbios name = fileserver dns proxy = no log file = /var/log/samba/log.%m max log size = 1000 syslog = 0 panic action = /usr/share/samba/panic-action %d encrypt passwords = true passdb backend = smbpasswd obey pam restrictions = yes unix password sync = yes passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssucce$ pam password change = yes map to guest = bad user #======================= Share Definitions ======================= [ExternalHDD] comment = HDD Seagate Expansion External 2Tb path = /media/DataR writable = yes printable = no guest ok = yes read only = no
      
      







カスタマイズされましたか? 続けましょう。 構造全体のパフォーマンスを確認します。 パーティションをマウントし(最初に、念のためアンマウントします)、sambaサーバーを再起動します。

 pi@raspberrypi ~ $ sudo umount /media/DataR pi@raspberrypi ~ $ sudo mount /dev/sda3 /media/DataR pi@raspberrypi ~ $ sudo /etc/init.d/samba restart
      
      





エラーが観察されない場合は、ネットワーク上のサーバーを見つけてください。 ここで問題がなければ、次に進みます。



スクリプトを書く



Pythonで記述します。 インタープリターは、R​​aspbianにプリインストールされた状態で既に利用可能です。 私はすぐにコンソールに書くことにしました:

 pi@raspberrypi ~ $ nano shrdsk.py
      
      





必要なもの:



したがって、まず、必要なモジュールをインポートします。
 import socket as s #   from time import sleep #   from os import system #     from errno import * #    
      
      





さらに、すべてが小さな無限ループに収まります。

 while 1: sock=s.socket(s.AF_INET,s.SOCK_STREAM) #   try: sock.connect(('192.168.0.14',1001)) #     , IP     ,     system('mount /dev/sda3 /media/DataR') #  ,   system('/etc/init.d/samba restart') #   except socket.error, v: #  ,  2 : if v[0]==ECONNREFUSED: # 1 - IP ,    (  !) system('mount /dev/sda3 /media/DataR') #  system('/etc/init.d/samba restart') #  else: # 2 -  IP  system('umount /media/DataR') #  system('/etc/init.d/samba stop') #   sock.close() #        sleep(60) #   60 
      
      





これは最小限の実行可能なオプションですが、デバッグメッセージを構成してコンソールに出力する機能を追加して、少し変更することにしました。 完成したバージョンは次のようになります。

 # Coding: utf8 # Author: HeffCodeX # Version: 1.0 # !!!!!!!!!!!!!!!!!!!! # !START ME WITH ROOT! # !!!!!!!!!!!!!!!!!!!! ### # socket config: HOST='192.168.0.14' # host to detect PORT=1001 # any random port WAITING=60 # time to wait between connections (in secs) ### # mount config: MOUNT=1 # do mount/umount (1/0) DEV='sda3' # device (without "/dev/") DIR='/media/DataR' # directory to mount ### import socket as s from time import sleep from os import system from errno import * while (1): sock=s.socket(s.AF_INET,s.SOCK_STREAM) try: print "connecting..." sock.connect((HOST,PORT)) print "socket ok" if MOUNT: print "mount device" system("mount /dev/%s %s"%(DEV,DIR)) print "samba restart:" system("/etc/init.d/samba restart") except s.error, v: print "socket err" if v[0]==ECONNREFUSED: if MOUNT: print "mount device" system("mount /dev/%s %s"%(DEV,DIR)) print "samba restart:" system("/etc/init.d/samba restart") else: if MOUNT: print "umount device" system("umount %s"%DIR) print "samba stop:" system("/etc/init.d/samba stop") sock.close() print "waiting..." sleep(WAITING)
      
      





まとめ


絶対にすべてを構成でき、パーティションのマウントを(一度)無効にすることもできます。 ローカルネットワークに接続するためにデバイスに静的IPを登録する必要があります。これで、一種のディスクアクセスキーの準備ができました! 完全自動化のために、起動時にスクリプトを起動に追加できます。 rc.localシステムファイルを開きます。

 pi@raspberrypi ~ $ sudo nano /etc/rc.local
      
      





そして、次の行を追加します:

 su pi -c "python /home/pi/shrdsk.py"
      
      





もちろん、パスはあなた自身のものを示します。

読んくれてありがとう ! これは、Raspberry PiおよびLinux全般の最初の開発経験でした。



UPD1:再起動と自動起動についてのプロンプトを表示してくれてありがとう、最初のものを捨て、2番目のものを修正しました



All Articles