LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: qdog988

如何更新系统阿

[复制链接]
 楼主| 发表于 2009-8-19 18:07:19 | 显示全部楼层
没搞明白你是什么意思
可否讲的明白一些,个人认为可以直接讲怎么做,不要作什么假设
回复 支持 反对

使用道具 举报

发表于 2009-8-19 19:20:16 | 显示全部楼层
楼主,您现在浪费的时间,足够新构建一套全新系统的。
可以用 LFS 官方提供的 ALFS 自动构建工具,jhalfs 本版有介绍,请优先阅读。
习惯自定义的话,您应该有自己的构建脚本。

本版有专门讨论 libc 升级的帖子,请优先阅读。

简单点说,小规模升级,不包括升级 内核头文件、libc,请优先单独升级各个软件包。
大规模升级,包括升级 内核头文件、libc,请优先构建全新系统。

复杂点说,可以不停机升级 内核头文件、libc。

高危操作,请准备好强心针、吗啡、氰化钾,必要时基于人道主义考虑,请主动给机机安乐死。
回复 支持 反对

使用道具 举报

发表于 2009-8-19 19:37:07 | 显示全部楼层
深空兄一盘冷水照头淋,楼主有此求知欲也非坏事呀,哈哈。

除了本版关於 glibc 升级的帖子,建议楼主再参考 LFS 手册关於 Toolchain 的概念,与及关於头文件的帖子。没有搞懂这些之前,请不要碰 glibc
回复 支持 反对

使用道具 举报

发表于 2009-8-19 20:37:19 | 显示全部楼层
真的建议你去读一读那本书,再考虑如何升级glibc
http://baike.baidu.com/view/2478064.htm

照我的想法,手工把ld动态链接库、libc拷到/lib,再用ln -sf改一下那两个连接到新库,然后make install,系统应该不会挂掉。
只是想法,没试过。。。
回复 支持 反对

使用道具 举报

发表于 2009-8-19 21:24:40 | 显示全部楼层
Post by d00m3d;2018019
深空兄一盘冷水照头淋,楼主有此求知欲也非坏事呀,哈哈。

偶今后会尽力提高水温。
Post by 5000;2018060
照我的想法,手工把ld动态链接库、libc拷到/lib,再用ln -sf改一下那两个连接到新库,然后make install,系统应该不会挂掉。
只是想法,没试过。。。

请尽力以实证态度给出参考,不要猜测。
您那样做会死人的,cp 与 install tar 等是不同的。
http://en.chys.info/2009/05/install-vs-cp-and-mmap/
install vs. cp; and mmap
By chys on May 8th, 2009

If we hand write a Makefile, we should always stick to install instead of using cp for the installation commands. Not only is it more convenient, but it does things right (cp does things wrong).

For example, if we attempt to update /bin/bash, which is currently running, with “cp ... /bin/bash”, we get a “text busy” error. If we attempt to update /lib/libc.so.6 with “cp ... /lib/libc.so.6”, then we either get “text busy” (in ancient versions of Linux) or breaks each and every running program within a fraction of a second (in recent versions of Linux). install does the thing right in both situations.

The reason why cp fails is that it simply attempts to open the destination file in write-only mode and write the new contents. This causes problem because Linux (and all contemporary Unices as well as Microsoft Windows) uses memory mapping (mmap) to load executables and dynamic libraries.

The contents of an executable or dynamic library are mmap’d into the linear address space of relevant processes. Therefore, any change in the underlying file affects the mmap’d memory regions and can potentially break programs. (MAP_PRIVATE guarantees changes by processes to those memory regions are handled by COW without affecting the underlying file. On the contrary, POSIX leaves to implementations whether COW should be used if the underlying file is modified. In fact, for purpose of efficiency, in Linux, such modifications are visible to processes even though MAP_PRIVATE may have be used.)

There is an option MAP_DENWRITE which disallows any modification to the underlying file, designed to avoid situations described above. Executables and dynamic libraries are all mmap’d with this option. Unfortunately, it turned out MAP_DENYWRITE became a source of DoS attacks, forcing Linux to ignore this option in recent versions.

Executables are mmap’d by the kernel (in the execve syscall). For kernel codes, MAP_DENYWRITE still works, and therefore we get “text busy” errors if we attempt to modify the executable.

On the other hand, dynamic libraries are mmap’d by userspace codes (for example, by loaders like /lib/ld-linux.so). These codes still pass MAP_DENYWRITE to the kernel, but newer kernels silently ignores this option. The bad consequence is that you can break the whole system if you think you’re only upgrading the C runtime library.

Then, how does install solve this problem? Very simple – unlinking the file before writing the new one. Then the old file (no longer present in directory entries but still in disk until the last program referring to it exits) and the new file have different inodes. Programs started before the upgrading (continuing using the old file) and those after the upgrading (using the new version) will both be happy.

发行版中,debian 一直以来都支持不停机升级,特别是 libc 升级,stable -> testing -> unstable。
您可以用虚拟机安装一个最小化的 debian i386 stable 系统,备份一下,调整 souce.list 指向 testing 或 unstable,升级 libc,观察升级过程;之后删除,恢复备份继续,直到明白详细步骤。
中间您可能需要自己手动把 libc.deb 拆开,仔细理解升级过程调用的脚本,甚至可以手工给 debian 升级 libc。
回复 支持 反对

使用道具 举报

发表于 2009-8-20 01:32:03 | 显示全部楼层
呵呵,我已領教過多次了,不停機用 cp 來升級 glibc 是死定的,前車可鑑,勿試!

不停機升級也不局限於 Debian,Gentoo 亦如是。但我沒有研究過它的 ebuild。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-20 12:46:45 | 显示全部楼层
哈哈,感谢各位兄弟,我的意思是停机,从另外的系统启动,然后cp
不过看了各位的帖子还是很受启发的
谢谢
回复 支持 反对

使用道具 举报

发表于 2009-8-20 14:01:50 | 显示全部楼层
Linux最SB的地方之一是允许cp覆盖正在使用中的库,如果覆盖的是重要的库,系统就崩溃了,奇怪的是对于正在远行中的程序,它又知道不准覆盖哦。

好在大多数库的名字都带有一个版本号,升级时因同名而被覆盖的情况很少出现,所以大可放心地去cp而不用停机,所谓升级不过是把符号连接从指向旧库改为指向新库。至于同名的库,建议用install来拷贝较保险,install是先删除后拷贝,这个删除不会影响正在使用中的库。
回复 支持 反对

使用道具 举报

发表于 2009-8-20 21:22:58 | 显示全部楼层
替LZ设想好了不停机升级glibc的方法:

编译好glibc后,安装到某个目录下,用tar打包,再用tar xUf解包到根目录就OK了

此方法保证管用,请LZ务必一试!
回复 支持 反对

使用道具 举报

发表于 2009-8-21 00:07:52 | 显示全部楼层
如果不理解系统的运作,最好还是别碰 glibc,不要为升级而升级
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表