1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Raspberry PiでUSBメモリ内のファイルを実行可能にする方法

Last updated at Posted at 2020-02-20

追記

-- 2022年3月28日追記 --

udisks2.9.0で設定ファイルを読み込む機能が追加されました。
設定ファイルは /etc/udisk2/mount_options.conf で
mount_options.conf.example が提供されていますので、
コピーして編集すれば、USBメモリ内のファイルを実行可能にできます。

$ sudo cp /etc/udisks2/mount_options.conf{.example,} 
$ sudo nano /etc/udisk2/mount_options.conf

編集内容は

  • [defaults] の行のコメントを外す
  • vfat_defaults の行のコメントとshowexecを外す

です。

編集後、rebootすると mountのshowexecオプションが外れます。

参考: Configurable mount options: UDisks Reference Manual

-- 2022年3月28日追記 おわり--

背景

時々、Raspberry Piを業務で使用する。その場合、fsprotectとaufsでROM化し、いつでも電源切断可能状態にしている。これだとsdカードの寿命も気にする必要が無い。設定やデータの保存を行いたい場合には、USBメモリを刺し、保存している。

今回、顧客からプログラムのバージョンアップ機能もつけて欲しいという要望があり、プログラムをUSBメモリ側に置いて走らせれば良いかと考えていたが、試してみるとUSBメモリー上のファイルに実行可能パーミッションがつかない。 chmod +x してもつかない。実行できない。

現状の調査/ showexecオプション

raspberry piは Rasbianで動作している。 GUI (X-window)を動かしているので、ファイル・マネージャ (pcmanfm)が udisks2 を使用し USBの抜き差しを監視し、mountしているらしい。

USBメモリは /media以下にマウントされる。mountの状態を見てみる。vfatファイルシステムでマウントされている。

sc200213a.PNG

同じく vfatの /bootのマウントの状態を見る。

sc200213b.PNG

/boot以下のファイルには、全て 実行可能フラグがついている。mountオプションの違いを調べると showexecが怪しい。man で調べると

      sys_immutable, showexec, dots, nodots, dotsOK=[yes|no]
              FAT ファイルシステムに Unix または DOS のしきたりを 強制しようと
              するさまざまな試み。 おそらくは用いるべきでない。

とか

showexec
    If set, the execute permission bits of the file will be allowed only if the
    extension part of the name is .EXE, .COM, or .BAT. Not set by default. 

などとあるが、拡張子 .EXEのファイルで試しても 実行可能パーミッションはつかない。vfatファイルシステムの通常ファイルの実行可能フラグが、デフォルトでは全部ついて、このオプションがある時は、全部吐かないという動作になるのではないかと思われる。

対策の検討

mount時にshowexecオプションがつかないように設定できれば解決しそうなのだが、いくら調べても指定の方法がわからない。 showexecという文字列が使用されている場所を探したところ、udisks2のソースファイル中に発見。 vfatファイルシステムのデフォルトのマウントオプションらしい。 ソースを書き換え udisks2を置き換えてやれば解決できそうだ。

udisks2の改造

下記ページを参考に、raspberrry pi上で改造を行った。
Raspberry piにてapt-srcでパッケージをビルドするには

ツールの取得

ソースの取得とコンパイルに必要なツール apt-srcとbuild-essentialをインストールする。

$ sudo apt-get install apt-src build-essential

ソースの取得

/etc/apt/sources.listを編集し、deb-srcの行のコメントを外す。

$ sudo apt-get update
$ sudo apt-src update
$ cd 適当な作業ディレクトリ
$ apt-src install udisks2

プログラムの書き換え

./udisks2-2.18/src/udiskslinuxfilesystem.c を編集。
"showexec"という文字列を検索し、showexecの部分をコメントアウトする。

287行あたり、修正後の状態。

static const gchar *vfat_defaults[] = { "uid=", "gid=", "shortname=mixed", "utf8=1", /* "showexec", */ "flush", NULL };

コンパイル

以下のコマンドを実行する。
結構時間がかかる。

$ apt-src build udisks2

完了すると、拡張子 .debのファイルが、いくつか出来ている。

インストール

dpkgコマンドで .debファイルをインストールするが、インストールされたかどうか
わかりにくいので、元のファイルをコピーしておく。

$ sudo cp /usr/bin/udisksctl{,.orig}
$ sudo cp /usr/lib/udisk2/udisksd{,.orig}
$ sudo dpkg --install *.deb

確認

書き換わったことを確認します。

$ ls -l /usr/bin/udisksctl*
-rwxr-xr-x 1 root root 43100 11月 25  2016 /usr/bin/udisksctl
-rwxr-xr-x 1 root root 43048  2月 12 19:07 /usr/bin/udisksctl.orig
$ ls -l /usr/lib/udisks2/udisksd*
-rwxr-xr-x 1 root root 307948 11月 25  2016 /usr/lib/udisks2/udisksd
-rwxr-xr-x 1 root root 307952  2月 12 19:08 /usr/lib/udisks2/udisksd.orig
$

rebootし、mountオプションを確認する。

sc200213c.PNG

USBメモリ内のファイルを見ると、ファイルに
実行パーミッションが付いた。

sc200213d.PNG

最後に

システムの設定の変更をするのに、ソースを変更するのは違う気がするが、設定ファイルで変更する方法がわからなかったので仕方がない。設定ファイルで行う方法をご存じの方は、教えて頂ければ有り難い。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?