OCI Storage Gatewayの利用方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

__目次__

[1. OCIストレージ・ゲートウェイとは](#1-ociストレージゲートウェイとは)
[2. システムの要件](#2-システムの要件)
[3. 事前準備](#3-事前準備)
[4. ストレージ・ゲートウェイのインストール](#4-ストレージゲートウェイのインストール)
[5. 管理コンソールへのログイン](#5-管理コンソールへのログイン)
[6. 最初のファイル・システムの作成](#6-最初のファイルシステムの作成)
[7. ファイル・システムをクライアントへのマウント](#7-ファイルシステムをクライアントへのマウント)

# 1. OCIストレージ・ゲートウェイとは
ストレージ・ゲートウェイは、オンプレミス・アプリケーションをOCI (Oracle Cloud Infrastructure)に接続できるクラウド・ストレージ・ゲートウェイです。データをNFSターゲットに書き込むことができるアプリケーションでは、REST APIを取り込むためにアプリケーションを変更しなくても、OCI Object Storageにデータを書き込むことができます。 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/939046b6-b9a0-dfe9-bcf9-f368c1fc3ecd.png", width="850">
ストレージ・ゲートウェイを理解する良い方法は、他のファイル転送ツールと比較することです。Oracleは、オブジェクト・ストレージにアクセスするツールをいくつか提供しています。要件に応じて適当なツールを選んでください。

__ファイル転送ツールの比較__
||OCI Console|OCI CLI|<font color=blue>OCI Storage Gateway</font>|
|--|--|--|--|
|オフィシャル・サポート|✔|✔|✔|
|料金|無料|無料|無料|
|利用方式|ブラウザ利用(GUI)|コマンド・ライン|マウント|
|OS|制限なし|Linux/Windows/MacOS|Oracle Linux 7およびUEKリリース4以降|
|インストールと設定|不要|必要※１|必要|
|認証方法|ユーザ・パスワード|APIキー|APIキー|
|プロトコル|HTTPS|HTTPS|NFSv4, HTTPS|
|利用場面|・汎用<br>・手動転送|・フォルダ丸ごと転送<br>・バッチ処理に向き|・大量ファイルの転送に向き<br>・ファイル同期処理|
|利点|クイックスタートに最適|・コマンドラインユーザーに優しい<br>・比較的軽量|・巨大なファイルを転送する時、パフォーマンスが有利<br>・管理コンソール付き|
|最新バージョン<br>(2022年8月)|サポート対象ブラウザーについては、[Doc ID 2697934.1](https://support.oracle.com/knowledge/Oracle%20Cloud/2697934_1.html)をご参照。|3.13|1.4|

※１、Cloud Shellにインストールと設定済なので、直接に利用可能。

__注意__
- Windows OSはサポート対象外。
- 汎用のNASサーバではなく、データ転送の目的として使ってください。

# 2. システムの要件
## 2-1. ハードウェア・ソフトウェアの推奨事項および要件
|分類|項目|内容|
|--|--|--|
|ハードウェア|CPU|<strong>2つのデュアルコアCPU以上</strong>、4コアCPUを推奨|
||メモリ|メモリーの最小要件:<br>ストレージ・ゲートウェイのどのファイル・システムでも<strong>16 GB</strong>が必須。<br>ファイル数が5000万個までのファイル・システムでは32 GB。<br>ファイル数が1億個までのファイル・システムでは64 GB。|
||ストレージ|推奨されるローカル・ストレージのディスク・サイズは<strong>600 GB</strong>(※1)です(ファイル・システム・キャッシュに500GB、メタデータ・ストレージに80GB、ログ・ストレージに20GBを含みます)。|
|ソフトウェア|OS|<strong>Oracle Linux 7</strong>およびUEKリリース4以降 (※2)|
||Docker|Docker 1.12.6以上 (自動インストール)|

※1. 上記のストレージサイズ (600 GB) は推奨値です。それより小さい場合、ストレージ・ゲートウェイが機能しないという意味ではありません。

※2. OCIドキュメントによると、現時点(2022年8月) <strong>Oracle Linux 7</strong> のみがサポートされています。Oracle Linux 8 を使用している場合、Dockerのインストール時にリポジトリ接続の問題が発生する可能性があります。そのため、現時点では Oracle Linux 7 を使用し、Oracle Linux 8 のサポートを待つことをお勧めします。

## 2-2. 検証環境
私が利用している検証環境の構成は、以下となります。
|分類|項目|内容|
|--|--|--|
|インスタンス|OS| Oracle Linux <strong>7.9</strong> (OCI Compute VM)|
||シェイプ|VM.Standard.E4.Flex (2 OCPU, 32 GB)|
|ブロック・ボリューム|サイズ|合計: <strong>1024</strong> GB<br>(1つのパーティション、3つの論理ボリューム)<br>/ocisg/cache - 834 GB<br>/ocisg/metadata - 150 GB<br>/ocisg/log - 40 GB|
||パフォーマンス・レベル|Balanced|
||アタッチメントの種類|ISCSI|
|ストレージ・ゲートウェイ|バージョン|1.4|

# 3. 事前準備
Storage Gateway 管理コンソール ([STEP-6](#6-最初のファイルシステムの作成))で新しいファイルシステムを作成する場合、次の情報を準備する必要があります。

Object Storage API エンドポイント - [STEP 3-1](#3-1-object-storage-api-エンドポイント)
コンパートメント OCID  - [STEP 3-2](#3-2-コンパートメントocidの取得)
テナンシ OCID - [STEP3-3](#3-3-api署名キーの生成)
ユーザ OCID - [STEP3-3](#3-3-api署名キーの生成)
公開キーの Finger Print - [STEP3-3](#3-3-api署名キーの生成)
秘密キー - [STEP3-3](#3-3-api署名キーの生成)

## 3-1. Object Storage API エンドポイント
東京リージョンの場合、エンドポイントは `https://objectstorage.ap-tokyo-1.oraclecloud.com`となります。
他のリージョンについては、この[リスト](https://docs.oracle.com/en-us/iaas/api/#/en/objectstorage/20160918/)を確認してください。 (違いはリージョンキーです。)

## 3-2. コンパートメントOCIDの取得
以下のように、転送先のバケットが存在するコンパートメントのOCIDを取得してください。
OCI Menu -> Identity & Security -> Compartments -> Compartmentを指定 -> "Copy"をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/611db48a-d04c-cbbc-41fd-6ab6319a177a.png", width="650">

## 3-3. API署名キーの生成
OCIコンソールまたはローカル端末 (Linux/Mac/Windows) で様々な方法で作成できます。
OCIコンソールでを作成するのをお勧めします。理由は、他の情報と一緒に取得できるからです。

アイデンティティ・ドメイン・ユーザーの場合:
Identity ->My profile -> API keys -> "Add API key"ボタンをクリック

「Generate API key pair」はデフォルトでチェックされています。「Download private key」ボタンを押して安全な場所に保存した後、「Add」ボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/dc54fd2f-68bf-786f-e92b-ee0758809fac.png", width="550">

そうして、以下のような「構成ファイルのレビュー」画面が表示されます。 この検証では、特に構成ファイルを作成する必要はありません。 必要なのは、「User OCID」、「Tenancy OCID」、「Finger Print」などの数行です。 コピーを押して、これらの情報を安全に保管してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9d1db084-8d44-4a6f-2152-9aa81e1e0b20.png", width="550">

## 3-4. ブロック・ボリュームの作成とアタッチ
この例では 1TB のブロック・ボリュームを使用しています (600 GB 以上を推奨)。

作成後、ターゲット・インスタンスにアタッチします。 接続タイプは、「iSCSI」または「準仮想化」のいずれかを選択できます。 「iSCSI」タイプを選択した場合は、iSCSI コマンドを実行する必要があります (「準仮想化」よりオーバーヘッドが少ないです)。

iSCSIコマンドを実行すると、デバイス情報は次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/84a76369-1777-169e-3abd-d704ce1aa259.png", width="450">

# 4. ストレージ・ゲートウェイのインストール
ブロック・ボリュームが新しく作成された場合、使用する前にディスクのパーティショニングは必要です。この例では、 `parted`コマンドを使用します。`parted`コマンドの詳細は、この[ドキュメント](https://access.redhat.com/sites/default/files/attachments/parted_0.pdf)をご参照ください。

## 4-1. ディスクのパーティショニング
開始するコマンド: `sudo parted /dev/sdb`  (/dev/sdb をデバイス名に変更する。)
<strong>parted</strong> 内のコマンド:
新しいディスクラベルを作成する: `mklabel gpt`
パーティションを作成する: `mkpart primary 0% 100%`
フラグを設定する: `toggle 1 lvm`  (これは必須ではなく、スキップできる。)

「p」は表示(print)を意味し、「q」は終了(quit)を意味します。
```
[opc@linux7 ~]$ sudo parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
(parted) mkpart primary 0% 100%
(parted) toggle 1 lvm
(parted) p
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 1100GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1100GB  1100GB               primary  lvm
(parted) q
```

パーティショニング後、デバイス情報は次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6992da9a-ae8f-7e6b-2338-ac41550132f5.png", width="450">

## 4-2. 論理ボリュームの作成
<strong>コマンド</strong>:
物理ボリュームを作成する: `sudo pvcreate <device>`
ボリューム・グループを作成する: `sudo vgcreate <volume_group_name> <device>`
論理ボリュームを作成する: `sudo lvcreate -l 100%FREE -n <logical_volume_name> <volume_group_name>`

キャッシュ、メタデータ、ログを個別に保存するため、<strong>3つの論理ボリューム</strong>を作成します。それらのサイズは、それぞれ500G、80G、および20Gとなります。

パラメータ`-L`でストレージ・サイズを指定して、ログとメタデータ用の論理ボリュームを作成します。 最後の1つ (キャッシュ) については、100%FREEで指定したほうが良いと思います。(残りのサイズを計算する必要はありません。)

```
[opc@linux7 ~]$ sudo pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[opc@linux7 ~]$ sudo vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created
[opc@linux7 ~]$ sudo lvcreate -L 40G -n lvlog vg01
  Logical volume "lvlog" created.
[opc@linux7 ~]$ sudo lvcreate -L 150G -n lvmetadata vg01
  Logical volume "lvmetadata" created.
[opc@linux7 ~]$ sudo lvcreate -l 100%FREE -n lvcache vg01
  Logical volume "lvcache" created.
[opc@linux7 ~]$
```

作成後のデバイス情報は次のようです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7ad324b3-4ae9-6ba4-371f-5a5e07621ca5.png", width="450">

## 4-3. XFSファイルシステムの作成
コマンド形式:
`sudo mkfs.xfs /dev/<volume_group_name>/<logical_volume_name>`

例:
`sudo mkfs.xfs /dev/vg01/lvcache`
`sudo mkfs.xfs /dev/vg01/lvmetadata`
`sudo mkfs.xfs /dev/vg01/lvlog`

コマンドの出力を省略します。

## 4-4. 論理ボリュームのマウント
マウントポイントの作成:
```
[opc@linux7 ~]$ sudo mkdir /ocisg
[opc@linux7 ~]$ sudo mkdir /ocisg/cache  /ocisg/metadata  /ocisg/log
[opc@linux7 ~]$ sudo chown -R opc:opc /ocisg
```

論理ボリュームのマウント:
コマンド: `sudo mount /dev/<volume_group_name>/<logical_volume_name> <directory_path>`
```
[opc@linux7 ~]$ sudo mount /dev/vg01/lvcache /ocisg/cache
[opc@linux7 ~]$ sudo mount /dev/vg01/lvmetadata /ocisg/metadata
[opc@linux7 ~]$ sudo mount /dev/vg01/lvlog /ocisg/log
[opc@linux7 ~]$
```
`df -h`コマンドで結果を確認すると、上記の3つのファイルシステムがマウントされていることが分かります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ab8fd2c1-7ff5-4cbf-f14a-6828ec8d3d57.png", width="550">

## 4-5. インストール・ファイルのダウンロードと解凍
 [ここ](https://www.oracle.com/downloads/cloud/oci-storage-gateway-downloads.html)からインストール・ファイル (TAR アーカイブ) をダウンロードします。
圧縮ファイル`ocisg-1.4.tar.gz`のサイズは 1.1 GB です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/342d6e3b-4f19-6581-a22b-895a8b74ed09.png)
ダウンロード後、ストレージサーバーに転送します。 この例では、SFTP 経由で OCI Compute に転送し、`/home/opc/sgw` (事前に `sgw`フォルダーを作成しておく) の下に保存します。

TARファイルを解凍します。
```
[opc@linux7 sgw]$ pwd
/home/opc/sgw
[opc@linux7 sgw]$ ll
total 1108796
-rw-rw-r--. 1 opc opc 1135403104 Jul 20 04:07 ocisg-1.4.tar.gz
[opc@linux7 sgw]$ tar xvzf ocisg-1.4.tar.gz
ocisg-1.4/
ocisg-1.4/helper-install-ocisg.sh
ocisg-1.4/ocisg:1.4.tar
ocisg-1.4/ocisg-install.sh
ocisg-1.4/connect-fs.sh
ocisg-1.4/ocisg-control.sh
ocisg-1.4/health-check.sh
ocisg-1.4/support-bundle.sh
ocisg-1.4/test-bandwidth.sh
ocisg-1.4/ocisg-config.sh
ocisg-1.4/ocisg
ocisg-1.4/OCISG_README.txt
[opc@linux7 sgw]$
```

## 4-6. インストールを開始する
`ocisg-install.sh`を実行して、ストレージ・ゲートウェイをインストールします。
コマンド: `sudo ./ocisg-install.sh`

```
[opc@linux7 sgw]$ cd ocisg-1.4
[opc@linux7 ocisg-1.4]$ pwd
/home/opc/sgw/ocisg-1.4
[opc@linux7 ocisg-1.4]$ sudo ./ocisg-install.sh
```
Dockerをインストールするかどうかと聞かれたら、「<font color=blue>y</font>」と入力して続行します。
Oracle Linux 8 を利用している場合、dockerをインストールしようとすると、リポジトリ接続の問題が発生する可能性があります。 回避策がありますが、Oracle Linux 8 のサポートを待つことをお勧めします。

```
[opc@linux7 ocisg-1.4]$ sudo ./ocisg-install.sh
Docker does not appear to be installed. Do you want to install docker engine with yum? [y/N] y
```

NFSを有効にするかどうかと聞かれたら、「<font color=blue>y</font>」と入力して続行します。
```
Setting the devicemapper storage driver ...
NFS server does not appear to be enabled. Do you want to enable NFS? [y/N] y
```

インストール場所を入力するか、「<font color=blue>Enter</font>」と入力して続行します。
```
Enter the install location press enter for default (/opt/ocisg/) :
```

キャッシュ、メタデータ及びログのパスを入力します。
```
Enter the path for OCISG file system cache : /ocisg/cache
Enter the path for OCISG metadata storage : /ocisg/metadata
Enter the path for OCISG log storage : /ocisg/log
```

キャッシュ、メタデータ、およびログを同じボリュームに保存しようとすると、次のような警告が表示されます。 「y」を入力して、インストールを続行できます。 （それらを別々のボリュームに保存することをお勧めします。）
```
================================================================================
WARNING:
Cache, Metadata, and log storage are on the SAME volume.
It is recommended to have a SEPARATE volume for log storage.
Recommended MINIMUM space for log storage is 20 GB.
================================================================================
Would you like to proceed anyway ('Y' to proceed, 'N' to stop installation) (y/N) ?
```

インストールが完了すると、次のメッセージが表示されます。
```
Management Console: https://linux7:32770
If you have already configured an OCISG FileSystem via the Management Console,
you can access the NFS share using the following port.

NFS Port: 32771

Example: mount -t nfs -o vers=4,port=32771 linux7:/<OCISG FileSystem name> /local_mount_point
[opc@linux7 ocisg-1.4]$
```
ご覧の通り、管理コンソールのURLとマウント・コマンドが表示されます。 上記情報は、コマンド`sudo ocisg info`で取得できるため、メモしなくても構いません。

# 5. 管理コンソールへのログイン
## 5-1. イングレス・ルールの編集
管理コンソールにログインする前に、OCIセキュリティ・リスト (またはNSG) を編集して、TCP ポート (443、32770、32771)のインバウンド・トラフィックを許可する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d8d40c2e-9c6b-b0f9-be5b-138462761ecc.png)

## 5-2. 初回ログイン
Webブラウザーを開き、管理コンソールのURLを入力します。
URL:  `https://<host_name_or_IP_address>:32770/`

ストレージ・ゲートウェイは自己署名証明書を使用するため、以下のような警告メッセージが表示される場合があります。URLが正しいことを確認してから続行してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6c588b7f-0e23-c541-2352-092624997a4f.png", width="650">

初回ログイン時にパスワードの新規設定が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/92c9071b-ef51-001e-ff22-cb4745f85939.png)
新しいパスワードを再入力し、「ログイン」を押して続行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2ac35ecc-d890-e792-4d94-2f545fc14e3d.png)

ログイン後、次の管理コンソールが表示されます。 ストレージ・サイズが推奨値より<strong>小さい</strong>場合、「システム・ステータス」に黄色い警告メッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ec2c7976-1449-50e1-f622-9095f165c59a.png)

# 6. 最初のファイル・システムの作成
ここまで、ファイル・システムはまだ作成されていません。 新規作成をしましょう。
[STEP-3](#3-事前準備)の準備が整っていることを確報した上、「ファイル・システムの作成」ボタンをクリックして開始してください。

「ファイル・システム名」はバケット名となります。 バケットが存在しない場合は自動作成されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ca9dc61d-7eeb-0e79-a458-dbe59dce8ea4.png", width="600">

各項目に用意しておいた内容を入力します。「秘密鍵のパスフレーズ」を持っていない場合はスキップします。入力後、「保存」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/afe2401b-066f-89de-9a69-bab673af6192.png", width="600">

「接続」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/46a01cfd-0017-c866-e2b2-566772b5fde4.png", width="650">

これで接続が作成されました。 (約1分間)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7baf904c-883d-63c3-5003-313332e7e489.png">

OCI コンソールから結果を確認すると、新しいバケットが作成されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/315f8063-f719-1332-f086-2c3941b3353a.png", width="600">

# 7. ファイル・システムをクライアントへのマウント
ストレージ・ゲートウェイの各ファイル・システムでは、ディレクトリがOCI Object Storageバケットにマップされます。ストレージ・ゲートウェイとNFSクライアントの間の接続を確立するには、ストレージ・ゲートウェイ・ファイル・システムをNFSクライアントにマウントする必要があります。

## 7-1. NFSクライアントにファイル・システムをマウントする
マウント用コマンドは、ストレージ・ゲートウェイのインストールが完了した時点表示されます。このコマンドは、 管理コンソールから、または`sudo ocisg info`コマンドでも確認できます。

```
[opc@linux7 ~]$ sudo mkdir /sg-bucket1
[opc@linux7 ~]$ sudo mount -t nfs -o vers=4,port=32771 10.0.2.21:/SG-Bucket1 /sg-bucket1
[opc@linux7 ~]$
```

`df -h`コマンドで結果を確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3fe00e08-fdd3-5458-c195-0ff64cff87cc.png", width="600">

## 7-2. 簡単なテスト
SGのインストール・ファイルをクライアント側からオブジェクト・ストレージのバケットにコピーするという簡単なテストを行います。
```
[opc@linux7 ~]$ sudo chown opc:opc /sg-bucket1
[opc@linux7 ~]$ cp -p /home/opc/sgw/ocisg-1.4.tar.gz /sg-bucket1
[opc@linux7 ~]$
```

開始時点：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/43e0031d-31c8-7e56-2c36-d46fcf99545e.png", width="700">

転送が完了すると。 「Pending Uploads (保留中のアップロード)」は「0」になります。詳細については、ストリーミング・ログを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2d37e7bf-91dc-59f8-6398-30d05661dca1.png)

OCIコンソールから確認すると、ファイルが正常にアップロードされたことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3360f7ab-07f9-c92d-c258-7ff5fded614d.png)

__サマリ__
お疲れ様です！ここまで「ストレージ・ゲートウェイ」のインストールと設定作業は完了で、対象データのバックアップが開始できます。

「ストレージ・ゲートウェイ」以外、サード・パーティーの転送ツールもありますので、詳細は以下の関連記事をご参照ください。

以上

----
__2024年3月追記__
Storage Gatewayは、2024/2/28より<strong>End of Life</strong>になることがアナウンスされました。代替案は、OCI-CLIか、Rcloneなどをご利用ください。アナウンスの詳細は、[こちら](https://docs.oracle.com/en-us/iaas/releasenotes/changes/d67506ea-eb9b-4eeb-8c2b-e05e2dea70a4/)を参照ください。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCIオブジェクト・ストレージへのファイル転送方法のまとめ](https://qiita.com/liu-wei/items/4d955d10aeae4d61eea8)

__参考資料__
[ストレージ・ゲートウェイのインストール](https://docs.oracle.com/ja-jp/iaas/Content/StorageGateway/Tasks/installingstoragegateway.htm)
[ストレージ・ゲートウェイ管理コンソールへのログイン](https://docs.oracle.com/ja-jp/iaas/Content/StorageGateway/Tasks/accessingmanagementconsole.htm)
[最初のファイル・システムの作成](https://docs.oracle.com/ja-jp/iaas/Content/StorageGateway/Tasks/creatingyourfirstfilesystem.htm)
[ファイル・システムの管理](https://docs.oracle.com/ja-jp/iaas/Content/StorageGateway/Tasks/managingfilesystems.htm)
[Storage Gateway FAQ](https://www.oracle.com/cloud/storage/storage-gateway/faq/)
[Partitioning Disks with parted](https://access.redhat.com/sites/default/files/attachments/parted_0.pdf)