doooom 发表于 2002-12-24 14:33:29

安装疯狂优化的LFS

(原文发于linxsir,lfs+gentoo版,by tram)

环境:
redhat 8
KDE 3
konsole
GCC-3.2-7

说点闲话:安装LFS的时候一边听歌一边装是最好的选择,在编译的时候,可以做一下记录,或者看一下软件包的说明,很有意思的。当然如果你不想,那就再准备一张体坛周报。要听歌,不能用XMMS,太耗资源。我用的是mp3blaster,呵呵,不错!

优化参数:
CC='gcc -s'
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays"
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays"
你的CPU可能和我的不同,在这里可以找到详细的优化参数:http://www.freehackers.org/gentoo/gccflags/flag_gcc3opt.html
对设置优化参数的解释:在bash做为登陆进程时,是读/etc/profile(如果有的话)。在这之后,按顺序找~/.bash_profile,~/.bash_login, 和 ~/.profile文件,找到了就执行相关的操作。如果不是登陆进程(比如新开了一个konsole),它就找~/.bashrc,所以你要在相关的文件里设置参数。我习惯在/etc/profile里设置,所以在打开了一个konsole后,我要用source /etc/profile来找回一些没有读到的设置。当你用su命令成为root后,有些路径可能也没有,也用这个命令可以找到。
在/etc/profile里面加入:
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays"
CXXFLAGS="${CFLAGS}"
CC='gcc -s'
export CHOST CFLAGS CXXFLAGS CC


在/root/.bashrc中加入export LFS=/mnt/lfs
source /etc/profile

下面是创建文件系统,我已经有一个3G大的分区了,是上次装LFS分的。
fdisk -l /dev/hdc
umount /dev/hdc4
mkreiserfs /dev/hdc4
mount /dev/hdc4 $LFS

下面确认一下:
# echo $LFS
/mnt/lfs

mkdir $LFS/static
mkdir $LFS/static/src

把包拷贝过去:
cp doc/lfs-packages-cvs-20021023-1707.tar $LFS/static/src

增加用户:
useradd -s /bin/bash -m lfs &&
passwd lfs

chown -R lfs $LFS/static

su - lfs

bash_profile
cat > ~lfs/.bash_profile << "EOF"
umask 022

LFS=/mnt/lfs
LC_ALL=POSIX
CC='gcc -s'
export LFS LC_ALL CC
EOF
source ~/.bash_profile

在安装bash时:
cd /usr/lib
ls | grep libcurses
ls | grep libncurses
都有。


安装binutils:
unset CFLAGS
unset CXXFLAGS
安装好后:
source /etc/profile


安装 Fileutils-4.1
没有用patch,安装后,测试:
$LFS/static/bin/ls
正常

安装 GCC-3.2
unset CFLAGS
unset CXXFLAGS
安装后:
source /etc/profile

安装 Util-linux-2.11w
出了问题,不能编译。unset环境变量CFLAGS和CXXFLAGS后,就好了。

第六章
在这里设置优化参数:
chroot $LFS /static/bin/env -i \
HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/static/bin \
CC='gcc -s' \
CHOST="i686-pc-linux-gnu" \
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays" \
CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer -fforce-addr -falign-functions=4 -fprefetch-loop-arrays" \
/static/bin/bash --login

mount proc /proc -t proc

安装设备:
./MAKEDEV -v generic

安装 Glibc-2.2.5:
别忘了unset环境变量!安装好了以后,也不能设置,因为下一个包还是不能用优化。
安装完GCC-3.2后,可以再设置优化参数,我嫌麻烦,就退出chroot环境(退出前不要忘了umount /proc),然后再进入(也同样不要忘了mount proc),因为命令都是粘贴的,要方便很多。

安装Binutils-2.13
unset环境变量
安装完了以后,还是老办法,退出再进入。

安装 Net-tools-1.60
用缺省的设置

没有装bin86和lilo

安装 Util-linux-2.11w
出了问题,不能编译。unset环境变量CFLAGS和CXXFLAGS后,就好了。

一个小bug:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
没设置键盘

建/etc/fstab时,参数不一样了,见中文文档的第十章。

在编译内核时,又设置了优化参数,不过好像没什么用,它是用自己的参数编译的。颜色太难看了。
编译完内核后,就是设置grub了。我想用redhat的grub来引导系统,所以没有安装,直接把redhat下的两个文件拷贝过去了。
mkdir $LFS/boot/grub
cp /usr/share/grub/i386-pc/stage1 $LFS/boot/grub
cp /usr/share/grub/i386-pc/stage2 $LFS/boot/grub
然后在redhat中运行grub
grub
find /boot/grub/stage1
root (hd0,5)
setup (hd0)
quit
详细的可以看我写过的一篇文章,在中文文档的第十章里。
重启,进去了!
现在做最后的整理工作,看看空间,用了2.6G,我把/static/src和/usr/src里的文件都删了,只留下linux-2.4.19.tar.bz2,现在就只用了375M,如果减去/static的97M,那就只用了278M了。我为什么留着/static目录呢?因为一个/static可以编译很多的LFS,以后如果要再安装新版本的LFS,用旧的/static就行了,也就不用做第五章了。
然后再用strip,会出很多的错误,不管它,那是因为文件格式不认识,不会损坏你的系统的。现在更小了,才用了310-97=213M了!
OK,以后要装BLFS了。

pk 发表于 2002-12-31 21:47:31

我的机器是赛扬500,是gentoo 1.4rc1,也可类似的优化?

Kuye 发表于 2002-12-31 23:33:48

我的机器是赛扬500,是gentoo 1.4rc1,也可类似的优化?
Gentoo 的优化可比 LFS 简单多了,修改 /etc/make.conf 下的 CFLAGS/CXXFLAGS 参数就行。
具体看
http://www.freehackers.org/gentoo/gccflags/flag_gcc3.html

明天我也写篇《安装最优化的 Gentoo》 :mrgreen:
----------------------------------------------
我现在的 Gentoo 就是用最优化编译的,编译出来的程序反而比一般程序大了几十 K,感觉速度慢了不少。

tram 发表于 2003-1-1 01:40:33

呵呵,其实那上面的优化用的就是gentoo的参数,因为gentoo用的人多,所以测试得准一些,不太会出问题。

Anomymous 发表于 2003-1-1 12:13:37

我的机器是赛扬500,是gentoo 1.4rc1,也可类似的优化?
Gentoo 的优化可比 LFS 简单多了,修改 /etc/make.conf 下的 CFLAGS/CXXFLAGS 参数就行。
具体看
http://www.freehackers.org/gentoo/gccflags/flag_gcc3.html

明天我也写篇《安装最优化的 Gentoo》 :mrgreen:
----------------------------------------------
我现在的 Gentoo 就是用最优化编译的,编译出来的程序反而比一般程序大了几十 K,感觉速度慢了不少。

我的情况还是没有优化,不知道优化后会有什么后果?如果不当,是不是对系统和硬件都有损坏的情况?我看了帖子了的,用了一些时候gentoo,感觉速度虽然快,但编译的确是慢,而且还有一些依赖关系。呵呵,可能是刚接触不久罢了,还没有很熟悉gentoo。但有时感觉gentoo的确有点儿变态,呵呵。:)

我刚才看了,我的情况是cpu,为守则扬500 (Mendocino),想也是在/etc/make.conf下这样设置吧。
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

这个03的数字的级别是如何区分的呢?

Kuye 发表于 2003-1-1 16:33:12

不知道优化后什么结果?试一下不就知道了 ;)
我现在的 Gentoo 就是最优化后的 Linux,感觉比没优化还慢。。。 :P
损坏硬件嘛。。。软件是不可能破坏硬件地 <- 这是比较基本的常识了 !^_^
CIH 也只能破坏 BIOS 中的软件,但它不可以破坏 BIOS 芯片,你说对吧?

-O 是 gcc 的优化参数,一般只使用 1 <-> 4 级,高过 4 级会让 Linux 很不稳定。。。。
具体的看Gentoo Linux FAQs中译本的第二节 -- 软件使用的 d 章

cnhnln 发表于 2004-5-19 23:37:17

用了优化参数编译以后快慢感觉不到,倒是明显发现编译出的程序大了不少

另外,看了一下 http://www.freehackers.org/gentoo/gccflags/faq.html
它是通过gcc-3.2/gcc/toplevel.c和gcc-3.2/gcc/config/i386/i386.c来确定优化参数的。

gcc3.4的i386.c里有如下的定义
const processor_alias_table[] =
    {
      {"i386", PROCESSOR_I386, 0},
      {"i486", PROCESSOR_I486, 0},
      {"i586", PROCESSOR_PENTIUM, 0},
      {"pentium", PROCESSOR_PENTIUM, 0},
      {"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX},
      {"winchip-c6", PROCESSOR_I486, PTA_MMX},
      {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
      {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
      {"c3-2", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_PREFETCH_SSE | PTA_SSE},
      {"i686", PROCESSOR_PENTIUMPRO, 0},
      {"pentiumpro", PROCESSOR_PENTIUMPRO, 0},
      {"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX},
      {"pentium3", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE},
      {"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 |
                                     PTA_MMX | PTA_PREFETCH_SSE},
      {"k6", PROCESSOR_K6, PTA_MMX},
      {"k6-2", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
      {"k6-3", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
      {"athlon", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                   | PTA_3DNOW_A},
      {"athlon-tbird", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE
                                       | PTA_3DNOW | PTA_3DNOW_A},
      {"athlon-4", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                  | PTA_3DNOW_A | PTA_SSE},
      {"athlon-xp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                      | PTA_3DNOW_A | PTA_SSE},
      {"athlon-mp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                      | PTA_3DNOW_A | PTA_SSE},
      {"x86-64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_64BIT
                             | PTA_SSE | PTA_SSE2 },
      {"k8", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"opteron", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"athlon64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"athlon-fx", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
    };

但是toplevel.c的定义方式变了,看不明白。请教!

pk 发表于 2004-5-23 02:07:39

近来机器有点慢。debian下如何优化 这些gcc参数。发现度没有/etc/make.conf这个文件设置了也没有用:-),难道每次升级内核都要MAKEFILE文件?

Aimar 发表于 2004-6-2 08:25:15

可能是gcc在对循环结构进行循环展开。
用了优化参数编译以后快慢感觉不到,倒是明显发现编译出的程序大了不少

另外,看了一下 http://www.freehackers.org/gentoo/gccflags/faq.html
它是通过gcc-3.2/gcc/toplevel.c和gcc-3.2/gcc/config/i386/i386.c来确定优化参数的。

gcc3.4的i386.c里有如下的定义
const processor_alias_table[] =
    {
      {"i386", PROCESSOR_I386, 0},
      {"i486", PROCESSOR_I486, 0},
      {"i586", PROCESSOR_PENTIUM, 0},
      {"pentium", PROCESSOR_PENTIUM, 0},
      {"pentium-mmx", PROCESSOR_PENTIUM, PTA_MMX},
      {"winchip-c6", PROCESSOR_I486, PTA_MMX},
      {"winchip2", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
      {"c3", PROCESSOR_I486, PTA_MMX | PTA_3DNOW},
      {"c3-2", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_PREFETCH_SSE | PTA_SSE},
      {"i686", PROCESSOR_PENTIUMPRO, 0},
      {"pentiumpro", PROCESSOR_PENTIUMPRO, 0},
      {"pentium2", PROCESSOR_PENTIUMPRO, PTA_MMX},
      {"pentium3", PROCESSOR_PENTIUMPRO, PTA_MMX | PTA_SSE | PTA_PREFETCH_SSE},
      {"pentium4", PROCESSOR_PENTIUM4, PTA_SSE | PTA_SSE2 |
                                     PTA_MMX | PTA_PREFETCH_SSE},
      {"k6", PROCESSOR_K6, PTA_MMX},
      {"k6-2", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
      {"k6-3", PROCESSOR_K6, PTA_MMX | PTA_3DNOW},
      {"athlon", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                   | PTA_3DNOW_A},
      {"athlon-tbird", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE
                                       | PTA_3DNOW | PTA_3DNOW_A},
      {"athlon-4", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                  | PTA_3DNOW_A | PTA_SSE},
      {"athlon-xp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                      | PTA_3DNOW_A | PTA_SSE},
      {"athlon-mp", PROCESSOR_ATHLON, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW
                                      | PTA_3DNOW_A | PTA_SSE},
      {"x86-64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_64BIT
                             | PTA_SSE | PTA_SSE2 },
      {"k8", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"opteron", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"athlon64", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
      {"athlon-fx", PROCESSOR_K8, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
                                      | PTA_3DNOW_A | PTA_SSE | PTA_SSE2},
    };

但是toplevel.c的定义方式变了,看不明白。请教!

cnhnln 发表于 2004-6-9 12:24:53

可能是gcc在对循环结构进行循环展开
那如何确定优化参数呢?多谢

樱家冢 发表于 2004-6-9 13:08:37

所以优化不能太过,其实gentoo的优化参数基本上已经是极限了,应该往下放一点,像我的gentoo,默认应该是 -O3的,我用-O2。

cnhnln 发表于 2004-6-9 13:18:27

pk, 内核在MakeFile里重新定义了CFLAGS,所以必须要改它,才能在编译内核时使用这些参数
樱家冢, 与其用-O2,不如用-Os

编译内核时如果使用了-fforce-addr 参数的话,必定会出错。
忘记了那个版本的内核,使用的参数也记不清了。启动使用一切都正常,就是不能用祯缓冲,如果启动时传递了vga参数的话,系统必死无疑。
还有一些软件也会出问题或者不稳定。
现在我只使用 -pentium3 和 -O3 参数。放弃使用那一堆 -fxxxxxx 参数了。

下面是gcc的man手册,转成了html。有兴趣的可以看看
或者到官方网站看info http://gcc.gnu.org/onlinedocs/
GCC x.x.x Manual下的
3.10 Options That Control Optimization
x86还可以看看
3.17 Hardware Models and Configurations 的 3.17.11 Intel 386 and AMD x86-64 Options

手册更新

BOoRFGOnZ 发表于 2004-8-16 17:13:21

有没有不优化的东西>? :?:

cnhnln 发表于 2004-8-20 13:00:21

楼上的什么意思?

herngwah 发表于 2004-9-6 16:31:45

pk, 内核在MakeFile里重新定义了CFLAGS,所以必须要改它,才能在编译内核时使用这些参数
樱家冢, 与其用-O2,不如用-Os

编译内核时如果使用了-fforce-addr 参数的话,必定会出错。
忘记了那个版本的内核,使用的参数也记不清了。启动使用一切都正常,就是不能用祯缓冲,如果启动时传递了vga参数的话,系统必死无疑。
还有一些软件也会出问题或者不稳定。
现在我只使用 -pentium3 和 -O3 参数。放弃使用那一堆 -fxxxxxx 参数了。

下面是gcc的man手册,转成了html。有兴趣的可以看看
内核 2.6.8 的祯缓冲有vesafb和vesafb-tng,
vesafb 用vga参数
vesafb-tng 用video参数 (video=vesafb:1024x768-32@85)
看/usr/src/linux/Documentation/fb/vesafb.txt
页: [1] 2
查看完整版本: 安装疯狂优化的LFS