มีวิธีใดที่จะทำให้APTติดตั้งแพ็คเกจไปที่โฮมไดเร็กตอรี่ของฉัน?
ฉันไม่ต้องการเปลี่ยนแปลงระบบให้กว้าง
อีกวิธีหนึ่งมีผู้จัดการแพคเกจลินุกซ์ไดเรกทอรีบ้าน?
มีวิธีใดที่จะทำให้APTติดตั้งแพ็คเกจไปที่โฮมไดเร็กตอรี่ของฉัน?
ฉันไม่ต้องการเปลี่ยนแปลงระบบให้กว้าง
อีกวิธีหนึ่งมีผู้จัดการแพคเกจลินุกซ์ไดเรกทอรีบ้าน?
คำตอบ:
Dpkg ไม่มีคุณสมบัติ - ย้ายที่ RPM มี ควรพิจารณาว่าแพ็คเกจ RPM จำนวนเท่าใดที่สนับสนุนคุณสมบัตินั้น โดยทั่วไปไม่สามารถทำได้
สิ่งที่คุณสามารถทำได้คือใช้ chroot หากคุณต้องการทดสอบบางอย่างก่อนที่จะติดตั้งแบบโกลบอลบนระบบ ในการทำเช่นนี้คุณต้องสามารถเข้าถึงรูทได้ สิ่งแรกที่ต้องทำคือการสร้าง chroot ขั้นพื้นฐาน:
# debootstrap lenny lenny-chroot
สิ่งนี้จะสร้าง Lenny chroot ภายในlenny-chroot
ไดเรกทอรี
ตอนนี้เราสามารถป้อน chroot:
# chroot lenny-chroot
ตอนนี้เราสามารถทำสิ่งที่เราต้องการและติดตั้งทุกอย่างโดยไม่ทำให้ส่วนที่เหลือของระบบยุ่ง เมื่อเสร็จแล้วให้พิมพ์ exit หรือกด ctrl-D
Linuxbrewเป็นตัวจัดการแพ็กเกจอื่นที่ไม่ใช่รูทสำหรับ Linux (ขึ้นอยู่กับระบบการจัดการแพ็กเกจ Homebrew ยอดนิยมสำหรับ OS X) ที่รวบรวมจากแหล่งที่มาและเก็บไบนารีไว้ในโฮมไดเร็กตอรี่ของคุณ
อ้างถึงเอกสารคุณสมบัติ Linuxbrew คือ:
คำนำหน้าของ Gentoo ทำสิ่งที่คุณต้องการอย่างแน่นอน
มันจะติดตั้งแพคเกจทั้งหมดลงในไดเรกทอรีที่ระบุ ไม่จำเป็นต้องเข้าถึงรูท หากคุณต้องการกำจัดมันเพียงลบไดเรกทอรีฐาน
PS: สิ่งนี้ไม่ทำงานบน Ubuntu> = 11.04 หรืออนุพันธ์ Debian อื่น ๆ ที่มี Multiarch
เช่นเดียวกับการเพิ่มตัวเลือกเล็กน้อยในการรวบรวมมันมีตัวเลือกครึ่งทางในการรวบรวมเป็นแพ็คเกจที่มีตัวเลือกคำนำหน้าที่แตกต่างกันในเวลารวบรวม (ด้วย "checkinstall" หรืออาจเป็นวิธีอื่น) ข้อได้เปรียบคือแพคเกจจะปรากฏในผู้จัดการแพคเกจเช่นความถนัดหรือ synaptic
นอกจากนี้ฉันคิดว่ามันอาจเป็นไปได้ในบางกรณีที่จะดาวน์โหลด. deb จริงและบังคับใช้คำนำหน้าที่แตกต่างกันผ่านการติดตั้ง dpkg แต่ฉันคิดว่ามันไม่ใช่สิ่งที่สามารถทำได้ด้วยแพ็คเกจแบบสุ่มใด ๆ แต่พวกเขาก็ต้องรวบรวม ตัวแปรบางตัวสำหรับที่ตั้งของพวกเขา (แทนที่จะเป็นคำนำหน้าอย่างชัดเจนตามตัวอักษร) ที่คุณจะส่งออกก่อนติดตั้ง ฉันไม่รู้อะไรเกี่ยวกับกระบวนการแม้ว่า google สำหรับ "คำนำหน้า dpkg instdir"
คุณสามารถใช้fakechroot - ดูตัวอย่างในเว็บไซต์ของพวกเขา
Rootless GoboLinux สามารถทำสิ่งที่คุณต้องการได้อย่างแน่นอน: ตัวจัดการแพคเกจที่ไม่มีสิทธิ์สูงในโฮมไดเร็กตอรี่ของคุณเอง หวังว่าคุณคงรู้ว่ากำลังทำอะไรอยู่ รูตไม่ได้เป็นโหมดการติดตั้งที่บำรุงรักษาอย่างดีที่สุดของ Gobo และเมื่อฉันเคยใช้เมื่อไม่กี่ปีที่ผ่านมาต้องใช้การปรับแต่งเล็กน้อยเนื่องจากสคริปต์การติดตั้งค่อนข้างล้าสมัยเมื่อเทียบกับการเปลี่ยนแปลง Gobo อื่น ๆ
นอกจากนี้ยังมี klik ที่ repackages ค่อนข้างน้อย.deb
สามารถติดตั้งแพ็คเกจไปยังโฮมไดเร็กตอรี่ของคุณและไม่ต้องใช้สิทธิ์รูทในการใช้งาน ... แต่การตั้งค่าเริ่มต้นจำเป็นต้องใช้รูท
ฉันมักจะได้รับแหล่งที่มาและตรวจสอบไฟล์เช่น "ติดตั้ง" ./configure --prefix=somedir
มักจะมีคำแนะนำในการทำ จากนั้นคุณต้องเพิ่มsomedir/bin
เส้นทางของคุณ
ไม่ฉันไม่คิดว่าคุณจะทำได้
สิ่งที่ดีที่สุดที่ฉันคิดได้ในตอนนี้คือการใช้apt-get source
และรวบรวมแพ็คเกจของคุณ บางทีคุณอาจปรับแต่งขั้นตอน (ซึ่งอาจเป็นอัตโนมัติมากกว่าหรือน้อยกว่า) ในการติดตั้งแพ็คเกจในบ้านของคุณ
อีกหนึ่งคือการใช้dpkg -X
เพื่อแยกมันในไดเรกทอรีที่คุณเลือก
มีบางกรณีที่คุณจะต้องติดตั้งแพ็คเกจลงในโฟลเดอร์บ้านของคุณ
อย่างไรก็ตามคุณสามารถรวบรวมและติดตั้งซอฟต์แวร์ลงในเครื่องของคุณ เพียงเปิดเครื่องรูดแล้วกำหนดค่าด้วย./configure --prefix=$HOME/local
หรือไดเรกทอรีอื่น คุณสามารถmake
และmake install
ตามปกติ สิ่งนี้จะรวบรวมและติดตั้งโปรแกรม~/local/
นั้นเช่นโปรแกรมที่คุณดำเนินการจะอยู่ใน~/local/bin/programmname
นั้น
จากประสบการณ์ของฉันเองไม่มีวิธีง่ายๆในการใช้แพ็คเกจ DEB ที่มีอยู่เพื่อติดตั้งในไดเรกทอรีอื่นที่ไม่ใช่สภาพแวดล้อมchroot เครื่องมือติดตั้ง Debian / Ubuntu dpkg / aptitude / dselectทั้งหมดต้องการสิทธิ์รูทเพื่อให้ทำงานได้อย่างถูกต้อง
ตอนนี้ให้แหล่ง DEB คุณสามารถแก้ไขไฟล์ Debian / rules เพื่อให้แพ็คเกจสร้างและติดตั้งลงในแผนผังไดเรกทอรีที่แตกต่างกัน แต่จากนั้นคุณไม่ได้ใช้แพ็คเกจไบนารีที่มีอยู่แล้ว
ตามที่คนอื่นพูดถึงคุณสามารถใช้debootstrapและสร้างสภาพแวดล้อม chroot ได้อย่างง่ายดายซึ่งที่ผ่านมาฉันมีสภาพแวดล้อมแบบ 32 บิตบนโฮสต์ 64 บิต แต่สิ่งนี้ต้องติดตั้ง chroot อย่างน้อยที่สุดก็ทำซ้ำแพ็คเกจพื้นฐาน หากคุณมีพื้นที่ว่างและนี่เป็นโซลูชันที่ใช้งานได้คุณสามารถจับคู่กับdchroot
หรือดีกว่าschroot
เพื่อให้สามารถดำเนินการแอปพลิเคชันที่ติดตั้งภายในสภาพแวดล้อม chroot ได้อย่างง่ายดาย
ฉันมีปัญหาในการจินตนาการว่ามันจะทำงานอย่างไรกับที่เก็บอย่างเป็นทางการจากการกระจาย ควรแก้ไขการพึ่งพาได้อย่างไร จากระบบหรือจากโฮมไดเร็กตอรี่ของคุณ? จะทำอย่างไรถ้าพบว่ามีเวอร์ชั่นต่างกันทั้งคู่
สิ่งที่ดีที่สุดที่ฉันนึกได้ก็คือสภาพแวดล้อมแบบ chroot เช่นที่ผู้คนทำกับแอพพลิเคชั่น 32- บิตบนระบบ 64- บิต มันมีค่าใช้จ่ายมากกว่าที่คุณจะเรียก debootstrap ใน chroot แต่ด้วยsymlinking , shell wrapper script สนุกสนานมันอาจทำในสิ่งที่คุณต้องการ
ฉันยังคงทำงานกับปัญหาอยู่ แต่โดยปกติแล้ว debootstrap สิ่งที่คุณต้องการและควรทำงานกับ fakeroot debootstrap เป็นเพียงเชลล์สคริปต์จำนวนหนึ่งดังนั้นฉันจึงดึงมันออกจากกันเพื่อดูว่าอะไรทำให้เห็บ ส่วนที่ยากจะอยู่ในการถอนการติดตั้งไฟล์เมื่อติดตั้งแล้ว
น่าเสียดายที่ฉันไม่เคยได้ยินเรื่อง distro ใด ๆ ที่นำเสนอสิ่งนี้ (แม้ว่าฉันจะแน่ใจว่ามันจะได้รับความนิยมสูงสุด) คุณอาจเลียนแบบ distro ที่ใช้ rpm แต่ ... ฉันยังไม่ได้ลอง แต่คุณสามารถสร้างฐานข้อมูล rpm สำหรับผู้ใช้แล้วติดตั้ง rpm ในฐานข้อมูลผู้ใช้
ลองตั้งค่า distro ใหม่ตามผู้ใช้ด้วย:
rpm --initdb --dbpath DIRECTORY
จากนั้นมีหลายตัวเลือกที่อาจช่วย:
--prefix
--relocate
ฉันมีวิธีแก้ไขปัญหาฉันใช้ติดตั้งชุดซอฟต์แวร์ความร่วมมือขนาดใหญ่บนเซิร์ฟเวอร์ Debian ของโรงเรียนได้สำเร็จซึ่งฉันไม่สามารถเข้าถึงรูทได้เลย มันไม่ได้ใช้deboostrap
หรือผู้จัดการแพ็คเกจใด ๆ
วิธีนี้เป็นคู่มือบางส่วน แต่ฉันพยายามทำให้ดีที่สุดเพื่อความสะดวก
มันใช้สคริปต์นี้ฉันได้เรียกinstall
(อย่าลืมchmod +x
มัน):
#!/bin/bash
# PREFIX is the installation root, i.e. a directory you have write access to
PREFIX=$HOME
# unpack the archive to $PREFIX
ar p "$1" data.tar.xz | tar xJ -C $PREFIX
# go through all unpacked text files and search for occurences of /usr/...
# we're gonna replace some of them with $PREFIX/usr
files=$(dpkg --contents $1 | grep '^-' | awk '{print $6}' | sed 's/^..//' | sort | uniq)
for f in $files; do
file="${PREFIX}${f}"
if grep -Iq . "$file"; then
if grep -q '/usr' "$file"; then
# interactively ask for each occurence, if it should be replaced
vim -c '%s#/usr#'$PREFIX'/usr#gc' -c 'wq' "$file"
fi
else
echo "Leaving binary file $file unmodified"
fi
done
ดังนั้นมักจะครั้งแรกที่ผมดาวน์โหลดไฟล์ deb apt-get download package_name
ใช้ จากนั้นฉันเรียกใช้./install package_name_blabla.deb
และตัดสินใจด้วยตนเองเกี่ยวกับการเกิดขึ้นของแต่ละ/usr
ไฟล์ในไฟล์ที่ไม่ได้แพคถ้ามันควรถูกแทนที่ด้วย$PREFIX/usr
หรือไม่
การตัดสินใจนี้ขึ้นอยู่กับแพคเกจที่ติดตั้งระบบและติดตั้งโดยใช้วิธีนี้ โดยปกติแล้วเช่นไฟล์ pkg-config จำเป็นต้องมีการทดแทนนี้ในขณะที่เส้น shebang #!/usr/bin/perl
ไม่ชอบ กฏทั่วไปของหัวแม่มือคือพา ธ ผลลัพธ์ควรชี้ไปยังไฟล์ที่มีอยู่
เมื่อติดตั้งแพคเกจด้วยวิธีนี้คุณจะต้องบอกโปรแกรมอื่น ๆ นี้สามารถทำได้โดยการผนวกค่าที่ถูกต้องเพื่อLD_LIBRARY_PATH
, PATH
, PYTHONPATH
, PKG_CONFIG_PATH
, CMAKE_MODULES_PATH
, CMAKE_PREFIX_PATH
ฯลฯ
มีข้อแม้ในวิธีนี้คือการพึ่งพาไม่ได้ดาวน์โหลด / ติดตั้งโดยอัตโนมัติ; คุณต้องติดตามด้วยตนเอง
นอกจากนี้ APT ยังไม่รู้แน่ชัดเกี่ยวกับแพ็คเกจเหล่านี้ดังนั้นมันจะแสดงให้พวกเขาเห็นว่าหายไปตลอดกาล แต่นั่นสมเหตุสมผล - ใครต้องการติดตั้งแอพทั้งระบบขึ้นอยู่กับการติดตั้งของผู้ใช้
หากคุณต้องการที่จะถอนการติดตั้งโปรแกรมที่คุณสามารถแสดงรายการเนื้อหาของ deb เก็บถาวรที่ใช้แล้วลบไฟล์เหล่านี้ทั้งหมดออกจากar p "$1" data.tar.xz | tar tJ
PREFIX