18.6. world の再構築

FreeBSD-STABLE、FreeBSD-CURRENT などの FreeBSD のどれか特定のバージョンについて、 ローカルのソースツリーを同期させたら、 そのソースツリーを使ってシステムを再構築できます。 このプロセスは world の再構築と呼ばれます。

world を再構築するに、 以下を行ってください。

手順18.1 world の構築に行う作業
  1. 重要なデータを他のシステムやリムーバブルメディアにバックアップし、 きちんとバックアップが作成されていることを確認したら、 起動可能なインストールメディアを用意してください。 システムを再構築する前に、 バックアップを作成することの重要性は、 いくら強調してもし過ぎると言うことはありません。 システム全体の再構築は難しい作業ではありませんが、 どんなに注意していたとしても、 ソースツリーそのものに手違いがあった時には、 システムが起動しなくなってしまう状態になることがあるのです。 多分、それを使うことはないと思いますが、 あとで後悔することのないよう、念のため用意しておきましょう!

  2. 追いかけているブランチに応じて、 freebsd-stable もしくは freebsd-current の最近のエントリを調べて、 既知の問題や影響を受けるシステムを確認してください。 既知の問題が同期しているバージョンのコードに影響する場合は、 その問題が解決されたことを報告する 問題解決 (all clear) のアナウンスが投稿されるまで待ってから、ソースを同期して、 ローカルのソースに必要な修正を入れてください。

  3. /usr/src/UPDATING を読み、 同期しているソースのバージョンで必要となるステップがないかどうかを調べて下さい。 このファイルには潜在的な問題や特定のコマンドを実行する順などの重要な情報が含まれています。 大きなアップグレードでは、world をインストールする前に特定のファイルの名前を変更したり、 削除するといった、特別なステップが追加で必要となることがあります。 ファイルの最後には、 現在推奨されているアップグレードの手順が詳しく正確に説明されています。 もし、UPDATING に書かれている手順が、 この節に書かれているものと矛盾していたら、 UPDATING の手順を採用してください。

make world は使わないこと:

古いドキュメントの中には、 make world を使うことを薦めているものがあります。 これは、重要な手順をいくつか抜かしてしまうので、 エキスパートでなければ使うべきではありません。 ほぼあらゆる場合において、make world を実行するのは間違っており、 ここで説明されている手順を用いるべきです。

18.6.1. システム更新の概要

world の構築では、「ソースの同期」 に書かれている手順で入手したソースを用いて、 古い FreeBSD のバージョンをアップデートしてください。

FreeBSD では、world は、 カーネル、コアシステムのバイナリ、 ライブラリ、プログラミングファイル、組み込みのコンパイラを意味します。 これらのコンポーネントの構築およびインストールの順番は重要です。

例えば、古いコンパイラは、 バグを含み、新しいカーネルをコンパイルできない可能性があります。 そのため、新しいカーネルの構築には、 新しいコンパイラを使う必要があり、 新しいコンパイラを構築しなくてはいけませんが、 必ずしも、 新しいコンパイラがインストールされている必要があるわけではありません。

新しい world は、 新しいカーネルの機能に依存している可能性があるため、 新しい world をインストールする前に、 新しいカーネルがインストールされていなければなりません。 古い world は、新しいカーネルでは正しく動かないかも知れません。 そのため、新しいカーネルをインストールしたら、 直ちに新しい world をインストールしてください。

設定の中には、新しい world をインストールする前に変更すべきものがありますが、 古い world を壊す可能性があります。 そのため、一般的に設定のアップデートは、 2 つの手順が使われます。 多くの場合、アップデートのプロセスは、ファイルを置き換えたり、 追加のみを行い、古いファイルを削除しません。 このことが問題を引き起こす可能性があるため、 /usr/src/UPDATING には、 手動で削除すべきファイルをどのステップで削除すべきかが書かれています。

これらを配慮し、アップグレードの推奨手順が作られました。

注記:

make を実行したときの出力は、 ファイルに保存すると良いでしょう。 何か障害が発生した場合には、エラーメッセージのコピーを FreeBSD メーリングリストに投稿してください。

ファイルに保存する最も簡単な方法は、script コマンドを使い、 引数として出力の保存先のファイル名を指定することです。 /tmp に出力を保存しないようにしてください。 このディレクトリは、次の再起動で削除されてしまう可能性があります。 出力の保存には、/var/tmp が適しています。 次のコマンドを world の構築の直前に行ない、再構築が終了したら exit と入力してください。

# script /var/tmp/mw.out
Script started, output file is /var/tmp/mw.out
手順18.2 world の構築プロセスの概要

world の構築プロセスで用いられるコマンドは、 ここで示されている順番で実行してください。 この節では各コマンドの機能についてまとめます。

  1. システム上で world の構築が一度でも行われたのであれば、 前回の構築の際のコピーが /usr/obj に存在するはずです。 このディレクトリが存在しているのであれば、 このディレクトリを削除して、 make buildworld の行程にかかる時間を短縮し、 依存問題に悩まされるようなトラブルを回避することができます。

    # cd /usr/obj
    # chflags -R noschg *
    # rm -rf *
  2. 新しいコンパイラと関連ツールを最初にコンパイルし、 その後、新しいコンパイラで、 新しい world の残りの部分をコンパイルします。 コンパイルされたものは、 /usr/obj に格納されます。

    # cd /usr/src
    # make buildworld
  3. コンパイラとカーネルのミスマッチを防ぐため、 /usr/obj にある新しいコンパイラを用いて新しいカーネルを構築します。 再構築は、ある種のメモリ構造体が変更されたような場合には必須で、 pstop のようなプログラムは、 カーネルとソースコードのバージョンが一致しないと正常に動作しないでしょう。

    # make buildkernel
  4. 新しくアップデートされたカーネルで起動できるように、 新しいカーネルとカーネルモジュールをディスク上に配置します。 kern.securelevel を 1 より大きくしていて、 かつ カーネルのバイナリファイルに noschg のようなフラグを設定している場合は、 まず、シングルユーザモードに移行してください。 それ以外の場合は、 マルチユーザモードでこれらのコマンドを問題なく動かせるはずです。 kern.securelevel について詳しくは init(8) を、ファイルに対するさまざまなフラグについて詳しくは chflags(1) をご覧ください。

    # make installkernel
  5. すでに実行されているソフトウェアをアップデートする際の問題を最小限にするため、シングルユーザモードに移行します。 また、新しいカーネル上で古い world が実行される際の問題も最小限にします。

    # shutdown now

    シングルユーザモードに移行したら、UFS でフォーマットされているシステムでは、 以下のコマンドを実行してください。

    # mount -u /
    # mount -a -t ufs
    # swapon -a

    もしシステムが ZFS でフォーマットされている場合には、 以下の 2 つのコマンドを実行してください。 この例では、zpool の名前は zroot であると仮定します。

    # zfs set readonly=off zroot
    # zfs mount -a
  6. その後、どちらのファイルシステムでも、 CMOS クロックが地域時間に設定されていて GMT ではない場合 (date(1) が正しい時間と地域を表示しないなら当てはまります) には、次のコマンドを実行してください。

    # adjkerntz -i
  7. システムの再構築では、 /etc, /var/usr といったディレクトリに新規に導入されたファイルや、 変更された設定ファイルに対する更新は行なわれません。 次に、新しい world に対する /etc の最初の設定ファイルのアップデートを行います。 以下のコマンドは installworld に成功するために本質的なファイルのみを比較します。 たとえば、 このステップでは、最後のアップデート後に FreeBSD に追加された、 新しいグループや新しいシステムアカウント、 もしくはスタートアップスクリプトがシステムに追加されることがあります。 次のコマンドに関する詳細な情報については、 「設定ファイルの同期」 を参照してください。

    # mergemaster -iF
  8. /usr/obj にある新しい world   およびシステムのバイナリをインストールします。

    # cd /usr/src
    # make installworld
  9. 残りの設定ファイルをアップデートします。

    # mergemaster -p
  10. 使われなくなったファイルを削除します。 もし使われなくなったファイルがディスクに残っていると、 問題が起きる可能性があるため重要な作業です。

    # make delete-old
  11. 再起動を行い、新しいカーネル、 world そして設定ファイルをロードします。

    # reboot
  12. 古いライブラリを削除する前に、 「ports のアップグレード」 に書かれている手順にしたがって、 すべての ports を再構築する必要があります。 再構築が終わったら、新しいライブラリと競合することを避けるため、 使われなくなったライブラリを削除します。 この過程に関する詳細については、「使われなくなったファイル、ライブラリの削除」 を参照して下さい。

    # make delete-old-libs

もしシステムがダウンタイムを持つことができるのであれば、 システムのコンパイルをマルチユーザモードでおこない、 インストールのためにシングルユーザモードに移行するという方法ではなく、 コンパイルをシングルユーザモードで行うことを考えてください。 システムの再インストールでは、たくさんの重要なシステムファイル、 すべての標準的なシステムバイナリ、ライブラリ、 インクルードファイルが変更されるので、 実際に動作しているシステムにおいて、 特にアクティブなユーザは、トラブルに見舞われる可能性があります。

18.6.2. 設定ファイル

world の構築プロセスでは、いくつかの設定ファイルが使われます。

/usr/src に置かれている、 Makefile には、 FreeBSD を構成するプログラムの構築方法や、 どういう順番でそれらを構築すべきかといった指示が記述されています。

make で利用可能なオプションの説明は make.conf(5) や、共通の例が /usr/share/examples/etc/make.conf にあります。 これらの設定を /etc/make.conf に追加すると、 make の実行やプログラムの構築方法を設定できます。 これらのオプションは、 make が使われる際には常に有効となるため、 Ports Collection からアプリケーションをコンパイルする時、 ユーザが書いた C プログラムや FreeBSD オペレーティングシステムを構築する際に影響を及ぼします。 ある設定を変更したことにより、影響が広い範囲におよび、 驚くべき結果をもたらす可能性があります。 両方のファイルに書かれているコメントを読むことと、 デフォルトの設定は、パフォーマンスと安全性の観点から選ばれていることを覚えておいてください。

/etc/src.conf は、 ソースコードを用いたオペレーティングシステムの構築をコントロールします。 /etc/make.conf とは異なり、 /etc/src.conf に書かれた設定は、 FreeBSD オペレーティングシステムそのものを構築するときにのみ影響します。 このファイルで設定可能な多くのオプションについては、 src.conf(5) に記述されています。 一見したところ無効にされている、 使われていないカーネルモジュールやビルドオプションに注意してください。 ときどき予期しなかったり、わずかな影響を与えることがあります。

18.6.3. 変数とターゲット

make の使用における一般的な書式は、 次のとおりです。

# make -x -DVARIABLE target

この例では、-xmake に渡されるオプションになります。 どのようなオプションが利用できるかについては、make(1) を参照してください。

変数を渡すには、変数の名前を -DVARIABLE のように指定してください。 この変数は Makefile の動作をコントロールします。 変数の指定は、/etc/make.conf で設定するか、 make の実行時に指定するかのどちらかで行います。 たとえば、以下の変数は、プロファイル版のライブラリを構築しないことを指定します。

# make -DNO_PROFILE target

これは、/etc/make.conf の中で以下のように設定することに対応します。

NO_PROFILE=    true     #    Avoid compiling profiled libraries

target は、make に どのように動作するのかを指示するためのものです。 Makefile は利用可能なターゲットを定義しています。 ターゲットには、 システムの再構築に必要な段階を、 多くのさらに細かい段階に分割するため、 構築の過程で利用されるものがあります。

選択肢が分けられていることは、二つの理由から有用です。 まず第一に、構築作業は稼働中のシステムにまったく影響を与えません。 そのため、マルチユーザモードで稼働中のシステムでも、安全に buildworld を実行できます。 ただし、installworld は シングルユーザモードで行なうことをおすすめします。

第二に、NFS マウントを利用することで、「複数のマシンで追いかける」 で説明されているように、 ネットワーク上の複数のマシンをアップグレードすることが可能な点があげられます。

make-j をつけると、 同時に複数のプロセスを生成できます。 構築過程の大部分では CPU 性能の限界より I/O 性能の限界の方が問題となるため、 シングル CPU とマルチ CPU マシンの両方に効果があります。

普通のシングル CPU マシンで以下のコマンド を実行すると、最大 4 個までのプロセスを同時に実行します。 メーリングリストに投稿された経験的な報告によると、 4 個という指定が最も良いパフォーマンスを示すようです。

# make -j4 buildworld

マルチ CPU マシンでは、 6 から 10 の間の値を設定し、 速度がどれくらい向上するか確認してみてください。

注記:

make buildworld に変数を指定した場合は、同じ指定を make installworld にも指定しなければなりません。 ただし installworld では、-j絶対に使ってはいけません

たとえば、以下のコマンドを実行したなら、

# make -DNO_PROFILE buildworld

以下のようにしてインストールしなければなりません。

# make -DNO_PROFILE installworld

もしそうしなかった場合、2 番目のコマンドは、 make buildworld の段階で構築されていないプロファイル版ライブラリをインストールしようとしてしまうでしょう。

18.6.4. 設定ファイルの同期

寄稿: Rhodes Tom [FAMILY Given].

FreeBSD の mergemaster(8) Bourne シェルスクリプトは、 /etc にある設定ファイルと、 /usr/src/etc にある設定ファイルの違いを確認するためのものです。 これを使うのが、 ソースツリーにある設定ファイルにシステムの設定ファイルを 更新するために推奨される方法です。

mergemaster を使う前に、 既存の /etc をどこか安全な場所にコピーしておきましょう。 再帰的なコピーを行なう -R と、 ファイルの更新時間や所有者などを保存する -p と共に実行してください。

# cp -Rp /etc /etc.old

mergemaster を実行すると、 / を起点とした一時的なルート環境を構築し、 さまざまなシステム設定ファイルを (訳注: デフォルトでは /var/tmp/temproot に) 置いていきます。 これらのファイルは現在システムにインストールされているファイルと比較されます。 異なるファイルは diff(1) 形式で示され、 + の記号は追加または変更された行を表し、 - は完全に削除されたか新しく置き換えられた行を表します。 ファイルの違いの表示方法についてのより詳しい情報は、 diff(1) を参照してください。

次に mergemaster(8) は違いのあるファイルをそれぞれ示し、 選択可能なオプションを表示します。 ここでは、新しいファイルを削除するか、 一時ファイルをそのままインストールするか、 一時ファイルと現在インストールされているファイルを統合するか、 もしくは結果をもう一度見るかを選択できます。

一時ファイルの削除を選ぶと、mergemaster に現在のファイルを変更しないで新しいバージョンを削除せよと伝えます。 この選択は、お勧めできません。 mergemaster のプロンプトで ? とタイプすれば、 いつでもヘルプが見られます。 ファイルのスキップを選ぶと、他のすべてのファイルを終えたあと、 もう一度そのファイルが提示されます。

一時ファイルをそのままインストールすることを選ぶと、 現在のファイルを新しいファイルで置き換えます。 ほとんどの手を加えていないファイルは、 これが一番よい選択です。

ファイルの統合を選んだ場合、 テキストエディタが起動され、両方のファイルの中身が提示されます。 画面上に並ぶ両方のファイルを見て新しいファイルを作成するために両方から必要な部分を選択し、 2 つのファイルを統合することができます。 並んでいるファイルを比較するとき、 l で左側の中身を選択し、 r で右側の中身を選択します。 最終出力は左右両方の部分でできたファイルになるでしょう。 このファイルをインストールすることができます。 たいてい、このオプションはユーザが設定を変更したファイルに使われます。

結果をもう一度見る、を選択すると、 ファイルの相異点をもう一度見ることができます。

mergemaster がシステムファイルの比較を終えたあと、 他のオプションについてもプロンプトが表示されます。 たとえば、 パスワードファイルを再構築するかどうかを尋ねることがあります。 最後に残った一時ファイルを削除するかどうかを尋ねて終了します。

18.6.5. 使われなくなったファイル、ライブラリの削除

ベースとなったノートの提供: Shterenlikht Anton [FAMILY Given].

FreeBSD の開発サイクルにおいて、 ファイルやシステムの一部が使われなくなることがあります。 それらの機能が別の場所で実装されたり、 ライブラリのバージョン番号が変わったり、 システムから完全に削除されることがあるためです。 システムのアップデート時に削除が必要になるのは、 古いファイル、ライブラリそしてディレクトリです。 これらのファイルを削除することで、 記憶媒体やバックアップ媒体において不必要な容量を占めている古いファイルが、 システム上に散乱することがなくなります。 また、古いライブラリのセキュリティや安定性に問題があると、 ライブラリを新しくしてシステムを安定な状態にし、 古いライブラリによりシステムがクラッシュすることを防がなければなりません。 使われなくなったファイル、ディレクトリ、ライブラリは /usr/src/ObsoleteFiles.inc にまとめられています。以下の手順により、 アップグレードの過程でこれらのファイルを削除できます。

make installworld と、その後の mergemaster が無事に終わったら、 使われなくなったファイルやライブラリを確認してください。

# cd /usr/src
# make check-old

見つかった古いファイルは、以下のコマンドで削除できます。

# make delete-old

使われなくなったファイルを削除する際、 ファイルごとに確認が求められます。 確認を省略し、自動的にファイルを削除するには、 以下のように BATCH_DELETE_OLD_FILES を設定してください。

# make -DBATCH_DELETE_OLD_FILES delete-old

yes をコマンドへパイプでつなげても省略できます。

# yes|make delete-old

Warning:

使われなくなったファイルを削除すると、 削除したファイルに依存していたアプリケーションは壊れてしまいます。 特に、古いライブラリを削除する場合に起こり得ます。 通常、make delete-old-libs を実行する前に、 これらの古いライブラリを使っているプログラム、ports、 ライブラリを再構築する必要があります。

共有ライブラリをチェックするユーティリティとして、 sysutils/libchksysutils/bsdadminscripts を利用できます。

使われなくなった共有ライブラリは、 新しいライブラリと競合し、以下のようなメッセージを表示することがあります。

/usr/bin/ld: warning: libz.so.4, needed by /usr/local/lib/libtiff.so, may conflict with libz.so.5
/usr/bin/ld: warning: librpcsvc.so.4, needed by /usr/local/lib/libXext.so, may conflict with librpcsvc.so.5

この問題を解決するには、 まずライブラリがどの port によってインストールされたかを調べて下さい。

# pkg which /usr/local/lib/libtiff.so
  /usr/local/lib/libtiff.so was installed by package tiff-3.9.4
# pkg which /usr/local/lib/libXext.so
  /usr/local/lib/libXext.so was installed by package libXext-1.1.1,1

見つかった port をアンインストールし、 再構築、再インストールしてください。 この過程は ports-mgmt/portmaster で自動化できます。 すべての ports が再構築され、 古いライブラリがどこにも使われていないことを確認したら、 以下のコマンドで古いライブラリを削除してください。

# make delete-old-libs

もしちょっとした問題があった場合でも、 システムの一部を再構築するのは簡単です。 たとえば、アップグレードや /etc のマージの途中で誤って /etc/magic を削除してしまい、 その結果 file が動作しなくなってしまったような場合には、 次のコマンドを実行して修復してください。

# cd /usr/src/usr.bin/file
# make all install

18.6.6. よくある質問

変更が行なわれたら、 その度にシステムの再構築が必要になるのでしょうか?

それは変更の内容によります。 たとえば、svn を実行したとき、 次にあげるようなファイルが更新されていたとします。

src/games/cribbage/instr.c
src/games/sail/pl_main.c
src/release/sysinstall/config.c
src/release/sysinstall/media.c
src/share/mk/bsd.port.mk

このときには、改めてシステム全体を再構築する必要はないでしょう。 そのかわり、適切なサブディレクトリに移って make all install を行ってください。 しかし、たとえば src/lib/libc/stdlib のような大きな変更が行なわれた場合には、 システム全体を再構築することを検討してください。

2 週間ごとにシステムを再構築して、 その 2 週間分の変更を取り込むユーザもいますし、 変更のあった部分だけ再構築し、 すべての依存関係を確かめたいと考えるユーザもいます。 それらはどのくらいの頻度でアップグレードしたいか、 そして FreeBSD-STABLE か FreeBSD-CURRENT のどちらを追いかけているのかにもよります。

どうして signal 11 (もしくは他のシグナル番号) のエラーがたくさん出て コンパイルが失敗するのでしょうか?

これは通常、ハードウェアに問題があることを示しています。 world の再構築は、 ハードウェア (特にメモリ) に対する負荷耐久試験を行なうための有効な手段です。 本当にこの問題によるものかどうかは、 make をもう一度実行し、異なる段階で異常終了が発生するか、 ということから確認できます。

このエラーに対応するには、RAM を始めとして、 マシンの部品をメモリから交換して、 どの部分が悪いのかを調べてみてください。

終了したら /usr/obj を削除してもかまいませんか?

このディレクトリには、 コンパイルの段階で生成された すべてのオブジェクトファイルが含まれています。 通常 make buildworld の最初の段階では、 このディレクトリを削除して新しくつくり直すようになっています。 構築終了後も /usr/obj を保存しておいても、あまり意味はありません。 削除すれば、だいたい 2GB のディスクスペースを解放することができます。

構築を中断した場合、 その構築を途中から再開することはできますか?

それは、問題が起こるまでに、 どれだけの作業を終えているかによります。 一般的に make buildworld は、 基本的なツールや、 システムライブラリの新しいコピーを作成します。 その後、これらのツールやライブラリがインストールされてから、 自分自身の再構築に使われ、もう一度、インストールされます。 システムの残りの部分がその新しいシステムファイルを用いて作り直されます。

再構築の最終段階では、 まったく安全に以下のコマンドを実行することができます。 これは、前回の make buildworld の作業をやり直しません。

# cd /usr/src
# make -DNO_CLEAN all

次のメッセージ

--------------------------------------------------------------
Building everything..
--------------------------------------------------------------

make buildworld の出力にある場合には、 上のようにしてもほとんど悪影響が現れることはありません。

もしこのメッセージがない場合には、 安全を確保し、後悔するようなことがないよう、 システムの再構築を最初からやり直しましょう。

make world を高速化できますか?

いくつかの方法で build world のプロセスを高速化できます。 たとえば、全体のプロセスは、 シングルユーザモードで動かすことで高速になります。 しかしながら、この方法では、プロセスが完了するまで、 ユーザがシステムにアクセスすることはできません。

ファイルシステムを注意深く設計したり、 ZFS データセットを使うことでも変わります。 /usr/src/usr/obj を、異なるディスク上の別のファイルシステムに置くことを検討してください。 また可能ならば、 異なるディスクコントローラに接続された異なるディスクにファイルシステムを置いてください。 /usr/src をマウントする時には、 最後にアクセスされた時刻の書き込みを抑制するように、 noatime オプションを付けてマウントしてください。 もし、/usr/src が、 独立したファイルシステムではないときには、 noatime オプションで、/usr を再マウントしてください。

/usr/obj のあるファイルシステムを、async オプションをつけてマウントもしくは再マウントしてください。 これによって、ディスクへの書き込みが非同期になります。 つまり、書き込み命令はすぐに完了するのに対し、 実際にデータがディスクに書き込まれるのは、その数秒後になります。 これによって、書き込み処理の一括化が可能になるため、 劇的なパフォーマンスの向上が期待できます。

警告:

このオプションを指定すると、ファイルシステムは 壊れやすくなってしまうことに注意してください。 このオプションを付けていて、突然電源が落ちた場合には、 再起動後にファイルシステムが復旧不能になる可能性が 非常に高くなります。

もし、>/usr/obj が、ファイルシステムにある唯一のディレクトリであれば、 これは問題になりません。 しかし、同じファイルシステムに、 他の貴重なデータを置いているときには、 このオプションを有効にする前に、 バックアップをきちんと取っておきましょう。

/etc/make.confNO_PROFILE=true をセットして、 プロファイル版の作成を無効化してください。

make(1)-jn を指定して、複数のプロセスを並列に実行させてください。 これは、単一のプロセッサでも複数のプロセッサでも、 同様に恩恵を得ることができます。

なにか悪いことがあったらどうすればいいですか?

まず、自分の環境に前のビルドの余計なゴミが残っていないことをはっきりと確認してください。

# chflags -R noschg /usr/obj/usr
# rm -rf /usr/obj/usr
# cd /usr/src
# make cleandir
# make cleandir

ええ、make cleandir は本当に 2 回実行するのです。

そして、make buildworld を行い、 全プロセスを最初からやり直してください。

まだ問題があれば、エラーと uname -a の出力を FreeBSD general questions メーリングリスト に送ってください。 設定についてさらに質問されても答えられるよう用意してください!

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。