Yum: ฉันจะดูตัวแปรเช่น $ releasever, $ basearch & $ YUM0 ได้อย่างไร


49

ฉันกำลังตั้งค่าที่เก็บ yum และจำเป็นต้องดีบัก URL บางส่วนในไฟล์ yum.conf ฉันต้องรู้ว่าทำไมไซลินุกซ์ทางวิทยาศาสตร์พยายามที่จะคว้า URL นี้เมื่อฉันคาดหวังว่าจะคว้า URL อื่น:

# 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 ให้ข้อมูลบางอย่างเกี่ยวกับตัวแปรเหล่านี้:

ตัวแปร

มีตัวแปรหลายตัวที่คุณสามารถใช้เพื่อให้ง่ายต่อการบำรุงรักษาไฟล์กำหนดค่าของยำ พวกเขามีอยู่ในค่าของตัวเลือกต่างๆรวมถึงชื่อ baseurl และคำสั่ง

$ releasever นี้จะถูกแทนที่ด้วยค่าของรุ่นของแพคเกจที่ระบุไว้ใน distroverpkg ค่าเริ่มต้นนี้เป็นเวอร์ชันของแพ็คเกจ 'redhat-release'

$ arch จะถูกแทนที่ด้วยสถาปัตยกรรมของคุณตามที่ระบุไว้โดย os.uname () [4] ใน Python

$ basearch จะถูกแทนที่ด้วยสถาปัตยกรรมฐานของคุณใน yum ตัวอย่างเช่นหาก $ arch ของคุณคือ i686 $ basearch ของคุณจะเป็น i386

$ YUM0- $ YUM9 สิ่งเหล่านี้จะถูกแทนที่ด้วยค่าของตัวแปรสภาพแวดล้อมเชลล์ที่มีชื่อเดียวกัน หากตัวแปรสภาพแวดล้อมของเชลล์ไม่มีอยู่ตัวแปรไฟล์การกำหนดค่าจะไม่ถูกแทนที่

มีวิธีดูตัวแปรเหล่านี้โดยใช้yumยูทิลิตี commandline หรือไม่ ฉันไม่ต้องการตามรุ่นของแพ็คเกจ 'redhat-release' หรือรับค่า os.uname () [4] ใน Python ด้วยตนเอง


'ตามล่าหาเวอร์ชั่นของ redhat-release' นั้นเป็นเรื่องเล็กน้อย cat /etc/redhat-release ที่จริงแล้วใช้cat /etc/system-releaseแทนเนื่องจากจะเป็นการเชื่อมโยงไปยัง / etc / redhat-release, / etc / centos-release, / etc / oel-release, / etc / <ใด ๆ ที่ Linux ใช้ในทางวิทยาศาสตร์ตามความเหมาะสม
Xalorous

3
/etc/redhat-releaseไม่เหมือนกับ$releaseverตัวแปร คำถามที่นี่คือการคิดออกว่าอะไรคือการแทนที่ยำแทนตัวแปรเหล่านี้? เกิดอะไรขึ้นโดยทางโปรแกรม
Stefan Lasiewski

1
'ตามล่าเวอร์ชันของ redhat-release' ก็ไม่เหมือนกันกับ 'cat / etc / redhat-release' อดีตถามหารุ่นในขณะที่หลังดูไฟล์ที่ไม่น่าเชื่อถือและไม่แน่นอนอย่างสมบูรณ์ซึ่งไม่ควรเชื่อถือได้ rpm -qf /etc/issueเป็นวิธีการที่ยอมรับและจะได้รับวิธีการใน LSB ยกเว้น SuSE ไม่ขยับเขยื่อนในการประชุม FSStnd YARLY
user2066657

คำตอบ:


71

หากคุณติดตั้งyum-utilsสิ่งนี้จะให้สิ่งyum-debug-dumpที่คุณจะเขียนตัวแปรเหล่านั้นและข้อมูลการดีบักเพิ่มเติมไปยังไฟล์ ไม่มีตัวเลือกในการเขียนไปยัง stdout มันจะเขียนไปยังไฟล์บางไฟล์ซึ่งไม่เป็นประโยชน์จริง ๆ

เห็นได้ชัดว่าไม่ใช่วิธีการแก้ปัญหาที่ยอดเยี่ยมดังนั้นนี่คือ python one-liner ที่คุณสามารถคัดลอกและวางซึ่งจะพิมพ์ตัวแปรเหล่านั้นไปยัง stdout

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

สิ่งนี้ใช้ได้กับ CentOS 5 และ 6 แต่ไม่ใช่ 4 yum ถูกเขียนใน python ดังนั้นโมดูล yum python จึงอยู่ในเซิร์ฟเวอร์ของคุณแล้วไม่จำเป็นต้องติดตั้งอะไรเพิ่มเติม

นี่คือลักษณะของ CentOS 5:

[root@somebox]# 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'}
[root@somebox]# 

2
yum-debug-dumpดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ ดูเหมือนว่าข้อมูลอยู่ที่นั่นภายใต้%%%%YUM INFOส่วน ฉันไม่สามารถสร้างสิ่งที่$YUM0-$YUM9ดูเหมือนจะปรากฏขึ้น แต่ฉันไม่เคยใช้ตัวแปรเหล่านั้นเลย
Stefan Lasiewski

2
เพื่อรับการแสดงที่สะอาดของ$ releaseverใน bash shell ใช้สิ่งนี้:/usr/bin/python -c 'import yum;yb=yum.YumBase();yb.doConfigSetup(init_plugins=False);print yb.conf.yumvar["releasever"]'
Rockallite

ใช้งานได้กับ Python เวอร์ชันระบบเท่านั้น - คุณจะทำงานให้กับ Python เวอร์ชัน "alt-install" เพิ่มเติมได้อย่างไร
RCross

สิ่งที่คุณจะทำอย่างไรถ้า releasever เป็นจริง $ releasever สตริง ....
เดอะเลซี่ Coder

10

ในการรับทั้งหมดคุณจะต้องใช้รหัสเช่นmmckinst ที่โพสต์แต่ถ้าคุณต้องการตรวจสอบ$releaseverว่าคุณสามารถทำงานyum version nogroupsบน RHEL-6

สิ่งอื่น ๆ ที่จะทำใน RHEL-6, /etc/yum/varsเป็นเพียงการสร้างของคุณเองใน


คุณสามารถทำอย่างละเอียด? การสร้างอะไรที่จะทำให้/etc/yum/varsสำเร็จ นอกจากนี้คุณทราบหรือไม่ว่าสิ่งนี้เปลี่ยนจาก RHEL5 เป็น RHEL6 หรือไม่
Stefan Lasiewski

1
คุณควรจะเขียนโค้ดที่ใช้กับ RHEL-5 และ RHEL-6 ได้โดยไม่มีปัญหา คำสั่ง version ไม่ได้อยู่ใน RHEL-5 atm สิ่งที่ฉันหมายถึงเกี่ยวกับ / etc / yum / vars (RHEL-6 เท่านั้น) คือคุณสามารถสร้าง / etc / yum / vars / foorelease ... ซึ่งมีข้อมูลรีลีสของคุณเองหรือแม้แต่แทนที่ระบบปล่อย โดยเขียนถึง / etc / yum / vars / releasever
James Antill

ข้อมูลเพิ่มเติมเกี่ยวกับ/etc/yum/varsสามารถพบได้ที่access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/
......

10

ในกรณีที่มีใครมาที่นี่เช่นฉันกำลังมองหาคำตอบที่เทียบเท่ากับ dnf บน Fedora ฉันเข้าใจ python one-liner ต่อไปนี้:

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

ใน Fedora 24 ดูเหมือนว่า:

{'arch': 'x86_64',
 'basearch': 'x86_64',
 'releasever': '24'}

1
yum variables repo namesพบจากการค้นหา นี่เป็นการตอบคำถามในตอนนี้ด้วยการแทนที่ yum ด้วย dnf การทำงานที่ดี!
bgStack15

4

และเจาะลึกถึงวิธีการกำหนด $ releasever:

ฟังก์ชั่น _getsysverสืบค้นฐานข้อมูลรอบต่อนาทีเช่น:

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

ค่า "system-release (releasever)" ถูกกำหนดไว้ที่นี่และสามารถแทนที่ได้โดยdistroverpkgใน yum.conf

หากเคียวรีไม่ส่งคืนค่าใด ๆ Releasever จะถูกตั้งค่าเป็น '$ releasever' (ตัวอย่างเช่นหากคุณตั้งdistroverpkg = centos-releaseแต่ติดตั้ง rpm redhat-release-server)


0

อีกวิธีในการดูผลลัพธ์ของการแทนที่ตัวแปรคือทำสิ่งนี้:

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

ฉันกำลังแก้ไขตัวแปร yum เพื่อควบคุมไคลเอนต์ spacewalk ที่ถูกเลือกสำหรับการสร้าง repo ในพื้นที่และพบว่าสิ่งนี้มีประโยชน์เพื่อดูว่าตัวแปรตีความอย่างไร


เย็น releaseverแต่วิธีนี้ดูเหมือนจะไม่ให้ตัวแปรเช่น
Stefan Lasiewski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.