Gentoo 历程(7):压缩portage树,并放到/var

原创 2012年03月25日 20:18:50

    当初装gentoo的时候以为gentoo和arch一样,把软件包的各种信息和缓存都放到/var,就给/分了10g,/var分了6g,后来用着才发现,gentoo的portage在/usr/portage下,下载的包也在/usr/portage下,结果用了不长时间/就满了,各种悲催……上linuxsir问了问老鸟,有人提议清理缓存,有人提议用squashfs把portage压缩,那时正好比较忙,没时间折腾,就采用了清理缓存这个办法,直到前几天,/又满了,看来portage这个东西必须得处理下了,linuxsir上那位前辈给提供了几个链接,从这样做的原理到做法都有,帖子地址在这里,不过不知道论坛升级后这地址还能不能正常看。

    具体原因我这里就不说了,那帖子里说的很明白,只说说我折腾的具体过程。

    官方wiki在这里

    首先,当然是看官方wiki,不过由于我升级到一半/满了,导致无法进系统,懒得先修它,就用arch chroot了。

    第一步,按照wiki里的说法,先安装squashfs-tools和aufs3(2.x的内核装aufs2),其中aufs3要修改use,执行:

echo sys-fs/squashfs-tools kernel-patch >> /etc/portage/package.use

然后再emerge安装aufs3,装完aufs3按提示重新编译内核,编译内核的时候要保证下面的这些被选中:

Device Drivers --->
  Block Devices --->
    <M> Loopback device support
File systems --->
  Miscellaneous Filesystems --->
    <M> SquashFS

上面是wiki推荐的,我不喜欢把这种每次都要用的东西编译成模块,所以直接编译进了内核。

    第二步,修改几个配置文件,挪几个文件夹,具体如下:

1.创建/var/portage文件夹

2.将/usr/portage/distfiles文件夹挪到/var/portage/

3.将/var/lib/layman文件夹挪到/var/portage/(这个我觉得我用不太着,不过官方wiki这么说我就这么做吧,以前有过一次乱搞portage出错的经历,不这么做说不准会出啥问题)

4./etc/make.conf文件:

DISTDIR="/var/portage/distfiles"

source /var/portage/layman/make.conf

5./var/portage/layman/make.conf文件:

将所有/var/lib/xxx改成/var/portage/xxx


    完成上述步骤后,准备工作就算完成了,下面是生成sqfs,并将这个压缩的portage tree 用起来


    第一步,添加/etc/init.d/squash_portage ,这个文件的内容如下:

#!/sbin/runscript
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
#
# /etc/init.d/squash_portage allows efficient compression of
# Gentoo portage arborescence
#
# It requires support for the loop device and squashfs enabled in the kernel,
# module autoloading is also *highly* recommended.
# sys-fs/squashfs and sys-fs/aufs are necessary for read-write support.
#
# Author: Mathias Laurin <mathias_laurin@users.sourceforge.net>
# 2006-11-28, v.0.1.5(4)
# 2009-02-24, v.0.1.6(1) Weedy <weedy2887@gmail.com>
# 2009-03-20, v.0.1.7(1) j0inty <j0inty@stollfuss.net>
# 2009-07-10, v.0.1.8(1) j0inty
# 2009-09-01. v.0.1.9(1) nall <soir@fuzzysock.net>

extra_started_commands="sync"

source /etc/make.globals
source /etc/make.conf
SQFS_CUR="$SQFS_DIRNAME/portage.sqfs"
SQFS_NEW="$SQFS_DIRNAME/portage-current.sqfs"
SQFS_OLD="$SQFS_DIRNAME/portage-old.sqfs"
DEF_RW="/dev/shm/.portage-rw"
SQFS_OPTS="-force-uid portage -force-gid portage -no-duplicates"

depend() {
	need localmount modules
}


check_support() {
	if ! [ -x /usr/bin/mksquashfs ] ; then
		eerror "ERROR: sys-fs/squashfs-tools is not installed."
		return 1
	fi
	if ! [ -w /dev/loop0 ] ; then
		eerror "ERROR: loopback support is not available."
		return 1
	fi
	if ! [[ $(grep -s $'\taufs$' /proc/filesystems) ]] ; then
		eerror "ERROR: aufs filesystem support is not available."
		return 1
	fi
	if ! [[ $(grep -s $'\tsquashfs$' /proc/filesystems) ]] ; then
		eerror "ERROR: squashfs filesystem support is not available."
		return 1
	fi
	return 0
}

makeImage() {
	mksquashfs $PORTDIR $SQFS_NEW $SQFS_OPTS # 2>/dev/null
	retval=$?
	ln -sf $SQFS_NEW $SQFS_CUR
 	eend $retval
}

sync() {
	ebegin "Syncing portage tree"
	eval $SYNC_CMDS
 	#svc_stop; svc_start
	stop
	start
	eend 0
}

start() {
	check_support || return 1
	if [ -f "$SQFS_CUR" ]; then
		ebegin "SQFS-PORTAGE: Mounting read-only squashfs image"
		mount -rt squashfs -o loop,nodev,noexec $SQFS_CUR $PORTDIR
		retval=$?
		[ $retval -ne 0 ] && return $retval
	else
		if [ ! -f "/usr/portage/metadata/timestamp.chk" ]; then
			ebegin "SQFS-PORTAGE: $PORTDIR looks empty or corrupted, syncing"
			eval $SYNC_CMDS
		fi
		einfo "  $SQFS_CUR does not exist, creating"
		mkdir -p $SQFS_DIRNAME
		makeImage
		[ $? -ne 0 ] && eerror "ERROR: failed to create initial tree image"
		einfo "Clearing ${PORTDIR}"
		rm -r ${PORTDIR}
		mkdir ${PORTDIR}
		start
		eend 0
	fi

	ebegin "Mounting read-write with aufs"
	if [ ! $PORTAGE_RW ] ; then
		einfo "  mounted in tmpfs (RAM)"
		PORTAGE_RW="${DEF_RW}"
	fi
	[ -d $PORTAGE_RW ] || mkdir -p $PORTAGE_RW
	chmod 0750 $PORTAGE_RW
	chown portage:portage $PORTAGE_RW
	mount -t aufs -o nodev,noexec,br=$PORTAGE_RW=rw:$PORTDIR=ro aufs $PORTDIR
	eend $?

	if [ "$DISTDIR" == "/usr/portage/distfiles" ]; then
		mkdir -p /usr/local/distfiles 
		mount -o bind /usr/local/distfiles /usr/portage/distfiles
		ewarn "DISTDIR is currently inside the portage tree. It has been bind 
		mounted to keep the SquashFS image small."
	fi
}

stop() {
	ebegin "SQFS-PORTAGE: Stopping and unmounting"
	[ ! $PORTAGE_RW ] && PORTAGE_RW="${DEF_RW}"
	if [ $(du -s --exclude=.w* $PORTAGE_RW | cut -f 1) -gt 4 ]; then
		einfo "  Changes detected, updating image."
		mv -f $SQFS_NEW $SQFS_OLD
		makeImage
		rm -f $SQFS_OLD
	else
		einfo "  No changes detected, skipping update."
		eend 0
	fi

	if [ "$DISTDIR" == "/usr/portage/distfiles" ]; then
		einfo "  Unmounting distfiles"
		umount /usr/local/distfiles
	fi;

	einfo "  Unmounting the tree"
	umount -t aufs  $PORTDIR
	umount -t squashfs $PORTDIR
	rm -rf $PORTAGE_RW
	eend 0
}
使之可执行:

#chmod 755 /etc/init.d/squashfs_portage

将其添加到default runlevel:

#rc-update add squash_portage default

    第二步,添加文件/etc/conf.d/squash_portage:

# /etc/conf.d/squash_portage

# SQFS_DIRNAME points to the directory that will contain the sqfs
# images, recommended value is /var/portage
SQFS_DIRNAME="/var/portage"

# Leave PORTAGE_RW empty for use with tmpfs, a ram-based filesystem,
# This is recommended unless you are short of RAM
PORTAGE_RW=""

# If you need more then just emerge --sync, or are using another
# package manager add them here. Example SYNC_CMDS="/usr/bin/layman -S; /usr/bin/eix-sync"
SYNC_CMDS="emerge --sync"

    第三步(不是每人都用):我用的是openrc,所以还要修改一下/etc/config.d/modules:在modules="nvidia vboxdrv ..."里加上aufs。

   

    这样重新启动应该就好了(为啥说应该呢?因为我第一次启动前忘了第三步,所以我的squash_portage启动失败了,sqfs文件是启动后自己手动生成的),第一次启动需要生成一个portage.sqfs文件,我的这个文件有2.2G,这文件大小是因人而异的,所以生成速度也不一样,据说有人的只有几十M……

sync的时候执行/etc/init.d/squash_portage sync,其它的按原来的习惯正常使用就成。

相关文章推荐

Linux下(软件)标准编译安装原理

1、为什么要编译安装   包管理系统是绝大多数发行版的必备组件,也是一个发行版区别于其它发行版的主要特征。但是有些软件,并不能通过包管理系统安装,这就需要下载源码编译安装。   一个软件可能有许多...

/bin/bash: java: command not found 问题解决

/bin/bash: java: command not found 问题解决    在编译android环境时,java -version 命令明明能够正确表示java已经安装成功,...

Ceph RBD mirror数据异步备份的具体实践

本文以杉岩数据基于Ceph的RBD mirror上的具体实践为例,来谈谈软件定义存储的数据备份问题。...

Gentoo下portage包的管理

這篇主要是講如何使用Gentoo的portage system 先講什麼是system什麼是world 一般來講,你把stage3 tar開的東西就是system。 後來裝的軟體全部都是...
  • xiaotjx
  • xiaotjx
  • 2012年08月05日 13:50
  • 609

Portage入门 (gentoo怎样更新系统和安装软件时遇到冲突时怎么解决)

The big emerge (Note: quite a few people in the forums recommend against building the world due to...
  • junmuzi
  • junmuzi
  • 2013年05月18日 19:31
  • 6090

Gentoo 历程(3):配置slim自动登录、mlocate导致系统僵死、lxr配置

今天遇到的问题似乎有点多……        1.slim的自动登录:     本人一直是kde的fans,直到我的膝盖中了一箭我换到了gentoo……kde的编译受不了啊!以前登录图形界...
  • Emnkcn
  • Emnkcn
  • 2012年03月03日 03:44
  • 1410

Gentoo 历程(1)在xfce4图形界面中隐藏窗口边框:devilspie

OT :0.作为一个计算机系的学生,注册CSDN帐号是个很正常的事,但一直用来潜水看论坛以及下载东西,最近开始折腾gentoo,觉得有必要找地方记录一下学到的知识,想了想CSDN比较适合,于是有了这一...
  • Emnkcn
  • Emnkcn
  • 2012年03月01日 02:46
  • 1093

Gentoo 历程(6):休眠,以及修改logo

1.休眠     休眠可以让工作“断点续传”,对我来说是个必不可少的功能,最近几天经常在晚上emerge --avuDN world&&halt,或者emerge -e world&&halt,因此...
  • Emnkcn
  • Emnkcn
  • 2012年03月06日 06:23
  • 1009

Gentoo 历程(2)配置触摸板,低级错误导致“SynPS/2 Synaptics TouchPad: Synaptics driver unable to detect protoc”

我的xorg配置文件是用nvidia-xconfig自动生成的,本人比较喜欢用鼠标,为了防止触摸板干扰打字,所以一直禁用psmouse模块,今天鼠标没电了,想启动触摸板,没想到居然不能用……经过一番折...
  • Emnkcn
  • Emnkcn
  • 2012年03月01日 19:58
  • 1527

Gentoo 历程(4):搞定蓝牙耳机,暴力解决pulseaudio版本低的问题

本来装完系统后就装上了bluez和blueman,根据官方文档配置了内核和相关软件,用手机测试了下,收发文件都正常,就没再管,今天看电影想用蓝牙耳机,没想到居然连接不上,一连接就报错: Device...
  • Emnkcn
  • Emnkcn
  • 2012年03月03日 19:24
  • 1662
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gentoo 历程(7):压缩portage树,并放到/var
举报原因:
原因补充:

(最多只允许输入30个字)