File System
目次
概要
簡単に言ってしまえば、データをファイルで管理する仕組みです。 よく”名前を付けて保存”や、”上書き保存”などをしていると思いますが、データの書き換えや内容変更がデータ自体を消すことなく行えるのは、ファイルシステムがそれらを管理してくれているからです。
それぞれのOSがどのようなファイルシステムで動作し、その上にどのようなディレクトリが構成されているかを知ることで、OSへの理解が深まります。
C言語のfopen、freadのようなプログラムでファイル操作ができるのは、動作しているPCがファイルシステムを有しているからです。
逆にほとんどのマイコンにはファイルシステムは含まれておらず、sdカードなどにデータを記載して読み込ませる、ということが出来ないのです(とはいえ最近のはけっこうできます)。
Windowsのファイルシステム、ディレクトリ構成
主にNTFSというファイルシステムを使っています。各ドライブごとにOSが定義されるため、外部記憶装置をマウントしなくても中身にアクセスできます。
そのため、外部記憶装置やssd、hddはD:
、E:
といった名前のドライブとして扱われます。
WindowsのメインのディレクトリはC:
から始まり、その下の構成は次のようになっています。
ここにはPC全体に関わる設定ファイルが含まれます。
- Users
ユーザーのディレクトリ。複数アカウントがあると、ここに表示される。 - ProgramFiles
64bitのプログラムとアプリケーションが保存される。 - ProgramFiles(x86)
64bit上の32bitアプリケーションが保存される。 - Windows
OSの本体。- System32 主要なシステムや実行ファイルが含まれる
- Fonts フォント
- Temp 一時ファイル。再起動のたびに消える
特にUsersの下のディレクトリについて、多くのアプリケーションはUsers/username
をホームディレクトリとみなし、設定ファイルを置くことになっています。そのためusernameは英語で、かつ単純な名前がいいでしょう。Pathもアクセスしやすく使いやすいです。
- Users/username/Document
ファイル系はここで管理するとよい。pathとしては比較的アクセスしやすい。 - Users/username/Desktop
デスクトップに表示される。デスクトップはきれいな方がよい。仕事机と同じ。 - Users/username/Downloads
ダウンロードしたものは基本的にここに入る。ここをホームとして作業するのは非常に危険。私は定期的にすべて削除している。
基本的にC:はOSの本体に近いところで、あまりいじるのはよくないとされています。
ただし、開発者向けのソフトなどについてはPATHに追加するのが楽になるためC:直下で管理することもあるそうです。
PC全体に適用したい、または管理者権限が必要な実行ファイル系を含むアプリケーションはProgramFilesで、
その他ユーザー別管理でよく、権限を必要としない設定ファイル、ログ、キャッシュのみが必要なアプリはUsers/uname/Appdataで管理されるイメージです。 あとはUsers/uname直下に.ファイル名
という形でアプリが保存されるものもあります。
- ProgramFiles
Git, Google, Microsoft系, Cのコンパイラ, WSL, Zip解凍 - Appdata/Local
Zoom, Fusion, Unity, BambooStudio - Users/uname直下 tex, vscode, pythonのライブラリ, anaconda, arduinoIDE
あと、Windowsの機能としてOnedriveがります。私は嫌いです。というのも、同期しないで作業してると勝手に消えるし、ドキュメントがカタカナだしローカルと2個できるし、何ならデスクトップも2個あるし、ローカルのデスクトップは反映されないし、pathは長くなるし…
というわけで、個人的にはOnedriveを切って、git管理をするのがいいんじゃないかなーと思ってます。
最悪なのはusb管理ですね。消えます。というか昔消したことがあります。最低でもPCのローカル、大事なものは何らかの方法でクラウドに上げて管理しておくことをおすすめします。
Linuxのファイルシステム、ディレクトリ構成
linux(Ubuntu)はext4というファイルシステムを使っています。Windowsとの違いとして、すべての情報をファイルとして取り扱うため、外部記憶装置との間で情報をやり取りする際は記憶装置をマウントし、/mnt/sdb1
のような形にする必要がある点が挙げられます。
root権限
さて、linuxはすべてのファイルを統一的に管理するので、/
を根(=ルート)としてファイルが階層的に管理されています。WindowsでいうところのC:
にあたります。
よく聞く、sudo rm -rf /
は、OS含めPCの全部のファイルを削除しなさいというネタコマンドで、実行するとLinuxが消し飛びます。
rootの下にはOSの動きを決定するような重要なファイルがいくつもあり、これらをいじる権限をroot権限と呼びます。常にroot権限をユーザーに与えてしまうと何をしでかすか分からないので、基本的にはユーザー権限でloginし、必要なときにrootにアクセスする権限を借りる、という方式を取ることが多いです。これがsudoコマンド
です。コマンドの前にsudo
と入れることで一時的にroot権限を使うことができるのです。
さて、先程sudo rm -rf /
をするとlinuxが消し飛ぶ、と言いましたが、最近のlinuxはこれを禁止コマンドとして実行できないようなガードが入っています。安心ですね。というわけで次のコマンドを実行してみましょう。
sudo rm -rf / --no-preserve-root
するとあら不思議、linuxがなくなってしまいました。これが強制root権限です。使わないでください。
sudoers
linuxではだれがsudoをデフォルトで使えるか、を設定することができます。/etc/sudoers
を編集することで、様々なコマンドにsudo権限を付与することが可能です。通常はroot ALL=(ALL:ALL) ALL
と書いてあり、rootにroot権限を与えるとだけ書いてあります。sudo visudo
というコマンドでこれを編集することで、好きなコマンドにroot権限を付与することができます。
FHS
Filesystem Hierarchy Standard。linuxの全ディストリビューションで、ディレクトリ構成に関する統一化が図られています。現在でも多くの差異はあるため、これは1つの指標程度に捉えてください。
-
/bin(Binaries)
rootと一般ユーザーが使うことのできる基本的なコマンドが格納されている。
python、which、apt、ls、rm、mkdir…
例えばls -l apt
とすると、
-rwxr-xr-x 1 root root 18824 Sep 5 2024 apt
このような出力が得られる。 -
/boot
システム起動時に必要なファイルが格納してある。BIOSの影響を受けないためにここにいるが、いじることはない。 -
/dev(Device)
ハードウェアや周辺機器はここに接続される。例えばマイコンをPCにつなぎ、シリアルで接続すると、開かれるシリアルポートはたいてい/dev/tty/ACM0
や/dev/tty/USB0
のような名前になる。
この階層の設計思想はUnixを受け継いでおり、デバイスはファイルと同じようにOpen,Read,Write,Closeができるような扱いがされる。 - /etc(Etcetra)
システムの設定ファイル。ここにあるファイルを変更することでOSのシステム周りをいじることができる。- /etc/systemd
- /etc/udev
udev.confというファイルがある。ここにコンフィグを追加すると、デバイスが接続した際のOSの挙動を変更することができる。 - /etc/ssh
外部からのssh接続を可能にする。 - /etc/netplan yamlファイルで接続するネットワークの設定や自分のipアドレスの設定を書くことができる。
- /etc/dpkg
追加したパッケージの情報などが格納される。基本的には触らない。
ここで扱われるものはpackage(.debファイル)で、ソフトウェアに関わるところ。つまりOS側のパッケージ。 - /etc/dkms Dynemic kernel module Support
dpkgとは違いkernelに依存するモジュールで、どれを使うかが書いてある。kernelのupdateの際に参照され、必要なパッケージがダウンロードされるようになっている。 - /etc/ros/rosdep/sources.list.d これはrosに関するもの。updateが失敗するときは結構ここに問題がある。
- /home
各ユーザーのホームディレクトリ。WindowsではUsersとなっている。- /home/uname
基本的にファイル系はここにまとめておくとよい。
- /home/uname
-
/lib(library)
システムの起動時に必要なものや、bin、sbinのコマンド実行に必要なライブラリが格納されている。触らない。 -
/mnt(mount)
外部のファイルシステムを一時的にマウントする際に使う。usbやsdカードをフォーマットするときなどはここにマウントする。 -
/opt(optional)
外部パッケージが入るところ。rosはここにいる。 -
/proc(Process)
kernel(OSの構成参照)内部の情報にアクセスするための仮想階層。 CPU情報やメモリの使用状況、ネットワーク情報が参照できる。 -
/root
システム管理者のホーム。homeが壊れてもここで作業が続行できる、ということらしい。 -
/sbin(System Binary)
OSが動作するために必要なコマンドが格納されている。ここにあるコマンドはすべて実行にsudo権限が必要
netplan、arp、dkms… -
/tmp(Temporary)
一時的に使用するファイルを格納する。再起動時にリセットされる。 - /usr
全ユーザーが使うものが格納されている。ユーザー単位のrootのようなもの。bin,sbin,libの本体はじつはここ。- /usr/bin
/binの本体。~$ ls -ld /bin lrwxrwxrwx 1 root root 7 Mar 29 2024 /bin -> usr/bin
というように、/binは単に/usr/binへのリンクに過ぎない。ではなぜ/binが存在しているかと言うと、usrがない場合にも最低限のコマンドは実行できるようにするためである。
- /usr/bin
- /var(Variable)
システム運用中のログファイルが格納される。
時々プロセスがlocされています。というエラーが出るが、これはプロセスが正常終了できず次に行けないというエラーであり、このときに/var/lock/hogehoge.loc
というファイルを消すとlockが解除される。
Macのファイルシステム、ディレクトリ構成
ちょっとわかんないんでAIに書かせました。根っこはUnixなので、linux見ればだいたいわかるんじゃないかなーと思ってます。Macがわかる人、ぜひ書き直してください。
macOS は APFS (Apple File System) を使用し、Unix 系 OS と同様に /
をルートとして管理します。
外部ドライブは /Volumes
配下にマウントされます。
root 権限
- root ユーザーが OS の重要操作を行う
- 必要に応じて
sudo
コマンドで一時的に権限を借りる
主なディレクトリ
-
/Applications
アプリケーションを格納(Windows の Program Files 相当) -
/System
OS 本体のシステムファイル -
/Library
システム全体で使うライブラリや設定ファイル - /usr
全ユーザー共通で使うコマンド・ライブラリ/usr/bin
、/usr/lib
、/usr/sbin
-
/bin
基本的なコマンド -
/tmp
一時ファイル -
/var
ログやキャッシュ -
/dev
デバイスファイル -
/Volumes
外部ドライブやネットワークドライブのマウントポイント - /Users
ホームディレクトリ/Users/username/Documents
:書類/Users/username/Desktop
:デスクトップ/Users/username/Downloads
:ダウンロード/Users/username/Library
:ユーザー専用設定やキャッシュ