はじめに
これまで見てきたようにZD&TではADCDというOSやミドルウェアがある程度構成されたパッケージ(DASDイメージ・ファイルのセット)が提供されていますが、ここではDASD管理について少し深掘りして見ていきます。
関連記事
クラウド上でのメインフレーム開発環境構築 - (1) 仮想サーバー作成
クラウド上でのメインフレーム開発環境構築 - (2) ZD&T管理サーバーのインストール
クラウド上でのメインフレーム開発環境構築 - (3) ライセンス管理
クラウド上でのメインフレーム開発環境構築 - (4) ZD&Tインスタンス作成概要(ADCD)
クラウド上でのメインフレーム開発環境構築 - (5) ZD&Tインスタンス作成詳説(ADCD)
クラウド上でのメインフレーム開発環境構築 - (6) DeviceMapファイル補足
クラウド上でのメインフレーム開発環境構築 - (7) ネットワーク構成補足
クラウド上でのメインフレーム開発環境構築 - (8) ADCD IPL, Shutdown補足
クラウド上でのメインフレーム開発環境構築 - (9) DASD管理補足
クラウド上でのメインフレーム開発環境構築 - (10)既存ZD&Tからイメージ作成
関連定義の整理
DASDは実体としてはLinux上のファイルとして保持されます。それがz/OS上のDASDとしてどのようにマッピングされるのかを関連定義を整理します。
IODF
z/OS上ではI/O DeviceをIODFにて管理しています。ここで、デバイスのアドレスごとにタイプが指定されています。
ADCDパッケージで使われるIODFでは、DeviceMapファイルの解説記事の所でも示しましたが、以下のような定義になっています。
この定義では0A80-0AFFまでの128個分のアドレスが3390として定義されています。ADCDを使った時に生成されるDeviceMapではこの辺りのアドレスが割り当てられて使用されています。
DeviceMapファイルの定義
DeviceMapファイルでは、z/OS上で認識するデバイスのアドレスと、実体であるLinuxファイルのマッピングを行います。
ADCDを使ってZD&Tインスタンスを作成した時に生成されたDeviceMapファイルでは以下のようなDASD関連の定義がされています。
[manager]
name awsckd 0001
device 0A83 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PAGA
device 0A82 3390 3390 /mnt/ibmsys1/zdt/volumes/A4SYS1
device 0A84 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PAGB
device 0A85 3390 3390 /mnt/ibmsys1/zdt/volumes/SARES1
device 0A86 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DBAR
device 0A87 3390 3390 /mnt/ibmsys1/zdt/volumes/A4USR1
device 0A88 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PAGC
device 0A89 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PRD4
device 0A8A 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PRD3
device 0A8B 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DIS2
device 0A8C 3390 3390 /mnt/ibmsys1/zdt/volumes/A4USS1
device 0A8D 3390 3390 /mnt/ibmsys1/zdt/volumes/A4USS2
device 0A8E 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DIS1
device 0A8F 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DIS3
device 0A90 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DBC2
device 0A91 3390 3390 /mnt/ibmsys1/zdt/volumes/A4DBC1
device 0A81 3390 3390 /mnt/ibmsys1/zdt/volumes/A4RES2
device 0A92 3390 3390 /mnt/ibmsys1/zdt/volumes/A4CFG1
device 0A93 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PRD1
device 0A94 3390 3390 /mnt/ibmsys1/zdt/volumes/A4PRD2
device 0A95 3390 3390 /mnt/ibmsys1/zdt/volumes/A4C551
device 0A80 3390 3390 /mnt/ibmsys1/zdt/volumes/A4RES1
device 0A96 3390 3390 /mnt/ibmsys1/zdt/volumes/A4ZCX1
device 0300 3390 3390 /mnt/ibmsys1/zdt/volumes/ZDTDPY
device 0301 3390 3390
device 0302 3390 3390
device 0303 3390 3390
...
2列目がIODFでtype:3390として定義されているアドレスで、右端の列がそれに対応するLinux上のDASDイメージ・ファイルです。
Linux上のファイル名は特に決まりはありませんが、管理上の分かりやすさからz/OS上で割り当てるVOLUME名と同じ名前にするのがよいと思います。(ADCDで提供されているものもそうなっています。)
Linuxファイルが指定されていないアドレスもいくつか定義されていますが、これは動的にDASDを追加する場合に使えるものです(後述)。
Linuxファイル
以下、ADCDを使用した時に展開されるDASDイメージ・ファイルです。
[ibmsys1@zdt02 ~]$ ls -la /mnt/ibmsys1/zdt/volumes/
total 198450704
drwxrwxr-x. 2 ibmsys1 ibmsys1 4096 Oct 27 21:05 .
drwxrwxr-x. 5 ibmsys1 ibmsys1 4096 Nov 8 17:41 ..
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:58 A4C551
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4CFG1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 27 19:58 A4DBAR
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:58 A4DBC1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4DBC2
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 27 20:24 A4DIS1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 27 20:14 A4DIS2
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 27 20:28 A4DIS3
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4PAGA
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4PAGB
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4PAGC
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:53 A4PRD1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:58 A4PRD2
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:57 A4PRD3
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 04:58 A4PRD4
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 03:06 A4RES1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 01:41 A4RES2
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4SYS1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4USR1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4USS1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 28 05:00 A4USS2
-rw-rw-r--. 1 ibmsys1 ibmsys1 15344640512 Oct 27 20:49 A4ZCX1
-rw-rw-r--. 1 ibmsys1 ibmsys1 2499 Oct 27 21:05 aprof1
-rw-rw-r--. 1 ibmsys1 ibmsys1 8539292672 Oct 27 19:53 SARES1
-rw-rw-r--. 1 ibmsys1 ibmsys1 4262912 Oct 27 21:10 ZDTDPY
Linux上でのファイル・サイズがそのままDASDのサイズを表しています。8539292672byteになっているファイルは3390-9型のDASDです。実際のDASDの使用量に関わらず、Linux上のファイル・サイズとしてはDASDのタイプ(Cylinder数)に応じたサイズが確保されます。従って、その分物理的なディスクが消費されることになります。
z/OSで管理するDASDはサイズが大きくなりがちですので、Linuxのファイルシステムとしてこれらのファイルの確保に充分なサイズを準備しておく必要があります。
DASD構成まとめ
ユーティリティ
ZD&Tが提供するDASD管理に関するユーティリティーについて補足します。
新規DASD追加
DASDイメージファイル作成
ADCD提供のDASDを使用するだけでなく、開発/テスト用に使用するアプリケーションやデータのためにDASDを追加したいことは普通にあると思います。
DASDイメージ・ファイルを新規に作成するためのユーティリティーとしてalcckdというコマンドが提供されています(Linuxのシェルで実行するコマンド)。
以下のような方法で、DASDイメージ・ファイルを作成することができます。
(1) タイプ指定で作成
Syntax: alcckd <fileName> -d <deviceType>
以下のdeviceTypeが指定できます。
- 3380-1 (type 3380, 885シリンダー, 約700MB)
- 3380-2 (type 3380, 1770シリンダー, 約1.4GB)
- 3380-3 (type 3380, 2655シリンダー, 約2GB)
- 3390-1 (type 3390, 1113シリンダー, 約900MB)
- 3390-2 (type 3390, 2226シリンダー, 約1.7GB)
- 3390-3 (type 3390, 3339シリンダー, 約2.6GB)
- 3390-9 (type 3390, 10017シリンダー, 約8GB)
- 3390-n (type 3390, n x 1113シリンダー)
例: alcckd /mnt/ibmsys1/zdt/volumes/DASD01 -d 3390-9
(3390-9型のDASDイメージファイル"DASD01"を作成する例)
実際にコマンドを実行した時のログはこちらです。
[ibmsys1@zdt02 volumes]$ date; alcckd /mnt/ibmsys1/zdt/volumes/DASD01 -d 3390-9; date
Fri Nov 20 20:23:27 CST 2020
AWSCKE035I Creating file '/mnt/ibmsys1/zdt/volumes/DASD01', 3390, 10017 cylinders
AWSCKE072I 100 percent complete ...
AWSCKE005I Processing file '/mnt/ibmsys1/zdt/volumes/DASD01' ...
AWSCKE006I Device type: 3390-9
AWSCKE009I Cylinders: 10017, heads 15
AWSCKE010I Track size: 56832
AWSCKE011I File version: 0
AWSCKE014I Version pend: No
AWSCKE017I IPL text: No
AWSCKE018I Volume serial: <None>
Fri Nov 20 20:24:00 CST 2020
ディスクの性能やマシンスペックにも依存すると思いますが、3390-9型のDASDイメージファイル作成で約30秒くらいかかりました。
(2) シリンダー数指定で作成
Syntax: alcckd <fileName> -d 3390 -s <cylinder数>
このようにシリンダー数指定で作成することもできます。
例: alcckd /mnt/ibmsys1/zdt/volumes/DASD02 -d 3390 -s 100
(100シリンダーのDASDイメージファイル"DASD02"を作成する例)
ここで指定できるcylinder数は、通常の3390タイプだと65,520cylinder(約52GB)まで指定できます。
Extended Address Volumeとやらの場合は(使ったことない...)、268,435,456cylinder(約208PB)までいけるらしいです。でかすぎてよく分かりません。
参考:
Redbook-IBM ZPDT Guide and Reference
Extended address volumes
※3390:
1track = 56,664byte
1cylinder = 15track = 56,664byte x 15 = 849,960byte
なんだろね、この覚えにくい中途半端なサイズは...
静的追加
DASDイメージ・ファイルを追加したら、IODFに定義してあるDASD用のアドレスとDevicdMapファイルでマッピングの定義をします。
その後、ZD&Tを再起動し直せば、z/OS上からマッピングしたアドレスでアクセスできるようになるので、z/OS上でDASDをInitializeしてオンラインにすれば使えるようになります。
動的追加
静的定義のやり方だと、IPLをしなければいけないのでそれだと都合が悪い場合があります。
上のDeviceMapの定義例のように、Linuxのファイルを指定せずにアドレスだけ指定したリストを用意しておくことで、IPL後に後から動的にDASDイメージファイルを割り当てることもできます。
例えば以下のように、Linuxファイルが割り当てられていない予備のアドレスがDeviceMapに定義された状態でZD&Tが起動しているものとします。
[manager]
name awsckd 0001
...
device 0301 3390 3390
device 0302 3390 3390
device 0303 3390 3390
...
alcckdでDASDイメージ・ファイル/mnt/ibmsys1/zdt/volumes/DASD01を作成したとすると、その後、以下のコマンドを実行します。
awsmount 0301 -m /mnt/ibmsys1/zdt/volumes/DASD01
これで、アドレス0301とDASDイメージファイルのマッピングが動的に行われます。
あとは静的に追加した場合と同様に、z/OS上でDASDのInitializeとONLINEして使えるようになるはずです。
動的変更後は、今後IPLが入った時に同じアドレスにアタッチされるように、DeviceMapファイルの定義も修正しておけばOKです。
(補足)DASD初期化例
新しいDASD追加した後のINITIALIZEについて一応手順例を記載しておきます(ZD&T固有のものではなくz/OSの普通の作法で実施すればよいだけですが)。
INITIALIZE
IBMUSER.JCLというデータセット作って以下のJCL作成。(0301のアドレスのDASDをイニシャライズしてDASD01というVOLUME名を付与)
//INITDASD JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//* MOD-3: VTOC(0,1,974) INDEX(65,0,50)
//* MOD-9: VTOC(0,1,2939) INDEX(196,0,150)
//*
//FORMAT EXEC PGM=ICKDSF,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
INIT UNIT(301) NOVALIDATE NVFY VOLID(DASD01) PURGE -
VTOC(0,1,2939) INDEX(196,0,150)
/*
上のJCLをサブミットすると、以下のようにREPLYを求められるので"U"を返します。
ICK003D REPLY U TO ALTER VOLUME 0301 CONTENTS, ELSE T
RC=00で終了すればOKです。
ONLINE
`V 0301,ONLINE'でオンラインにします。
D U,,,0301,1
IEE457I 22.08.59 UNIT STATUS 123
UNIT TYPE STATUS VOLSER VOLSTATE SS
0301 3390 OFFLINE /RSDNT 0
V 0301,ONLINE
IEE476I UNIT 0301 INFORMATION 125
IEE763I NAME= IECDINIT CODE= 0000000001070401
IEC816I 0301 VARY ONLINE - CU AUTHORIZATION FAILED SER=IBM-01280
IEE764I END OF IEE476I RELATED MESSAGES
IEE302I 0301 ONLINE
D U,,,0301,1
IEE457I 22.09.34 UNIT STATUS 128
UNIT TYPE STATUS VOLSER VOLSTATE SS
0301 3390 O DASD01 PRIV/RSDNT 0
IEF196I IEF237I 0A80 ALLOCATED TO SYS00065
IEF196I IEF285I SYS1.LINKLIB KEPT
IEF196I IEF285I VOL SER NOS= A4RES1.
DASDイメージ・ファイルへの直接アクセス
DASDイメージ・ファイルはz/OSのDASDとして使うことを目的としているため、基本的にはZD&Tを起動してz/OS上からアクセスしないと中身を扱うことはできません。
ただ、PDS/PDSEデータセットのメンバーについては、ZD&Tが起動していない状態でも、pdsUtilというコマンドを用いることで限定的にLinux上から直接DASDイメージファイルの中身を扱うことができます。
(ZD&Tインスタンス作成時のシェル・スクリプトでは、このコマンドを利用してIPL前にDASDの情報を一部上書きしています。)
pdsUtilコマンドでは以下のことができます。
PDSメンバーのリスト(list)
PDSメンバーをリストすることができます。ただし、これはどのDASDイメージファイルにどのようなPDSデータセットがあるのかが分かっていることが前提です。
例: DASDイメージファイル"A4SYS1" にある "ADCD.Z24A.TCPPARMS"以下のメンバーをリスト
[ibmsys1@zdt02 volumes]$ pdsUtil /mnt/ibmsys1/zdt/volumes/A4SYS1 ADCD.Z24A.TCPPARMS --list
AWSPDS012I Emulated CKD file name: /mnt/ibmsys1/zdt/volumes/A4SYS1
AWSPDS013I z/OS volume serial: A4SYS1
AWSPDS014I z/OS PDS data set name: ADCD.Z24A.TCPPARMS
--Name-- --TTR-- K- --User data---------------------------------------------------
GBLIPNOD 0011-0D 0F 011B0026 0116272F 0120008F 08450001 00010000 C9C2D4E4 E2C5D940 4040
GBLRESOL 0012-01 0F 01040029 0118318F 0120015F 1311000F 000F0000 C9C2D4E4 E2C5D940 4040
GBLTDATA 0000-08 0F 01000041 0116272F 0116272F 11140118 01180000 C9C2D4E4 E2C5D940 4040
OBEYME 000E-07 0F 01010009 0119311F 0119311F 14410003 00030000 C9C2D4E4 E2C5D940 4040
PAGENTCF 0009-01 0F 01070016 0118305F 0119273F 12370B01 0B150000 D3C1D9D9 E8E6C440 4040
PAGENTEN 000D-03 0F 01020030 0118305F 0119273F 12370006 00060000 D3C1D9D9 E8E6C440 4040
PORT0023 0001-04 0F 01010046 0118305F 0118305F 124800C9 00C90000 C9C2D4E4 E2C5D940 4040
PORT2023 0011-09 0F 01050041 0118305F 0120003F 0733006D 006E0000 C9C2D4E4 E2C5D940 4040
PROFILE 0002-01 0F 011E0039 0116272F 0118305F 151700E5 00EF0000 C9C2D4E4 E2C5D940 4040
PROF1 0002-03 0F 01200000 0116272F 0118305F 151800E1 00DA0000 C9C2D4E4 E2C5D940 4040
PROF2 0012-05 0F 011D0046 0116272F 0120314F 05260062 00590000 C9C2D4E4 E2C5D940 4040
PROF2BK 0012-03 0F 011C0008 0116272F 0120006F 07050060 00590000 C9C2D4E4 E2C5D940 4040
RESOLVER 0000-06 0F 01000041 0116272F 0116272F 11140003 00030000 C9C2D4E4 E2C5D940 4040
TCPDATA 0000-0A 0F 010C0041 0116272F 0116272F 11140118 01180000 C9C2D4E4 E2C5D940 4040
TLSPOLY1 000D-13 0F 01070026 0118306F 0119303F 11120059 005C0000 C9C2D4E4 E2C5D940 4040
TN3270 0011-05 0F 01050048 0116272F 0120003F 0640002B 010A0000 C9C2D4E4 E2C5D940 4040
TN3270O 0001-02 0F 01000019 0118305F 0118305F 1230010A 010A0000 C9C2D4E4 E2C5D940 4040
T22P3270 0002-07 0F 01000012 0118306F 0118306F 0745005C 005C0000 C9C2D4E4 E2C5D940 4040
T23P3270 0003-02 0F 01050039 0118305F 0118306F 11560078 00790000 C9C2D4E4 E2C5D940 4040
ZCONNECT 0000-0C 0F 01010041 0116272F 0116272F 11140013 00130000 C9C2D4E4 E2C5D940 4040
ZCXDVIPA 0010-12 0F 01060008 0119312F 0119312F 10020012 00060000 C1C4C3C4 D4E2E340 4040
PDSメンバーをLinuxファイルとして抽出(extract)
PDSのメンバーをLinuxのファイルとして抽出することができます。これもどのDASDイメージファイルにどのPDS/メンバーがあるか分かっている必要があります。
まず、A4USR1というDASDイメージファイルにあるIBMUSER.JCLLIBのメンバーをリストしてみます。
[ibmsys1@zdt02 ~]$ pdsUtil /mnt/ibmsys1/zdt/volumes/A4USR1 IBMUSER.JCLLIB --list
AWSPDS012I Emulated CKD file name: /mnt/ibmsys1/zdt/volumes/A4USR1
AWSPDS013I z/OS volume serial: A4USR1
AWSPDS014I z/OS PDS data set name: IBMUSER.JCLLIB
--Name-- --TTR-- K- --User data---------------------------------------------------
DEFUCAT 0003-08 0F 01090001 0116272F 0120325F 2230000D 000F0000 C9C2D4E4 E2C5D940 4040
DELUCAT 0003-0A 0F 010A0059 0116272F 0120325F 22300009 000F0000 C9C2D4E4 E2C5D940 4040
INITDASD 0002-27 0F 01050026 0116272F 0120325F 2200000B 000F0000 C9C2D4E4 E2C5D940 4040
LISTC 0002-2D 0F 01070033 0116272F 0120325F 22130008 000F0000 C9C2D4E4 E2C5D940 4040
TEST 0003-0C 0F 01070033 0116272F 0120325F 22130008 000F0000 C9C2D4E4 E2C5D940 4040
この例では、LISTCというJCLがあるのでそれを抽出してみます。
[ibmsys1@zdt02 ~]$ pdsUtil /mnt/ibmsys1/zdt/volumes/A4USR1 IBMUSER.JCLLIB/LISTC --extract
AWSPDS012I Emulated CKD file name: /mnt/ibmsys1/zdt/volumes/A4USR1
AWSPDS013I z/OS volume serial: A4USR1
AWSPDS014I z/OS PDS data set name: IBMUSER.JCLLIB
AWSPDS015I z/OS PDS member name: LISTC
AWSPDS016I Member file output name: LISTC.txt, Translation: Ebc037/Asc437.
AWSPDS042I 8 records copied to file 'LISTC.txt' from PDS member 'LISTC'.
カレント・ディレクトリに、<メンバー名>.txtというファイルが作成されます。この時、EBCDIC(037)からASCII(437)への文字コード変換も行われます。
Linux上で下のテキストファイルを見てみると、以下のように参照できます。
[ibmsys1@zdt02 ~]$ cat LISTC.txt
//LISTC JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*-----------------------------------------------------
//*
//GO EXEC PGM=IDCAMS,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LISTC USERCATALOG ALL
/*
抽出したメンバーの上書き(overlay)
extractで抽出したテキストファイルをLinux上で編集し、その結果を同じPDSメンバーに上書きすることができます。ただし、PDSメンバーのサイズが変わってしまうような変更の場合は上書きできず、あくまで同一サイズ内での修正に限られます。つまり、行を増やしたり減らしたりした場合は上書きできません。
また、新規でメンバーを追加したりメンバーを削除するような更新もできません。
上で抽出したLISTC.txtをLinux上のviエディターで以下のように編集してみます。(JOB名をLISTC => LISTC2に変更)
//LISTC2 JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*-----------------------------------------------------
//*
//GO EXEC PGM=IDCAMS,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LISTC USERCATALOG ALL
/*
この内容でPDSメンバーを上書きします。
[ibmsys1@zdt02 ~]$ pdsUtil /mnt/ibmsys1/zdt/volumes/A4USR1 IBMUSER.JCLLIB/LISTC --overlay
AWSPDS012I Emulated CKD file name: /mnt/ibmsys1/zdt/volumes/A4USR1
AWSPDS013I z/OS volume serial: A4USR1
AWSPDS014I z/OS PDS data set name: IBMUSER.JCLLIB
AWSPDS015I z/OS PDS member name: LISTC
AWSPDS016I Member file output name: LISTC.txt, Translation: Ebc037/Asc437.
AWSPDS055I 8 records overlayed PDS member 'LISTC' from file 'LISTC.txt'.
この時、Ascii(437)=>EBCDIC(037)へのコード変換が行われてターゲットのPDSメンバーが上書きされます。
PCOM上で見るとJOB名が書き換わっていることが分かります。
注意!
この機能の操作は排他制御やRACF制御などは行われません。
IPLに関連するメンバーを誤って上書きして壊してしまうと修復が難しくなりますのでご注意ください。
(上書き機能については必要最低限にとどめておくことをおすすめします)