CentOS6.5 に glibc-2.14 をインストールした後、ロケールで「そのようなファイルまたはディレクトリはありません」というメッセージが表示される場合の解決策

CentOS6.5 に glibc-2.14 をインストールした後、ロケールで「そのようなファイルまたはディレクトリはありません」というメッセージが表示される場合の解決策

1. 穴に落ちる

最近、社内のテストサーバー(CentOS6.5)で、特定のソフトウェアをインストールするために、glibcライブラリをアップグレードする必要がありました。glibcはLinuxのコアライブラリです。元のバージョンを直接置き換えてアップグレードすると、予期しない例外が発生する可能性があります(大量のコマンドが実行できないなど)。
そこで、 Centos6.5 での glibc のアップグレード手順を参考に、glibc-2.14 を手動でアップグレードしてインストールしました。<br /> 公式サイトから glibc-2.14 の tarball をダウンロードし、上記の手順に従ってコンパイルしてインストールしました。

$ mkdir build // glibc-2.14 ディレクトリにビルド フォルダーを作成します。$ cd build // ビルド ディレクトリに入ります。$ ../configure --prefix=/opt/glibc-2.14 // 注: glibc を設定し、現在の glibc-2.14 インストール ディレクトリを設定します。$ make && make install // glibc-2.14 ライブラリをコンパイルしてインストールします。

/lib64/libc.so.6 を指すソフトリンクを変更すると、プログラムは正常に実行されますが、中国語の文字が文字化けします

私の経験とインターネット上のほとんどの人の意見によると、これは簡単だと思います。言語をリセットするだけで済むのではないでしょうか?

実際に実行して、シェルで locale を実行すると、次のエラーが発生します。

ロケール: LC_CTYPE をデフォルト ロケールに設定できません: そのようなファイルまたはディレクトリはありません
ロケール: LC_ALL をデフォルト ロケールに設定できません: そのようなファイルまたはディレクトリはありません

_注: 上記のエラーは、locale コマンドを手動で実行する場合だけでなく、ssh 経由でリモートでシェルにログインするたびに発生します。 _

2. 無駄な努力

上記の問題を解決するために、Baidu と G-Dog でいろいろ検索し、以下の方法を試しましたが、問題は依然として存在します。

次のコマンドを使用します。
エクスポートLANG="en_US.utf8"
環境変数 LANG を変更できます。変更はすぐに有効になります。システムを再起動すると、言語は元の言語に戻ります。言語を変更するには、他に 2 つの方法があります。
1. 次のファイルを設定します。
vi /etc/sysconfig/i18n
元の構成を次のように変更します。
LANG="zh_CN.utf8"
LANG="en_US.utf8"に変更します
保存後、すぐには反映されませんが、再起動後に反映されます。

3. 若さの衝動

パニック状態になっていたとき、しばらく外に出てタバコを吸いました。問題の本質に戻ったほうがいいようです。エラー「そのようなファイルまたはディレクトリはありません」が表示されたので、存在しないかシステムでサポートされていないロケールを設定したことを意味します。たとえば、上記のソリューションでは、言語を LANG="en_US.UTF-8" に変更すると、ロケールが zh_CN.UTF-8 に設定されます。オペレーティングシステムが構成を通じてローカリゼーション環境を初期化したときに、対応する言語パックが見つかりませんでした (実際には、言語パックだけではなく、ロケールにはタイムゾーン、通貨の測定なども含まれます)。つまり、OS は対応するロケールファイルを見つけることができません。理解すれば、この問題は簡単に解決できます。

まず、localeコマンドを使用して、システムにこのロケールがあるかどうかを確認します。

[****@****** bin]# ロケール -a|grep en_US
ja_JP 日本語
en_US.iso88591
en_US.iso885915
en_US.utf8

これを見たときはびっくりしました。en_US.utf8 が含まれているので、OS はロケールを en_US.utf8 に設定できるということです。それなのに、なぜ次のエラーが表示されるのでしょうか。

ロケール: LC_CTYPE をデフォルト ロケールに設定できません: そのようなファイルまたはディレクトリはありません
ロケール: LC_ALL をデフォルト ロケールに設定できません: そのようなファイルまたはディレクトリはありません

4. 希望の光

何か見落としていませんか? 出発点に戻ってもう一度調べてください。突然、疑問が浮かびました。アップグレードを上書きするのではなく、新しい glibc ライブラリを再インストールしたので、システムには少なくとも 2 つのロケール コマンドがあることになります。CentOS は、どのコマンドを使用するかをどのように判断するのでしょうか。

システムのデフォルトの /usr/bin/locale の代わりに、新しくインストールした /opt/glibc-2.14/bin/locale が使用されている可能性がありますか? この考えは、次のコマンドで簡単に確認できます。

[****@****** bin]# /opt/glibc-2.14/bin/locale -a 
C
POSIX

当然ながら、このロケールは C と POSIX のみをサポートし、en_US.utf8 はサポートしていないため、ロケールを en_US.utf8 に設定すると、当然「そのようなファイルまたはディレクトリはありません」というエラーが報告されます。

問題は、/opt/glibc-2.14/bin/locale コマンドにリストされているローカライズされた言語パッケージはどこから来るのかということです。設定ファイルを通してですか?または、ディレクトリ内のファイルを直接読み取りますか?
もちろん、ソース コードを見れば、上記の質問に対する答えは簡単に見つかります。私は怠け者なので、大胆に推測します。システムでサポートされているすべてのロケール ファイルが含まれている特定のディレクトリから読み取る必要があります。この推測は、「そのようなファイルまたはディレクトリはありません」というエラー メッセージから得られます。

このディレクトリの場所を見つけるために、strings コマンドを思いつき、次のコマンドを直接使用しました。

[****@****** bin]# 文字列 /opt/glibc-2.14/bin/locale|grep ロケール
ロケールの設定
/ロケール。
ロケール (GNU %s) %s
ロケール
ロケール
すべてのロケール
ロケールアーカイブ
ロケール: %-15.15s アーカイブ: /opt/glibc-2.14/lib/locale/locale-archive
ロケール: %-15.15s ディレクトリ: %.*s
LC_CTYPE をデフォルトのロケールに設定できません
LC_MESSAGES をデフォルトのロケールに設定できません
LC_COLLATE をデフォルトのロケールに設定できません
LC_ALL をデフォルトのロケールに設定できません
利用可能なロケールの名前を記入
ロケール固有の情報を取得します。

確かに、 /opt/glibc-2.14/lib/locale/locale-archiveというパスがあります。名前から、これはおそらく、サポートされているすべてのロケール ディレクトリ (またはアーカイブ ファイル) の場所を読み取るための locale コマンドであると推測するのは簡単です。

5. 問題KO

上記のディレクトリを ls すると、ディレクトリが実際に空であり、locale-archive というアーカイブ ファイルが存在しないことがわかります。

[****@****** bin]# ll /opt/glibc-2.14/lib/locale/

解決策は非常に簡単です。ロケールコマンド /usr/bin/locale で使用される locale-archive ファイルを /opt/glibc-2.14/lib/locale/locale-archive にコピーするだけです。

[****@****** bin]# cp /usr/lib/locale/locale-archive /opt/glibc-2.14/lib/locale/locale-archive

/usr/bin/locale が使用するロケール ファイル ディレクトリが /usr/lib/locale/locale-archive であることをどうやって知るのかと尋ねる人もいるかもしれません。答えは簡単です。Baidu を使用すれば簡単に見つけることができます。

コピーが完了したら、セッションを終了し、再度ログインして、/opt/glibc-2.14/bin/locale コマンドを再度実行します。No such file or directory エラーは表示されず、以前の文字化けの問題も解決されます。

6. 追記

上記は、centos 6.5 環境に glibc ライブラリを手動でインストールした後、文字化けしたコードの問題を解決した方法を記録したものです。このプロセスには、ロケールの原則に関する知識も必要でしたが、これもまた学びました。
ちなみに、/opt/glibc-2.14/bin/locale コマンドのロケール読み取りパスは上記で推測しましたが、後で locale.c ソースコードを確認したところ、確かに /opt/glibc-2.14/lib/locale/locale-archive から読み取られていることを確認しました (もちろん、他の読み取り場所もあります)。

CentOS6.5にglibc-2.14をインストールした後、ロケールで「そのようなファイルまたはディレクトリはありません」という問題を解決する方法についての記事はこれで終わりです。glibcをインストールした後、中国語の文字化けの問題を解決する方法の詳細については、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を続けて参照してください。今後とも123WORDPRESS.COMを応援してください。

以下もご興味があるかもしれません:
  • Centos6.5 glibc アップグレードプロセスの紹介
  • CentOS6 アップグレード glibc 操作手順
  • CentOS 6.9 で glibc ダイナミック ライブラリをアップグレードする詳細なプロセス
  • Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

<<:  XHTML におけるタイトルタグと段落タグの使用に関する詳細な説明

>>:  ウェブサイトのフロントエンドをエレガントでユーザーにとって魅力的なものにする方法

推薦する

HTML でスクロールバーを使用する際のヒントを共有する

今日、牛南ニュースリリースシステムについて学んでいたとき、牛南先生はスクロールバーに関するいくつかの...

Vueはフィルターを使用して日付をフォーマットします

この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...

ネイティブJSで様々なモーションの複合モーションを実現

この記事では、ネイティブ JS で実装された複合モーションを紹介します。複合モーションとは、異なる属...

Vue は Ctrip のカルーセル効果を模倣します (スライディング カルーセル、以下は高度に適応)

まずケースを見てみましょう。vue+swiper を使用して実装します。スライドの高さが異なる場合、...

MySQL 正規表現 (regexp と rlike) の検索機能の例分析

この記事では、例を使用して MySQL 正規表現 (regexp および rlike) の検索機能を...

jsはシンプルなカウントダウンを実装します

この記事の例では、参考までに簡単なカウントダウンを実装するためのjsの具体的なコードを共有しています...

JavaScript継承のさまざまな方法とメリット・デメリットを詳しく解説

目次1. プロトタイプチェーン継承2. コンストラクタの借用(古典的な継承) 3. 組み合わせ継承4...

HTML は CSS スタイルと JS スクリプトを動的に読み込みます。例

1. スクリプトを動的に読み込むウェブサイトの需要が高まるにつれて、スクリプトの需要も徐々に増加しま...

CSS でのシングル div 描画テクニックの実装

純粋な HTML + CSS を使ってドラえもんの絵を描くなど、CSS 描画に関する記事をよく見かけ...

MySQL 8.0.11 圧縮版のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0圧縮パッケージのインストール方法、詳細は次のとおりです知らせ:オペレーティング シ...

MySQLとNavicatプレミアムのインストールと設定の詳細な手順

前提条件: Mac、zsh がインストールされ、bash のときに mysql がダウンロードされ、...

IDEA の Docker プラグインを介して Springboot プロジェクトを公開する方法の詳細なチュートリアル

1. Dockerfileを書く(1)プロジェクト名を右クリックして新しいテキストファイルを作成し、...

MySQL SELECT実行順序の簡単な理解

SELECT ステートメントの完全な構文は次のとおりです。 (7)選択 (8) DISTINCT ...

データベースの削除から逃走までの MySQL の徹底分析_上級編 (I) - データ整合性

1. データ整合性の概要1. データ整合性の概要データの冗長性とは、データベース内に重複したデータが...

MySQL 権限制御の詳細な説明

目次mysql 権限制御権限システムテーブル変更後にMySQLの権限を有効にする方法権限の付与と取り...