この記事では、ファイルシステム階層標準 (FHS、Filesystem Hierarchy Standard) について学びます。この記事で説明する内容は以下のとおりです。
- FHS に従ったファイルの配置場所について
- Linux システムでファイルとコマンドを検索する方法
- FHS に定義されている各種の重要なファイルとディレクトリーを検索する方法と、これらのファイルおよびディレクトリーの用途
この記事は、Linux Professional Institute の Junior Level Administration (LPIC-1) 101 試験の主題 104 の 104.7 の試験対策に役立ちます。この目標の重要度は 2 です。
この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。出力がかなり違っているとしても、重要な共通点は認識できるはずです。
ファイルシステム階層標準 (FHS、Filesystem Hierarchy Standard) は、Linux や他の UNIX® ライクなシステムでの共通ディレクトリー構造を規定する文書です。Linux ディストリビューションの違いに関係なく、同じ標準的な場所にファイルを配置することによって、ディストリビューションに依存しないソフトウェア開発を容易にする FHS は、Linux Standard Base (「参考文献」を参照) でも採用されています。FHS により、ユーザーも、ソフトウェアも、インストールされたファイルとディレクトリーの位置を予測できるようになっています。FHS 準拠のファイルシステムは、オペレーティング・システムが大抵の UNIX ファイルシステムに備わっている基本的なセキュリティー機能をサポートすることを前提とします。
FHS の中核となっているのは、互いに独立した以下の 2 つのファイル特性です。
- 共有可能であるか、共有不可であるか
- 共有可能ファイルは、そのファイルが配置されているシステムとは別のシステム上でも使用することができます。一方、共有不可のファイルは、そのファイルを使用するシステム上に配置しなければなりません。
- 静的であるか、可変であるか
- 静的ファイルとは、システム管理者の介入 (例えばパッケージのインストールやアップグレードなど) によってのみ変更されるファイルのことです。静的ファイルにはマニュアル、ライブラリー、およびバイナリーが含まれます。一方、可変ファイルとは静的ファイル以外のすべてのファイル (ログ、スプール・ファイル、データベース、ユーザー・データなど) を指しており、これらのファイルはユーザーやシステム・プロセスによって変更されることがあります。
以上の区別により、異なる一連の特性を持ったファイルを、それぞれ別のファイルシステムに保管することができます。表 1 に、FHS 文書から抜粋した FHS 準拠のファイル配置例を記載します。
| 共有可能 | 共有不可 | |
|---|---|---|
| 静的 | /usr /opt | /etc /boot |
| 可変 | /var/mail /var/spool/news | /var/run /var/lock |
Linux システムに何百、何千ものファイルが含まれていることは珍しくありません。私が最近インストールした 64-bit の Fedora 13 システムには、/usr 階層だけをとっても 75,000 を超えるファイルが保管されています。他に私が使っているシステムのほとんどでも、ファイルの数は 100,000 を超えているか、場合によっては 200,000 に達しています。次の 4 つのセクションでは、この膨大なデータのなかからファイル、特にプログラムを探し出すために利用できるツールについて説明します。
複数の Linux システムを使ったことがあれば、もうご存知だと思いますが、root としてログインすると、ユーザーとしてログインしているときには実行できないコマンド (fdisk など) を実行できるようになります。コマンドラインでプログラムを実行すると、bash (または別の) シェルが要求されたプログラムを見つけるために、ディレクトリーのリストをひと通り検索します。ディレクトリーのリストが指定されるのは PATH 環境変数で、root ユーザーのパスには /sbin を組み込むことができますが、root 以外のユーザー・パスには組み込めません。リスト 1 に、2 つの異なるディストリビューションでのユーザー・パスの例と、root パスの例を記載します。
リスト 1. PATH の例
ian@pinguino:~$ # An Ubuntu 9.10 system ian@pinguino:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games [ian@echidna ~]$ # An openSUSE 11.2 system ian@attic4:~> echo $PATH /usr/lib64/mpi/gcc/openmpi/bin:/home/ian/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/u sr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin [root@echidna ~]# # And as root attic4:~ # echo $PATH /usr/lib64/mpi/gcc/openmpi/bin:/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/ usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/b in:/usr/lib/mit/sbin |
上記を見るとわかるように、PATH 環境変数はコロンで区切られたディレクトリー名のリストに過ぎません。fdisk コマンドは、実際には /sbin/fdisk にあります。そのため上記のパスのうち、ユーザーがこのコマンドを実行する際に、完全修飾名 (/sbin/fdisk) を入力するのではなく、fdisk とだけ入力すればよいのは、最初と最後のパスだけです。
通常、ユーザーのパスは .bash_profile または .bashrc などの初期化ファイルに設定されます。この初期化ファイルに新しいパスを指定することで、現行の bash プロセスに対してパスを変更することができます。新しいパスの値を以降の他のプロセスでも使用できるようにする場合には、忘れずに PATH 環境変数をエクスポートしてください。その一例をリスト 2 に記載します。
リスト 2. PATH の変更方法
ian@attic4:~> fdisk Absolute path to 'fdisk' is '/sbin/fdisk', so running it may require superuser privileges (e.g. root). ian@attic4:~> export PATH=/sbin:$PATH ian@attic4:~> fdisk Usage: fdisk [-l] [-b SSZ] [-u] device E.g.: fdisk /dev/hda (for the first IDE disk) or: fdisk /dev/sdc (for the third SCSI disk) or: fdisk /dev/eda (for the first PS/2 ESDI drive) or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices) |
前のセクションでは、fdisk コマンドを実行しようとしたときに、このコマンドを使用できない場合がある理由を説明しました。その一方、コマンド名を入力したときに、実際に実行されることになるコマンドを見つけるのに役立つコマンドもいくつかあります。
which コマンドは、コマンド名を入力したユーザーのパスを検索し、実際に実行されるコマンド (存在する場合) を表示します。リスト 3 は、fdisk コマンドを検索する場合の例です。
リスト 3. which の使用方法
ian@attic4:~> which fdisk which: no fdisk in (/usr/lib64/mpi/gcc/openmpi/bin:/home/ian/bin:/usr/local/bin:/usr/bin: /bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/ lib/mit/sbin) ian@attic4:~> export PATH=/sbin:$PATH ian@attic4:~> which fdisk /sbin/fdisk |
which コマンドが表示するのは、ユーザーのパスで検出されたコマンドの最初のオカレンスだけです。複数のオカレンスがあるかどうかを調べるには、リスト 4 に示すように、-a オプションを追加します。
リスト 4. 複数のオカレンスを検出する場合の which の使用方法
ian@attic4:~> which awk /usr/bin/awk ian@attic4:~> which -a awk /usr/bin/awk /bin/awk /usr/bin/X11/awk |
上記で awk コマンドが検出されている場所は、usr/bin (システム上のコマンドのメイン・ディレクトリー)、/bin (このディレクトリー内のコマンドは、システム管理者とユーザーの両方が使用できます。他のファイルシステムが 1 つもマウントされていない場合、このディレクトリーは必須です)、そして /usr/bin/X11 (X Window System 用のバイナリーが置かれるディレクトリー) の 3 箇所です。
この連載の別の記事「Linux の 101 試験対策: ハード・リンクとシンボリック・リンクの作成および変更」で、これらの 3 つのファイルが結局はすべて 1 つの gawk コマンドを表していることを調べる方法を説明しています (リスト 5 を参照)。
リスト 5. すべて gawk にリンクされている awk コマンド
ian@attic4:~> ls -l $(which -a awk) lrwxrwxrwx 1 root root 4 2010-02-09 00:46 /bin/awk -> gawk lrwxrwxrwx 1 root root 8 2010-02-09 00:46 /usr/bin/awk -> /bin/awk lrwxrwxrwx 1 root root 8 2010-02-09 00:46 /usr/bin/X11/awk -> /bin/awk |
シェルの組み込みコマンドなど、which コマンドでは検出できないコマンドもあります。type コマンドは、指定されたコマンド・ストリングが実行に際してどのように評価されるかを調べるための組み込みコマンドです。リスト 6 では which と type を使用して、type コマンドはパスに置かれているような実行可能コマンドではなく、シェルの組み込みコマンドであることを明らかにしています。
リスト 6. type の使用方法
ian@attic4:~> which type which: no type in (/usr/lib64/mpi/gcc/openmpi/bin:/home/ian/bin:/usr/local/bin:/usr/bin:/ bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/l ib/mit/sbin) ian@attic4:~> type type type is a shell builtin |
プログラムが置かれている場所だけでなく、さらに詳しい情報が必要な場合には、whereis コマンドを使用してください。例えば、このコマンドを使用して man ページや他の情報を検索することができます (リスト 7 を参照)。
リスト 7. whereis による man ページの検索方法
ian@attic4:~> whereis awk awk: /bin/awk /usr/bin/awk /usr/lib64/awk /usr/bin/X11/awk /usr/share/awk /usr/share/man/man1/awk.1.gz /usr/share/man/man1p/awk.1p.gz |
whereis は、/sbin 内にある awk のコピーを検出しなかったことに注意してください。whereis が使用するディレクトリーは固定されているため、このコマンドで必ず検索対象を検出できるとは限りません。whereis コマンドはソース・ファイルの検索、代替検索パスの指定、および異常なエントリーの検索にも対応します。whereis の振る舞いを変更する方法、またはこのコマンドが使用する固定パスを変更する方法については、man ページを調べてください。
連載の以前の記事「Linux の 101 試験対策: ファイルとディレクトリーの管理」では、名前 (ワイルドカードを含む)、パス、サイズ、またはタイムスタンプを基準にファイルを検索する方法を学びました。また、別の記事「Linux の 101 試験対策: ハード・リンクとシンボリック・リンクの作成および変更」では、特定のファイルまたは i ノードへのリンクを検索する方法を学びました。
find コマンドはいわば、Linux システムのファイル検索ツールを集めたスイス・アーミー・ナイフです。以前の記事で説明した機能の他、このコマンドのユーザーまたはグループ名を基準にファイルを検索する機能、そしてアクセス権を基準にファイルを検索する機能も役に立つと思います。
例えば、あるユーザーが /tmp 階層に保管しているファイルを調べたいとします。リスト 8 に、root ユーザーがユーザー ian の /tmp に含まれるすべてのファイルを検索する方法を示します。
リスト 8. ユーザーおよびグループを基準としたファイルの検索
attic4:~ # find /tmp -user ian /tmp/kde-ian /tmp/kde-ian/closeditems /tmp/kde-ian/closeditems/_1.66 /tmp/kde-ian/systemsettingsR27913.tmp /tmp/.ICE-unix/2288 /tmp/orbit-ian /tmp/orbit-ian/linc-12f7-0-33cb4ce9b1fbf /tmp/orbit-ian/linc-7d00-0-70e5ebaa4ddac /tmp/orbit-ian/linc-12ea-0-68260abbd2051 /tmp/orbit-ian/linc-12ea-0-3377ca55c0bd2 /tmp/ksocket-ian /tmp/ksocket-ian/klauncherMT2183.slave-socket ... |
-group テストを使って、グループを基準にファイルを検索することもできます。さらに、-nouser および -nogroup オプションを使用することで、システムのどのユーザーにも、またはどのグループにも属していないファイルを検索することも可能です。他のテストと同様、「!」を使用すればテストの否定を実行することができます。通常、私は自分のユーザー番号を、一部のシステムでデフォルトとして使われている 1000 に設定しています。そこで、グループ番号を同じく 1000 に設定した ian というグループを作成します。他のシステムでは今でも番号が 500 から始まっていたり、新規ユーザーをデフォルトで「users」グループに配置したりする場合もあります。Red Hat 6.2 システムを基に記録された古い研究資料では、未だにユーザー番号が 500 となっています。リスト 9 に現在のユーザー・グループが所有してないディレクトリーを見つける方法を示します。research/rh62/involution は、ユーザー番号 500 およびグループ番号 4 が所有していますが、私が現在使用しているシステムには、このユーザーとグループはどちらも存在しません。数値によるユーザー ID またはグループ ID を基準にファイル、あるいはディレクトリーを検索するには、-uid または -gid テストを使用してください。
リスト 9. ian が所有していないディレクトリーの検索
ian@attic4:~> find -L research -maxdepth 2 -type d ! -group ian research/rh62/involution research/rh62/programs research/lost+found find: `research/lost+found': Permission denied ian@attic4:~> ls -ld research/rh62/involution drwxr-xr-x. 2 500 4 4096 1999-11-10 08:09 research/rh62/involution |
アクセス権を基準にファイルを検索するには、-perm テストと併せて、chmod コマンドや umask コマンドで使用するような記号式を使用します。完全一致のアクセス権を検索することもできますが、それよりも、アクセス権の式の先頭にハイフンを付けて、検索対象は指定のアクセス権を持つファイルのみにし、その他のアクセス権は任意であることを指定すると有効な場合がよくあります。リスト 10 では、ユーザー、グループ、および全員が実行可能なファイルを検索する方法、そして他のユーザーは読み取ることのできないファイルを検索する 2 つの方法を説明します。
リスト 10. アクセス権を基準としたファイルの検索
ian@attic4:~> find . -maxdepth 1 -type f -perm -uga=x ./.xinitrc.template ian@attic4:~> ls -l ./.xinitrc.template -rwxr-xr-x 1 ian users 1446 2010-02-09 08:55 ./.xinitrc.template ian@attic4:~> find . -maxdepth 1 ! -perm -o=r ./.Xauthority ./.pulse ... ian@attic4:~> find . -maxdepth 1 ! -perm -0004 ./.Xauthority ./.pulse ... |
これまで、find コマンドで実行できる主な検索のタイプをいくつか説明してきましたが、出力をさらに絞り込むには、複数の式を組み合わせ、その組み合わせに正規表現を追加するという方法があります。この万能のコマンドについて詳しく学ぶには、man ページを使用してください。あるいは情報システムがインストールされている場合には、info find を使用すると、さらに詳しい情報を調べることができます。
リスト 11 に、find を使用して検索する最後の例を記載します。最初の例では、cd を実行して /usr/include にカレント・ディレクトリーを変更し、表示される内容が長くなりすぎないようにしてから、パス名に大/小文字に関わらず packet という単語が含まれるすべてのファイルを検索しています。2 番目の例では、出力をさらに絞り込んで、ディレクトリーではなく、サイズが 1500 バイト以上のファイルだけを検索対象としています。お使いのシステムでの実際の出力は、どのパッケージがインストールされているかによって異なります。
リスト 11. find の最後の例
ian@attic4:/usr/include> find . -iregex ".*packet.*" ./c++/4.4/java/net/DatagramPacket.h ./c++/4.4/gnu/classpath/jdwp/processor/PacketProcessor.h ./c++/4.4/gnu/classpath/jdwp/transport/JdwpPacket.h ./c++/4.4/gnu/classpath/jdwp/transport/JdwpReplyPacket.h ./c++/4.4/gnu/classpath/jdwp/transport/JdwpCommandPacket.h ./netpacket ./netpacket/packet.h ./net/if_packet.h ./linux/if_packet.h ian@attic4:/usr/include> find . -iregex ".*packet.*" ! -type d -size +1500c ./c++/4.4/java/net/DatagramPacket.h ./c++/4.4/gnu/classpath/jdwp/transport/JdwpPacket.h ./netpacket/packet.h ./linux/if_packet.h |
注意する点として、正規表現は、find によって返される完全パスと一致していなければなりません。正規表現とワイルドカードの違いを思い出してください。
find コマンドを実行するたびに、このコマンドは指定されたすべてのディレクトリーを検索します。検索時間を短縮するには、locate という別のコマンドを使用することができます。このコマンドは毎回ファイルシステムを検索するのではなく、パス情報が保管されたデータベースを検索します。
locate コマンドは、一致するファイルをデータベースで検索します。このデータベースは通常、cron ジョブによって毎日更新されます。
locate コマンドが検索対象とするのはファイル名だけではありません。このコマンドは、パス名の構成部分も突き合わせます。ファイル名は単一引用符で囲み、より正確に突き合わせるために 1 つ以上のグロビング文字を含めてください。リスト 12 に、bin/ls というストリングが含まれるパスを検出する方法を示します。このリストには、グロビング文字を使って出力を絞り込む 2 つの例も記載されています。
リスト 12. locate を使用したパスの検索と出力の絞り込み
ian@attic4:~> locate /bin/ls /bin/ls /bin/lsmod /usr/bin/lsattr /usr/bin/lsb_release /usr/bin/lscpu /usr/bin/lsdev /usr/bin/lshal /usr/bin/lsof /usr/bin/lsscsi /usr/bin/lsusb ian@attic4:~> locate '\/bin/ls' /bin/ls ian@attic4:~> locate '/bin/ls*' /bin/ls /bin/lsmod |
locate コマンドがデフォルトで使用するデータベースは、/var ファイルシステムの例えば /var/lib/located などの場所に保管されています。この場所は、セキュリティーの強化や速度向上のために slocate パッケージや mlocate パッケージを使用しているシステムでは異なる可能性があります。locate データベースの統計を検索するには、locate -S を使用することができます (リスト 13 を参照)。
図 13. Locatedb の統計
ian@attic4:~> locate -S
Database /var/lib/locatedb is in the GNU LOCATE02 format.
Locate database size: 3011297 bytes
All Filenames: 259149
File names have a cumulative length of 15751703 bytes.
Of those file names,
11421 contain whitespace,
0 contain newline characters,
and 0 contain characters with the high bit set.
Compression ratio 80.88% (higher is better) |
このデータベースを作成、または更新するために使用するコマンドは、updatedb です。このコマンドは通常、cron ジョブとして毎日実行されます。updatedb の構成ファイルは、/etc/updatedb.conf (場合によっては /etc/sysconfig/locate) です。データベースが毎日更新されるようにするには、root ユーザーが /etc/updatedb.conf を編集して、DAILY_UPDATE=yes を設定する必要があります。データベースを即時作成するには、root として updatedb コマンドを実行します。
locate を使用する際には、セキュリティーや、updatedb データベースの日次ビルドに関するネットワーク上のファイル I/O についても考慮しなければなりません。詳細については、man ページおよび updatedb 構成ファイルを調べてください。
FHS が目標としているのは、ルート・ファイルシステムをできる限り小さく維持することです。けれども、ルート・ファイルシステムには、経験を積んだ管理者がこれらの作業を行うために必要とするユーティリティーを含め、システムのブート、リストア、リカバリー、あるいは修理に必要なすべてのファイルが保管されていなければなりません。システムをブートするには、他のファイルシステムのマウントを許可するのに十分なファイルがルート・ファイルシステムに置かれている必要があることに注意してください。
表 2 に、FHS がルート (/) ファイルシステム内に規定しているディレクトリーと、それぞれのディレクトリーの用途を記載します。このリストに記載されているディレクトリー、またはそのディレクトリーへのシンボリック・リンクは必ず存在していなければなりません。ただし、オプションと記されているディレクトリーについては、対応するサブシステムが存在する場合に限り、必要となります。
| ディレクトリー | 用途 |
|---|---|
| bin | 必須コマンドのバイナリー |
| boot | ブート・ローダーの静的ファイル |
| dev | デバイス・ファイル |
| etc | ホスト固有のシステム構成 |
| lib | 必須の共有ライブラリーおよびカーネル・モジュール |
| media | 取り外し可能なメディアのマウント・ポイント |
| mnt | ファイルシステムを一時的にマウントするためのマウント・ポイント |
| opt | アドオン・アプリケーションのソフトウェア・パッケージ |
| sbin | 必須のシステム・バイナリー |
| srv | このシステムが提供するサービスのためのデータ |
| tmp | 一時ファイル |
| usr | 2 次階層 |
| var | 可変データ |
| home | ユーザーのホーム・ディレクトリー (オプション) |
| lib<qual> | 代替フォーマットに必須の共有ライブラリー (オプション) |
| root | root ユーザーのホーム・ディレクトリー (オプション) |
/usr と /var の 2 つの階層は、FHS が専用のセクションを設けるほどに複雑です。/usr ファイルシステムは、ファイルシステムのなかで 2 番目に主要なセクションで、ここには共有可能な読み取り専用のデータが含まれます。/usr は複数のシステム間で共有することができますが、現在の慣例で共有していることはほとんどありません。
/var ファイルシステムには、スプール・ディレクトリーおよびファイル、管理データとロギング・データ、短期データと一時データを含めた可変データ・ファイルが保管されます。/var にはシステム間で共有できない部分がありますが、その他の部分 (/var/mail、/var/cache/man、/var/cache/fonts、/var/spool/news など) は共有することができます。
この標準を完全に理解するには、FHS 文書を読んでください (「参考文献」を参照)。
学ぶために
- 2009年4月時点での目標に基づく LPIC-1 認定に備えるために必要な developerWorks の記事を見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。
- LPIC Program サイトで、Linux Professional Institute の 3 つの Linux システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べてください。特に、2009年4月時点での LPI 101 試験および LPI 102 試験の目標は要チェックです。最新の目標については、必ず LPIC Program サイトを参照してください。
- developerWorks の連載「LPI exam prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。
- FHS (Filesystem Hierarchy Standard) のホームにアクセスしてください。
- LSB (Linux Standard Base) について学んでください。LSB は、標準バイナリー・オペレーティング環境の開発を目的とする FSG (Free Standards Group) プロジェクトです。
- The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。
- developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
- さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。
- 無料の developerWorks Live! briefing に参加して、IBM 製品およびツール、そして IT 業界の傾向を素早く学んでください。
- developerWorks の on-demand demos で、初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
- Twitter で developerWorks フォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。
製品や技術を入手するために
- ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。
議論するために
- ディスカッション・フォーラムに参加してください。
- My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

Ian Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。