OpenSUSE13.1でボックスを設定しています。私の理解を超えた理由で、ZypperはIPv6アドレスの使用を完全に主張し、IPv4の使用を拒否します。 IPv6はLAN上で機能しないため、これは問題です。
IPv6を複数の方法で無効にしてみました。
/etc/modprobe
を突っついたり突っ込んだりしてみました。ipv6.disable=1
を設定してみました。これらのことのどれもわずかな影響を及ぼしませんでした。 Zypperstillは、実際のIPアドレスの使用を拒否し、絶望的にIPv6を使用しようとし続けます。
ダウンロードサーバーに正常にpingできることに注意してください。 ping
コマンドはサーバーのIPv4アドレスを検索し、問題なくpingを実行します。それでも、ZypperはIPv6の使用を主張し、宛先に到達できないために諦めます。 (これは、IPv6経由です。)
この質問 で説明されている正確な問題が発生しています。 (失敗したIPv6アドレスも同じです。)その質問はOpenSUSEの古いリリースに対応しており、受け入れられた回答は、私がすでに試したIPv6を無効にすることを示しています。
私は今、いくつかのソフトウェアパッケージをインストールするという些細なタスクを実行しようとして、人生の何時間も無駄にしています。 誰かは、IPv6を完全に破壊してネットワークを再び機能させる方法を知っていますか?
カーネルの観点からは、IPv6をザッピングするために正しいことを行ったようですが、IPv6を気にしないと仮定して、/ etc/hosts内のIPv6エントリを削除することもできます。それでもうまくいかない場合(そしてこれが戻ってきている場合)、Amandaバックアップで問題が発生しました。これはあなたの問題と非常によく似ており、inetutils-inetdの代わりにxinetdをインストールすることによってのみ修正できました(注SuSEがデフォルトで何をインストールするのかわかりません)。最後に(そして必死の手段として)次のようなもので「strace」を使用することをお勧めします:strace -s 1024 -f -o /tmp/zypper.log/path/to/zypperexecutable次に、ログファイルを調べてそのIPv6を探しますアドレスを指定し、役立つ可能性のある有益な情報があるかどうかを確認します。 (参考までに、「strace」は巨大なファイルを生成する可能性があるため、失敗したらすぐにzypperを中止することをお勧めします。)
user995746
の提案に従って、strace
を実行してみました。これがそれが言わなければならないことです:
...
1179 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 5
1179 connect(5, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "2001:67c:2178:8::13", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
1179 close(5) = 0
1179 madvise(0x7ff48750c000, 8368128, MADV_DONTNEED) = 0
1179 _exit(0) = ?
1179 +++ exited with 0 +++
1177 <... poll resumed> ) = 0 (Timeout)
1177 socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5
1177 fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
1177 fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
1177 connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("195.135.221.134")}, 16) = -1 EINPROGRESS (Operation now in progress)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177 poll([{fd=5, events=POLLOUT}], 1, 1000) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
1177 --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
...
したがって、Zypperからのエラーメッセージに「2001:67c:2178:8 :: 13に接続できませんでした:ネットワークに到達できません」と明確に記載されているにもかかわらず、プログラムは実際にはそれを確認しているようです。 IPv6に到達できず、IPv4にフォールバックします。なぜIPv4経由で接続できないのかという疑問が残ります。これは、おそらくLANのファイアウォールの問題のようなものです。
要約すると、IPv6はまったく問題ではないようです。それは、Zypperからのエラーメッセージが非常に誤解を招くだけであるということです。
Download.opensuse.org(または使用したいd/lサーバー)を解決し、そのIPv4アドレスを.repoファイルにフィードすることで解決しました。私はsed(1)を使用して、そこにあるすべてのものを検索して置き換えました。魅力のように働いた。
確かに完璧ではありません。そして、動作中の(!)v4接続にフォールバックできないことは...恒星よりも少ないです。他のデュアルスタック対応アプリケーションは、ルーティングされないローカルv6ネットワークがある場合、たとえばdownload.opensuse.org
に完全にアクセスできる(そしてできる)ことを気にしないでください(ISP氏が一緒にプレイしないため、例)。
それまでは、(数値の)IPv4アドレスを使用してください。
注:zypperはlibcurlを使用しますが、$HOME/.curlrc
を尊重しません。多分それはグローバルなcurl設定ファイルまたは環境変数を尊重するでしょう。 curl
自体は、-4
/--ipv4
がipv4を強制することを望んでいます。
また、ipv6をサポートせずにlibcurl自体を再コンパイルし、ld.so.conf
などを介してそこにzypperポイントを設定すると、期待どおりに機能するはずです。