Linux オペレーティング システムの書き込みにおける 4 つのステップの内容の詳細な説明

目次

1. 最初に uboot を移植します (uboot に関するすべてのことはカーネルを開始することです)。

1.ubootとは何ですか?

2. uboot の機能は何ですか?

3. ubootの機能の詳細説明

4. uboot の仕組み

2番目に、Linuxカーネルを移植する

1. Linux カーネルとは何ですか?

2. Linux カーネルには何が含まれていますか?

 3. デバイスツリーファイルを再コンパイルして移植します。

1. デバイスツリーファイルとは何ですか?

2. デバイスツリーファイルとは何ですか?

3. デバイス ツリー ソース ファイル (.dts) の構文の概要

4. デバイスツリーOF機能

 4 番目に、最後にルート ファイル システム (rootfs) を移植します。

1. ルート ファイル システムとは何ですか?

2. ルート ファイル システムがそれほど重要なのはなぜですか?

3. Linux ファイルシステムの共通ディレクトリ


1. 最初に uboot を移植します(uboot に関するすべてのことはカーネルを開始することです)。

1.ubootとは何ですか?

Uboot はブートローダーの一種で、カーネルのブートと開始に使用されます。その最終的な目的は、フラッシュからカーネルを読み取り、メモリに置き、カーネルを開始することです。したがって、UBOOT にはフラッシュの読み取りおよび書き込み機能が必要です。

2. uboot の機能は何ですか?

1) uboot の主な機能は、オペレーティング システムのカーネルを起動することです。これは、カーネルを起動する uboot の最後のコードに反映されます。

2) uboot は、コンピュータ システム全体の展開も担当します。これは、uboot の最後のパラメータ渡しに反映されます。

3) uboot には、フラッシュなどのボード上のハードウェアを操作するためのドライバーもあります。たとえば、シリアル ポート、ping ネットワークが成功したかどうか、フラッシュの消去とプログラミングが成功したかどうかなどを印刷する必要があります。

4) uboot は、ユーザーが操作するためのコマンド ライン インターフェイスを提供する必要があります。例: Linux ターミナル コマンド ライン インターフェイス。

例: コンピュータの Windows システム

すべてのコンピュータ システムが実行するために必要な主なコア コンポーネントは、CPU + 外部メモリ (フラッシュ/ハードディスク) + 内部メモリ (DDR SDRAM/SDRAM/SRAM) の 3 つです。一般的な PC の起動プロセスは次のとおりです: PC の電源がオンになった後、BIOS プログラムが最初に実行されます (実際、PC の BIOS は NorFlash です)。BIOS プログラムは DDR メモリとハードディスクの初期化を担当し、その後、BIOS プログラムが実行されます。 OS イメージをハードディスクから DDR に読み取り、その後 DDR にジャンプして OS が起動するまで実行します (OS 起動後は BIOS は役に立ちません)。

つまり、組み込みシステムの起動プロセスは、BIOS が uboot になり、ハードディスクがフラッシュになることを除いて、PC の起動プロセスとほぼ同じです。

3. ubootの機能の詳細説明

単独で直接起動できます

1) 一般的な SoC は、SD カード ブート、NorFlash ブート、NandFlash ブートなどの複数のブート方法をサポートしています。 ••••• uboot でブートできるようにするには、特定の SoC ブート設計に従って uboot を設計する必要があります。

2) uboot は、対応するブート メディアから確実にブートできるように、ハードウェアに対応するコード レベルで変更および移植する必要があります。この部分は、特に uboot の最初のステージの start.S ファイルで処理されます。

オペレーティング システムのカーネルを起動し、カーネルにパラメータを渡すことができます。

1) uboot の最終目標は、カーネルを起動することです。

2) Linux カーネルの設計時に、パラメータとして渡せるように設計されていますつまり、uboot で Linux カーネルの起動パラメータをいくつか準備し、メモリ内の特定の場所に配置してカーネルに渡すことができます。カーネルが起動すると、この特定の場所に移動してパラメータをフェッチします。 uboot によって渡され、カーネルで解析されます。これらのパラメータは、Linux カーネルのブート プロセスをガイドするために使用されます。

システム導入機能を提供可能

1) uboot は、フラッシュ上でシステム全体 (uboot、カーネル、rootfs などを含む) の書き込みとダウンロードを完了するために使用できなければなりません。

2) ベア メタル チュートリアル (ARM ベア メタルの 3 番目の部分) でのフラッシュは、uboot の fastboot 関数を使用してさまざまなイメージを iNand に書き込み、iNand から開始します。

SoCレベルおよびボードレベルのハードウェア管理が可能

1) uboot はいくつかのハードウェアの制御機能を実現します (ハードウェアの一部は uboot で初期化されます)。これは、uboot がいくつかのタスクを完了するためにこれらのハードウェアを動作させる必要があるためです。たとえば、フラッシュを実装するには、uboot が iNand を駆動できる必要があります。たとえば、フラッシュ中に LCD に進行状況バーを表示したい場合、uboot は LCD を駆動できる必要があります。たとえば、uboot はシリアル ポートを駆動して操作を提供する必要があります。シリアルポート経由のインターフェース。たとえば、uboot がネットワーク機能を実現したい場合、ネットワーク カード チップを駆動する必要があります。

2) SoC レベル (シリアル ポートなど) は SoC の内部周辺機器であり、ボード レベルは SoC 外部の開発ボード上のハードウェア (ネットワーク カード、iNand など)

ubootの「ライフサイクル」

1) uboot のライフサイクルとは、uboot がいつ実行を開始し、いつ終了するかを指します。

2) uboot は本質的にベアメタル プログラムです (オペレーティング システムではありません)。uboot が開始されると、SoC は単に uboot を実行します (つまり、uboot の実行中に他のプログラムを同時に実行することはできません)。 uboot に戻ることはできません (したがって、uboot がカーネルを開始した後は uboot 自体が停止します。uboot インターフェイスを再度表示したい場合は、システムを再起動することしかできません。再起動しても、今すぐ uboot が復活するわけではありません。再起動は、単に別の生活の繰り返しです。 uboot)

3) uboot の入り口と出口。uboot の入口はブート時に自動的に開始され、uboot の唯一の出口はカーネルを開始することです。Uboot は他の多くのタスク (システムの書き込みなど) も実行できますが、他のタスクの実行後は、uboot コマンド ラインに戻って uboot コマンドの実行を続行できますが、boot カーネル コマンドが実行されると戻ることはできません。

4. uboot の仕組み

ベアメタルプログラムイメージuboot.binから開始

1) uboot の本質はベアメタル プログラムであり、ベアメタル コレクションに書かれているベアメタル プログラム xx.bin と基本的には変わりません。違いがあるとすれば、それは、書き込むもののほとんどが 16 KB 未満であるのに対し、uboot は 16 KB を超えていることです (通常、uboot は 180k ~ 400k の間です)。

2) Uboot 自体はオープン ソース プロジェクトであり、複数の .c ファイルと .h ファイルで構成されており、設定とコンパイルが完了すると、ベア メタル プログラム uboot のイメージ ファイルである uboot.bin が生成されます。次に、このイメージ ファイルがブート メディアに適切に書き込まれ、SoC が起動するように与えられます。つまり、uboot は、実行されていないときは uboot.bin として動作し、通常はブート メディアにあります。

3) uboot の実行中は、uboot がメモリにロードされ、CPU に与えられて、一度に 1 つの命令が実行されます。

Uboot の必須シェル インターフェイス

1) 通常のベアメタル プログラムは実行時に直接実行され、実行効果はコードに関連します。

2) 一部のプログラムは人間と対話する必要があるため、プログラムにシェルが実装されます (シェルは人間とコンピューターの対話を提供するインターフェイスです。『ARM ベア メタル全集』の第 16 部を思い出してください)。uboot はシェルを実装します。

注:シェルはオペレーティング システムではないため、オペレーティング システムとは何の関係もありません。Linux でターミナルを開くとシェルが表示され、コマンドを入力して Enter キーを押して実行できます。uboot のシェルの動作モードは、Linux のターミナル シェルの動作モードと非常によく似ています (実際、ほぼ同じですが、コマンド セットが異なります。たとえば、linux では ls を使用できますが、uboot では ls が使用されます)。認識しません)。

uboot 使用の 2 つの重要なポイント、コマンドと環境変数をマスターする

1) uboot が開始された後、ほとんどの時間と作業はシェルの下で行われます (たとえば、uboot がシステムをデプロイしたい場合は、シェルの下でコマンドを入力する必要があります。環境変数を設定するには、コマンド ラインでも行う必要があります) 、カーネルを起動するには、コマンド ラインのノック コマンドも実行する必要があります)。

2) コマンドは、uboot シェルで認識できるさまざまなコマンドです。uboot には数十のコマンドがあり、その中には一般的に使用されるものもあれば、あまり使用されないものもあります (uboot に自分でコマンドを追加することもできます)。授業の数時間を使って、uboot で一般的に使用されるコマンドを順番に学習します。 。

3) uboot 環境変数とオペレーティング システム環境変数の動作原理と方法はほぼ同じです。Uboot は、オペレーティング システムの設計コンセプトを利用して設計されています (コマンド ラインの作業方法は Linux ターミナルのコマンド ラインから借用し、環境変数はオペレーティング システムの環境変数から借用し、uboot のドライバー管理はほぼ完全にコピーします)。 Linux のドライバー フレームワーク)。

4)環境変数はシステムのグローバル変数とみなすことができ、環境変数名はシステムに組み込まれます (知っている人は知っている、知らない人は知らない) 、この部分は、PATH など、システムに付属するデフォルトの環境変数です。ただし、環境変数は自分で追加され、自分で追加したシステムはそれを知りませんが、私たち自身は知っています)。システムまたは独自のプログラムは、実行時に環境変数を読み取ることでプログラムの動作をガイドできます。この設計の利点は柔軟性です。たとえば、プログラムの実行方法を変更したい場合、プログラム コードを再変更して再コンパイルして実行する必要はなく、対応する環境変数を変更するだけで済みます。 。

5)環境変数は実行時の構成プロパティです。

2番目に、Linuxカーネルを移植する

1. Linux カーネルとは何ですか?

Linux カーネルは、コンピュータのハードウェアと接続する、簡単に交換可能なソフトウェアの最低レベルです。カーネルは、「ユーザー モード」で実行されているすべてのアプリケーションを物理ハードウェアに接続する責任を負い、プロセス間通信を使用してプロセスが相互に情報を取得できるようにします。 。

1,300 万行を超えるコードを含む Linux カーネルは、世界最大のオープンソース プロジェクトの 1 つです。

2. Linux カーネルには何が含まれていますか?

Linux カーネルは主に、プロセス管理メモリ管理デバイス ドライバーファイル システムネットワーク プロトコル スタック、およびシステム コールで構成されます。

 

ソースコードの構成

 3. デバイスツリーファイルを再コンパイルして移植します。

1.デバイスツリーファイルとは何ですか?

デバイスツリーの本質はレジスタを操作することでもありますが、レジスタの関連情報はデバイスツリーに配置されており、レジスタを設定する際には、OF関数を使用してデバイスツリーからレジスタデータを読み出し、それを設定します。

Linux 3.x より前には、デバイス ツリーはなく、Linux では、Arch/arm/mach-xxx フォルダーと Arch/arm/plat-xxx フォルダーにあるボード レベルの記述ファイルを通じて、ARM アーキテクチャのボード レベルの情報を記述していました。カーネルのソースコード。ARM ハードウェアの種類が増えると、ボードに関連するデバイス ファイルが増え、カーネルが大きくなりますが、実際には、これらのハードウェア ボード レベルの情報はカーネルとは何の関係もありません。

2011 年に Linus 氏がこの問題を発見した後、PowerPC や他のアーキテクチャですでに採用されているデバイス ツリー メカニズムを導入し、ボード レベルの情報をカーネルから分離し、専用のファイル形式 (.dts ファイル) で記述しました。デバイス ツリーの役割は、ブートローダーによってカーネルに渡すことができるハードウェア プラットフォームのハードウェア リソースを記述することであり、カーネルはデバイス ツリーからハードウェア情報を取得できます。ハードウェア リソースを記述する際、デバイス ツリーには 2 つの特徴があります。

  •     ハードウェアリソースをツリー構造で記述する
  •     ヘッダー ファイルと同様に、デバイス ツリー ファイルはコードの再利用を実現するために別のデバイス ツリー ファイルを参照できます。

2. デバイスツリーファイルとは何ですか?

デバイス ツリー ファイルには、DTS、DTSI、DTB、DTC ファイルの 4 種類があります。

 

DTC ツールのソース コードは、Linux カーネルの scripts/dtc/Makefile ファイルにあります。

hostprogs-y:= dtc
always:= $(hostprogs-y)

dtc-objs:= dtc.o flattree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o util.o
dtc-objs+= dtc-lexer.lex.o dtc-parser.tab.o
......

上記のことから、DTC ツールは dtc.c、 flattree.c、fstree.c およびその他のファイルに依存し、最終的に DTC ホスト ファイルをコンパイルしてリンクすることがわかります。DTS ファイルをコンパイルするには、Linux ソース コードのルート ディレクトリに移動し、次のコマンドを実行するだけです。

make all   #编译Linux源码中的所有东西,包括zImage、.ko驱动模块以及设备树
make dtbs  #只是编译设备树

ARM アーキテクチャに基づいた SOC は多数あり、1 つの SOC で複数のボードを生成でき、各ボードには対応する DTS ファイルがあります。では、どの DTS ファイルをコンパイルするかを決定するにはどうすればよいでしょうか? I.MX6ULL チップのボードを例に挙げると、arch/arm/boot/dts/Makefile を開くと、次の内容があります。

dtb-$(CONFIG_SOC_IMX6UL) += \
    imx6ul-14x14-ddr3-arm2.dtb \
    imx6ul-14x14-ddr3-arm2-emmc.dtb \
    ......
dtb-$(CONFIG_SOC_IMX6ULL) += \
    imx6ull-14x14-ddr3-arm2.dtb \
    imx6ull-14x14-ddr3-arm2-adc.dtb \
    ......

I.MX6ULL が選択されると (つまり、CONFIG_SOC_IMX6ULL=y)、この SOC を使用するボードに対応するすべての .dts ファイルが .dtb にコンパイルされます。新しいボードを作成する場合は、対応する .dts ファイルを作成し、対応する .dtb ファイル名を dtb-$(CONFIG_SOC_IMX6ULL) に追加するだけで、デバイスのコンパイル時に対応する .dts がバイナリにコンパイルされます。ツリー .dtb ファイル

3. デバイス ツリー ソース ファイル (.dts) の構文の概要

デバイス ツリーは、ツリー構造を使用してボード上のデバイス情報を記述します。各デバイスは、デバイス ノードと呼ばれるノードです。各ノードは、何らかの属性情報を通じてノード情報を記述します。属性は、キーと値のペアです。

node-name@unit-address{
    属性1 = ...
    属性2 = ...
    子节点...
}

⏩ ノード名: ノード名はノード名を指定するために使用されます。ノード名は文字で始まり、デバイス カテゴリを説明する必要があります (ルート ノードはスラッシュで表されます)。

⏩ ユニット アドレス: @unit-address はユニット アドレスの指定に使用されます。@ は区切り文字で、その後に実際のユニット アドレスが続きます。その値は、reg 属性値がない場合、ノード reg 属性の最初のアドレスと一致します。単位は省略可能アドレス

⏩ ノード属性: ノードの中括弧 { } に含まれる内容はノード属性です。ノードには複数の属性情報を含めることができます。デバイス ツリーの主な内容は、ノードの属性を記述することです。属性にはカスタム属性と標準属性が含まれます

        model 属性: デバイスのメーカーとモデルを指定するために使用され、複数の文字列は「,」で区切られます。
        互換性属性: 1 つ以上の文字列で構成され、ノードを検索するために使用される方法の 1 つです。
        status 属性: used の動作状態を示します。デバイス、およびデバイスは status reg 属性を通じて無効または有効にできます
        。親バスによって定義されたアドレス空間内のデバイス リソースのアドレスを記述します。通常、レジスタの開始アドレスと長さを示すために使用されます #address-
        cells および#size -cells: これら 2 つの属性は同時に存在します。前者はサブノード reg 属性のアドレス情報が占めるワード長を決定し、後者は長さ情報が占めるワード長を決定します。親アドレスとアドレス
        空間length は 3 つの部分で構成されます
        - child-bus-address: 子バス アドレス空間の物理アドレス、この物理アドレスが占めるワード長は親ノードの #address-cells によって決まります -parent-bus-address
        :親バス アドレス空間の物理アドレスも、親ノードの #address-cells によって決まります
        。

4. デバイスツリーOF機能

カーネルは、ノードに定義されている属性をデバイスノードから取得するための一連の関数を提供しており、of_ で始まるこれらの関数は OF 関数と呼ばれます。デバイスツリー版のドライバを記述する場合、ハードウェア構成上、これらのOF関数を使用してデバイスツリーファイルからレジスタアドレスなどの情報を取得し、設定する必要があります。

 4 番目に、最後にルート ファイル システム (rootfs) を移植します。

1. ルート ファイル システムとは何ですか?

ルートファイルシステムとは、まずファイルシステムのことであり、このファイルシステムは通常のファイルシステムのデータファイルを格納する機能だけでなく、通常のファイルシステムと比べて、カーネル起動時にマウントされる点が特殊です。 (mount )、カーネル コードのイメージ ファイルはルート ファイル システムに保存され、ルート ファイル システムがマウントされた後、システム ブート プログラムはいくつかの初期化スクリプト (rcS、inittab など) とサービスをメモリにロードします。 。ファイル システムとカーネルは 2 つの完全に独立した部分であることを理解する必要があります。組み込みシステムに移植されたカーネルは開発ボードにダウンロードされますが、Linux オペレーティング システムを実際に起動する方法はなく、ファイル システムをロードできないというエラーが発生します。

2. ルート ファイル システムがそれほど重要なのはなぜですか?

ルート ファイル システムには、システムの起動に必要なディレクトリと重要なファイル、および他のファイル システムをマウントするために必要なファイルが含まれています。例えば:

init プロセスのアプリケーション プログラムはルート ファイル システム上で実行する必要があります。
ルート ファイル システムはルート ディレクトリ "/" を提供します。
パーティションをマウントするときに Linux が依存する情報はルート ファイル システムの /etc/fstab ファイルに保存されます。シェル
コマンド プログラムは、ls、cd、その他のコマンドなど、ルート ファイル システム上で実行する必要があります。
つまり、Linux システムのセットは、カーネル自体のみが動作できず、rootfs (rootfs の etc ディレクトリにある設定ファイル) でなければなりません。 、/bin/sbin およびその他のディレクトリ) シェル コマンド、および /lib ディレクトリ内のライブラリ ファイルなど) は連携してのみ動作します。

Linux が起動するとき、最初にマウントする必要があるのはルート ファイル システムです。システムが指定されたデバイスからルート ファイル システムをマウントできない場合、システムはエラーを発生して起動を終了します。成功したら、他のファイル システムを自動または手動でマウントできます。したがって、異なるファイル システムが 1 つのシステムに同時に存在できます。Linux でファイル システムをストレージ デバイスに関連付けるプロセスはマウントと呼ばれます。mount コマンドを使用して、ファイル システムを現在のファイル システム階層 (ルート) に接続します。マウントを実行するときは、ファイルシステムのタイプ、ファイルシステム、およびマウント ポイントを指定します。ルート ファイル システムがルート ディレクトリ下の "/" にマウントされると、ルート ディレクトリの下にルート ファイル システムのさまざまなディレクトリ、ファイル /bin /sbin /mnt などが存在し、その他のパーティションがそのディレクトリにマウントされます。 /mnt ディレクトリ , /mnt ディレクトリの下には、このパーティションのさまざまなディレクトリとファイルがあります。

ルート ファイル システムには、少なくとも次のディレクトリが含まれます。

/etc/: 重要な設定ファイルを保存します。
/bin/: 起動時に使用する必要がある、頻繁に使用される実行可能ファイルを保存します。
/sbin/: ブートプロセス中に必要なシステム実行ファイルを保存します。
/lib/ : /bin/、/sbin/の実行ファイルに必要なリンクライブラリと、Linuxカーネルモジュールが格納されます。
/dev/: ストレージデバイスファイル。

注: 5 つの主要なディレクトリはルート ファイル システムに保存する必要があり、どれも省略することはできません。

3. Linux ファイルシステムの共通ディレクトリ

通常、Linux ファイル システムには次のディレクトリがあります。

/bin ディレクトリ 
このディレクトリには、すべてのユーザーが使用できる基本的なコマンドが保存されます。これらのコマンドは、他のファイル システムがマウントされる前に使用できるため、/bin ディレクトリはルート ファイル システムと同じパーティションに存在する必要があります。 
/bin ディレクトリで一般的に使用されるコマンドは、cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、mknod、test などです。 Busybox を使用してルート ファイル システムを作成する場合、次のようになります。これを bin ディレクトリに作成すると、いくつかの実行可能ファイル、つまり使用可能ないくつかのコマンドが表示されます。

/sbin ディレクトリ 
このディレクトリには、システム コマンド、つまり管理者だけが使用できるコマンドが保存されます。システム コマンドは /usr/sbin、/usr/local/sbin ディレクトリにも保存でき、/sbin ディレクトリには基本的なシステム コマンドが保存されます。これらは、システムの起動、システムの修復などに使用されます。/bin ディレクトリと同様に、/sbin は他のファイル システムをマウントする前に使用できるため、/sbin ディレクトリはルート ファイル システムと同じパーティションに存在する必要があります。 
/sbin ディレクトリで一般的に使用されるコマンドには、shutdown、reboot、fdisk、fsck などが含まれます。ローカル ユーザーによってインストールされたシステム コマンドは、/usr/local/sbin ディレクトリに配置されます。

/dev ディレクトリは 
、このディレクトリにデバイス ファイルを格納します。デバイス ファイルは、Linux 独自のファイル タイプです。Linux システムでは、ファイルの形式でさまざまなデバイスにアクセスし、デバイス ファイルを読み書きすることで、特定のハードウェアを操作します。 。たとえば、シリアル ポート 0 は「dev/ttySAC0」ファイルを通じて操作でき、MTD デバイスの 2 番目のパーティションには「/dev/mtdblock1」を通じてアクセスできます。

/etc ディレクトリ 
このディレクトリには、さまざまな構成ファイルが保存されます。PC 上の Linux システムの場合、/etc ディレクトリの下に多くのファイルとディレクトリがあります。これらのディレクトリ ファイルはオプションであり、システム内のアプリケーションによって異なります。プログラムには設定ファイルが必要です。組み込みシステムでは、これらの内容を大幅に削減できます。

/lib ディレクトリに 
は、共有ライブラリとロード可能な (ドライバ プログラム) がこのディレクトリに格納され、共有ライブラリはシステムの起動に使用されます。/bin /sbin ディレクトリ内のプログラムなど、ルート ファイル システム内の実行可能プログラムを実行します。

/home ディレクトリは 
ユーザー ディレクトリであり、これはオプションです。一般ユーザーごとに、/home ディレクトリの下にユーザー名にちなんだ名前のサブディレクトリがあり、そこにユーザー関連の設定ファイルが保存されます。

/root ディレクトリは 
root ユーザーのディレクトリであり、これに対応して一般ユーザーのディレクトリは /home のサブディレクトリになります。

/usr ディレクトリ 
/usr ディレクトリの内容は、別のパーティションに保存し、システムの起動後にルート ファイル システムの /usr ディレクトリにマウントできます。これには共有の読み取り専用プログラムとデータが保存されます。つまり、/usr ディレクトリの内容は複数のホスト間で共有でき、これらは主に FHS 標準に準拠しています。/usr 内のファイルは読み取り専用にする必要があり、他のホスト関連ファイルや変数ファイルは /var などの他のディレクトリに保存する必要があります。/usr ディレクトリは埋め込みで削減できます。

/var ディレクトリは 
/usr ディレクトリの逆で、スプール ディレクトリ (メール、ニュース)、ログ ファイル、一時ファイルなどの可変データが保存されます。

/proc ディレクトリ 
は空のディレクトリであり、proc ファイル システムのマウント ポイントとしてよく使用されます。proc ファイル システムは仮想ファイル システムです。実際のストレージ デバイスはありません。その中のディレクトリとファイルはカーネルによって一時的に生成されます。システムの稼働状況を表し、システム内のファイル管理システムも稼働させることができます。

/mnt ディレクトリは 
、特定のファイル システムのマウント ポイントを一時的にマウントするために使用されます。通常は空のディレクトリですが、その中に /mnt/cdram /mnt/hda1 などの空のサブディレクトリを作成することもできます。CD やハードディスクを一時的にマウントするために使用されます。

/tmp ディレクトリは 
、一時ファイルを生成する必要がある一部のプログラムで使用される /tmp ディレクトリの下に、一時ファイル (通常は空のディレクトリ) を保存するために使用されるため、/tmp ディレクトリが存在し、アクセス可能である必要があります。

おすすめ

転載: blog.csdn.net/FLM19990626/article/details/128203031