it-mot-dan-vi.com

Yum: Làm cách nào tôi có thể xem các biến như $ releasever, $ basearch & $ YUM0?

Tôi đang thiết lập một kho lưu trữ yum và cần gỡ lỗi một số URL trong tệp yum.conf. Tôi cần biết lý do tại sao Khoa học Linux cố lấy URL này, khi tôi đang mong đợi nó lấy URL khác:

# yum install package 
http://192.168.1.100/pub/scientific/6.1/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: sl. Please verify its path and try again

yum.conf (5) manpage cung cấp một số thông tin về các biến này:

Biến

Có một số biến bạn có thể sử dụng để dễ dàng bảo trì các tệp cấu hình của yum. Chúng có sẵn trong các giá trị của một số tùy chọn bao gồm tên, cơ sở và lệnh.

$ releasever Điều này sẽ được thay thế bằng giá trị của phiên bản của gói được liệt kê trong distroverpkg. Điều này mặc định là phiên bản của gói 'phát hành lại'.

$ Arch Điều này sẽ được thay thế bằng kiến ​​trúc của bạn như được liệt kê bởi os.uname () [4] trong Python.

$ basearch Điều này sẽ được thay thế bằng kiến ​​trúc cơ sở của bạn trong yum. Ví dụ: nếu $ Arch của bạn là i686, thì $ basearch của bạn sẽ là i386.

$ YUM0- $ YUM9 Chúng sẽ được thay thế bằng giá trị của biến môi trường Shell cùng tên. Nếu biến môi trường Shell không tồn tại thì biến tệp cấu hình sẽ không được thay thế.

Có cách nào để xem các biến này bằng cách sử dụng tiện ích dòng lệnh yum không? Tôi không muốn tìm kiếm phiên bản của gói 'phát hành lại' hoặc nhận thủ công giá trị của os.uname () [4] trong Python.

62
Stefan Lasiewski

Nếu bạn cài đặt yum-utils, Điều đó sẽ cung cấp cho bạn yum-debug-dump Sẽ ghi các biến đó và thêm thông tin gỡ lỗi vào một tệp. Không có tùy chọn để ghi vào thiết bị xuất chuẩn, nó sẽ luôn ghi vào một số tệp thực sự không hữu ích.

Đây rõ ràng không phải là một giải pháp tuyệt vời, vì vậy đây là a python one-liner bạn có thể sao chép và dán sẽ in các biến đó ra thiết bị xuất chuẩn.

python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'

Điều này hoạt động trên CentOS 5 và 6, nhưng không phải 4. yum được viết bằng python, vì vậy mô đun yum python đã có trên máy chủ của bạn, không cần cài đặt bất cứ thứ gì exra.

Đây là giao diện của CentOS 5:

[[email protected]]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
{'Arch': 'ia32e',
 'basearch': 'x86_64',
 'releasever': '5',
 'yum0': '200',
 'yum5': 'foo'}
[[email protected]]# 
80
Mark McKinstry

Chỉ trong trường hợp bất kỳ ai kết thúc ở đây, như tôi, tìm kiếm câu trả lời tương đương cho dnf trên Fedora, tôi đã hiểu được những điều sau đây python one-liner:

python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'

Trên Fedora 24, nó trông như thế này:

{'Arch': 'x86_64',
 'basearch': 'x86_64',
 'releasever': '24'}
14
sysadmiral

Để có được tất cả chúng, bạn sẽ cần sử dụng mã như mmckinst đã đăng , nhưng nếu bạn chỉ muốn kiểm tra $releasever bạn có thể chạy yum version nogroups trên RHEL-6.

Một điều khác cần làm, trong RHEL-6, là chỉ tạo riêng của bạn trong /etc/yum/vars.

11
James Antill

Và đi sâu vào cách $ phát hành được chỉ định:

function _getsysver truy vấn cơ sở dữ liệu vòng/phút như:

rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3

Giá trị "phát hành hệ thống (phát hành)" được xác định tại đây và có thể được ghi đè bằng distroverpkg trong yum.conf

Nếu truy vấn không trả về bất kỳ giá trị nào, trình phát hành được đặt thành '$ releasever' (ví dụ: nếu bạn đặt distroverpkg = centos-release nhưng đã cài đặt máy chủ redhat-phát hành-máy chủ)

4
adrianlzt

Lấy giá trị cho $Arch Thực sự đơn giản như Arch="$(Arch)" hoặc Arch="$(uname --machine)" nhưng nếu bạn thực sự muốn biết giá trị của yum cho $Arch Là, hãy thử:

bash-4.2# Arch="$(python -c 'from rpmUtils import Arch; print(Arch.getCanonArch());')";
bash-4.2# declare -p Arch
declare -- Arch="ia32e"

Lấy các giá trị cho các vars khác mà không cần sử dụng Python thì dễ dàng hơn một chút.

Lựa chọn 1:

bash-4.2# distroverpkg="$(awk --field-separator \= '/distroverpkg/{print$2}' /etc/yum.conf)";
bash-4.2# releasever="$(rpm --query --queryformat '%{VERSION}\n' "${distroverpkg:-redhat-release}")";
bash-4.2# basearch="${HOSTTYPE:-$(uname --machine)}";
bash-4.2# declare -p distroverpkg releasever basearch
declare -- distroverpkg="centos-release"
declare -- releasever="7"
declare -- basearch="x86_64"

Lựa chọn 2:

bash-4.2# releasever="$(rpm --query --file --queryformat '%{VERSION}\n' /etc/system-release)";
bash-4.2# basearch="$(rpm --query --queryformat '%{Arch}\n' "kernel-$(uname --kernel-release)")";
bash-4.2# declare -p releasever basearch
declare -- releasever="7"
declare -- basearch="x86_64"

Lưu ý: Các lệnh được hiển thị bằng long-opts (Nếu có) để rõ ràng.

0
bfs

Một cách khác để xem kết quả của sự thay thế là làm một cái gì đó như thế này:

yum-config-manager -c /etc/reposyncb.conf  | grep -i spacewalk

Tôi đã mày mò với các biến yum để kiểm soát máy khách spacewalk nào được chọn để xây dựng một repo cục bộ và thấy điều này hữu ích để xem các biến được diễn giải như thế nào.

0
Robert B.