[i=s] 本帖最后由 dchwlinux 于 2010-6-25 18:12 编辑 [/i]
[align=center][font=黑体][/size][/font][/align]
[font=宋体][font=宋体][/color][/font][/font]
[color=#000000][font=宋体][font=宋体]
[/font][font=宋体]前言:linux一直因为太依赖网络而被人诟病,说linux不适合作为桌面系统,当然这个问题在过去可能很严重,现在网络如此普及,这已经不是什么问题了。但是依然有挑剔的人说,在windows下安个软件只要到网吧下下来回去就可以装了,而linux依赖(注1)非常之严重。安装一个软件要额外装其它的软件。其实这个问题理性地说,windows之所以下一个就能装了,那是因为windows装完了之后基本上什么都装齐了,而linux则不然,装完了之后可能只是一个基本系统。这一点从系统大小(注2)来看就可以看出来。再加上linux更新过于频繁,联网的用户时不时的就有更新。所以不联网的用户用起来感觉很是不爽。但是时至今日,linux的依赖不再应该成为桌面版发展的阻碍,因为各个发行版为了解决依赖都开发了相应的软件管理器,如debian的apt, redhat的yum,suse的yast, 当然这些都是基于网络的。虽然基于网络,却可以在自己本身没有网络时借助别处的网络(网吧啊,QQ群啊),实现自身的更新。所以该帖子就以ubuntu这个更新相当频繁的linux发行版下的apt为例来说明linux更新本地化的祥细步骤。[/font][/font]
[font=宋体][font=宋体]
[/font][font=宋体]原理我也在先前的探索帖中写过(http://www.linuxdiyf.com/bbs/thread-181325-1-1.html),apt的更新步骤分为四步:[/font][/font]
[font=宋体][font=宋体]一、 apt-get update,依赖网络,更新软件列表,保存在本地。[/font][/font]
[font=宋体][font=宋体]二、 apt-get upgrade命令的第一步:分析软件是否需要升级,并建立依赖关系,分析出需要更新的软件包列表。这一步,不需要网络。[/font][/font]
[font=宋体][font=宋体][attach]31142[/attach][attach]31141[/attach][attach]31143[/attach][attach]31134[/attach][attach]31147[/attach][/font][/font]
[font=宋体][font=宋体]三、 apt-get upgrade的第二步,依据上一步所产生的更新列表,从网上下载所需更新。这一步显然是需要网络的,但是如果我们能取得更新软件列表,可以手动地从网络上下载,拷贝到本地。[/font][/font]
[font=宋体][font=宋体]四、 最后一步当然就是安装软件包啦,这一步在绝绝绝绝绝大多数情况下是不需要网络的,因为正常情况下动用了dpkg,依赖在第二步已经解决,所以不需要上网。但是也不例外,如果你安装flashplayer,那它的deb包会下载一个tar包,这点在ubuntu的software center里有明显的warning。还有,在安装opera浏览器的时候虽然提示依赖己满足,但是安装的过程中dpkg反而调用了apt去下载依赖包,不过新出的beta版已经解决了。 [/font][/font]
[font=宋体][font=宋体][/color][/font][/font]
[font=宋体][font=宋体][color=#000000][/font][/font]
[font=宋体][font=宋体] 从原理上来看,我们需要在网络上做的就是apt-get update,然后就是第三步,下载更新的软件包了。那么其它的两步怎么做呢?也许你已经猜出来了,第一步更新列表后软件列表是存放在本地的,所以我们要找的就是软件列表存放在哪儿?根据apt-get的howto文档,更新的软件列表存放的位置是/var/lib/apt/lists,在该目录下除了软件列表以外还有一个lock文件和partial目录,这两个东西正常情况下都是空的,lock肯定就是锁定软件包管理器用的,即命令行下的apt,图形界面的更新管理器、新立得、软件中心都是调用的apt,而apt要分析依赖最终是为了dpkg服务的,在/var/lib/dpkg/info里有一堆的软件相关的内容,看似很重要,不过笔者曾将其删除,apt工作正常。此目录不在本帖说范围内。[/font][/font]
[font=宋体][font=宋体][attach]31136[/attach][/font][/font]
[font=宋体][font=宋体] [/font][/font]
[font=宋体][font=宋体] 接下来是第三步,如果我们将得到了软件列表拷贝到本地的/var/lib/apt/lists下,那么接下来,启动更新管理器,apt就会分析软件的更新情况和依赖关系。产生下载列表。那么怎么取得更新列表呢?难道要在别处下载一遍?我在先前的探索帖里认为需要在虚拟机里更新一遍,但是后来一想,虚拟机和实体机是不一样的,虚拟机里更新的东西我自己的机子可能不需要,如果靠虚拟机来取得下载列表,还要再装一遍,那不是依然需要网络吗?我们要的是下载列表,而且是只针对本机更新的下载列表,在这个过程中我们并不需要下载任何东西,那么那个下载列表又放在哪儿呢?很遗憾,这个列表到底存放在哪儿我并没有找到,但是我们依然可以通过别的方法得到,那就是在本地未联网的情况下“安装”更新。显然本地并未联网,会出现错误提示,但是我们要的就是这个提示,因为它会告诉我们哪些软件包需要下载而又无法下载,请看图吧。[/font][/font]
[font=宋体][font=宋体] [attach]31146[/attach][/font][/font]
[font=宋体][font=宋体] 没错,只要ctrl+a全选,ctrl+c拷贝即可,你就得到了软件列表,不过在粘贴之前不要关闭上面的窗口,否则粘贴不到任何东西。如下图:[/font][/font]
[font=宋体][font=宋体] [attach]31139[/attach][/font][/font]
[font=宋体][font=宋体] 剩下的事情只是对列表进行小小的处理了,先看下下面的图:[/font][/font]
[font=宋体][font=宋体] [attach]31140[/attach][/font][/font]
[font=宋体][font=宋体] 好了,从上面的一条命令可以看出已经提取下载连接所在的行了,懂一点shell的人肯定知道怎么处理了,只要用sed工具把http前面的头去掉就可以了,而开头都是一样的,所以,请看图:[/font][/font]
[font=宋体][font=宋体] [attach]31132[/attach][attach]31135[/attach][/font][/font]
[align=center][font=宋体][/color][/font][size=5][color=red]更新:修改下载列表,直接用vi编辑器更方便。
[font=宋体][font=宋体] [/font][/font]
[font=宋体][font=宋体] 接下来就是下载了,话说网吧里都是windows,光知道下载列表难道要一个一个下?显然不需要,linux我们有强大的wget命令,那windows下呢?也有,如果windows下实在找不到工具,那就下载wget for windows吧。更新包全下载回来之后怎么安装?还是根据apt的howto,apt默认的软件缓存是在/var/cache/apt/archives下,所以下载回来的包就放在该目录下即可。[/font][/font][/align][align=left][font=宋体][font=宋体]至此理论问题全部解决了,接下来总结步骤如下:[/font][/font]
[font=宋体][font=宋体] 一、[/font][/font][font=宋体][font=宋体]取得更新列表:如果你附近有使用ubuntu的朋友,你可以从他那里直接拷贝/var/lib/apt/lists/下除了lock和partial的所有文件。反之,你可能需要从QQ群里和别人要他们的list文件夹,很小,让别人传给你或者发个邮件寄给你。最次的你可以在网吧开个虚拟机只用livecd,不要安装,换成你自己的源,apt-get update一下或者在更新管理器里check一下即可,取得下载列表就可以下机了。当然,我还是建议大家加几个linux的群,找ubuntu用户直接传给你,因为有的网吧可能封的太厉害,虚拟机都装不了啊。[/font][/font][/align]======================================================
[font=宋体][font=宋体] 二、[/font][/font][font=宋体][font=宋体]取得下载列表:回来之后,把列表拷贝到本地的/var/lib/apt/lists下,然后启动更新管理器或语言支持,点击安装,复制错误信息。如果在命令行里用apt-get upgrade(install xxx)那请用重定向将错误信息重定向到文件里,直接回车亦可取得下载列表,就是sudo apt-get upgrade 2>list.txt 这样list.txt就是所需的文件。接下来就是提取下载列表了,在图形界面和命令界面的错误信息有点区别,图形化的需要去头,命令行下的需要掐头去尾。而头尾都是相同的,所以很简单,当然如果你的源很多的话,结尾说无法解析的网址可能不一样,那就一点一点地来。如:[/font][/font]
[align=left][font=宋体][font=宋体]cat list.txt|grep deb|sed ‘s/[/font][font=宋体]错误信息头//g’>list3.txt, list3.txt就是最终的下载列表。这里简单说一下,grep是为了过滤出deb行,之后,用sed工具去头去尾,sed 后接单引号,s/表示search,//表示替换成空,相当于删除了,而最后的g表示global,即全局替换。如果需要去尾的话要用两次sed。[/font][/font][/align]====================================================== [align=center]还是直接用vi方便
[/align][align=left]======================================================[/align][align=left][font=宋体][font=宋体] 三、去网吧下载,安装wget for windows,应该下第一个setup那个。安装好后因为windows和linux不一样,你可以搜索设置环境变量。不设的话就需要进行具体的wget目录下。看下图:[/font][/font][/align]
[align=left][font=宋体][font=宋体][attach]31144[/attach] [attach]31138[/attach][/font][/font][/align]
[align=left][font=宋体][font=宋体] 四、下载完成后就回来把软件包放到/var/cache/apt/archives下。当然,如果你嫌根目录不够的话,可以考虑先把该目录改名,再在家目录下建个目录指向/var/cache/apt/archive,把原目录中的lock和partial复制到新目录中,这样就有足够的空间了,但是权限一定要设置好,属主也要改成root。[/font][/font][/align]
[align=left][font=宋体][font=宋体][/color][/font][/font][/align]
[align=left][font=宋体][font=宋体][color=#000000][/font][/font][/align]
[align=left][font=宋体][font=宋体]注1:所谓依赖虽然是万恶的,但是也是可以理解的,依赖就意味着需要,记得在windows下删除文件的时候,有时会出现说“可能导致某些程序无法使用”,这与依赖如出一辙。依赖并非linux独有。[/font][/font][/align]
[align=left][font=宋体][font=宋体]注2:linux系统的大小不像windows那样光看C盘就行了,linux下所有目录都从根目录开始,因为有挂载点的概念,所以你可以把系统有关的目录单独分区。一般的,linux中能够挂载的系统目录有根目录(/),/usr,/var。所以如果你想算算linux系统的大小,把这三个目录所在的分区的使用大小加起来就行了。不要把/home算在里面,否则请把windows下的我的文档之类的目录大小加到windows下再与linux比较。[/font][/font][/align]
fly200233 于 2010-08-26 16:56:43发表:
受教受教
大宝 于 2010-06-25 11:04:30发表:
[i=s] 本帖最后由 大宝 于 2010-6-25 11:07 编辑 [/i]
谁说的瘟到死下没依赖的?
有本事不装 .NET Framework,去装一个完整版 AutoCAD2010 来给我瞧瞧?
而且直接到微软官网下载下来的 .NET Framework 不联网装装试试?
在一个绝对没有网络及间接网络支持的环境下,同样是一张CD光盘,装一个瘟到死绝对比不上装一个Linux
tmacron 于 2010-06-21 00:03:08发表:
多谢!多谢!
dchwlinux 于 2010-06-20 00:55:28发表:
正版的windows盘我没有,我刻的雨林木风的盘,虚拟机里试装过,自带着几款软件。windows系统本身其实并不提供太多的应用软件,而linux刚不同,各版本都试图提供整套的应用程序解决方案,所以刚装的系统当然linux好一些。对于依赖我想说的是,狭义的依赖是软件包之间的依赖,其依赖取决于打包者(的编译环境),广义的依赖范围就很大了。软件包虽然存在依赖,但是便于管理,效率高。而且从依赖本身来看也不全是坏事:安装一个软件时看似额外装了些东西,实际上有的软件本身有可能就分成了好几个包,如qt图形包+data包+相应的工具包+语言包,这几个小软件合一块儿组成一个大软件。这与linux软件简单,功能单一,模块化是相通的。包管理起来具有整体性,完整性,依赖的同时意味着被依赖,常常是一个包被N个包依赖,即包之间有很大的共用性,其结果是整体上减小了系统大小。
acrofox 于 2010-06-19 23:16:00发表:
我的感觉更好相反,Windows装完之后什么也干不了,主流Linux发行版装完之后常用的软件都齐了。
至于说依赖,那是因为 Windows 下以闭源软件为主,软件不仅是闭源的,而且本身也有“封闭”的,什么功能都自己来提供,除了调用一些很通用的DLL以外,尽量不去调用别人的东西。如果不这样的话,销售起来会很难办。设想一下,如果你花很多钱买了一个软件回来,结果告诉你还不能用,还得再花一笔钱去买个Photoshop,因为那个软件依赖于Photoshop,你会怎么办?但Linux中大量的开源软件没这个问题,即便一个软件依赖于 gimp,你要付出的只不过是一些下载的时间、上网费用、硬盘空间等。由于Linux下的开源软件一般都以尽可能通用的模块的形式来开发,少了很多重复的实现,因而同样是实现基本的文档处理、图像处理、上网、看电影等功能,Linux系统比Windows系统小得多。
至于实现本地源,可以用 apt-mirror,但如果不想占用那么多硬盘空间的话,可以考虑用 apt-cacher-ng。
离线升级软件的工具中有个 apt-zip,也值得研究一下。
Leo.dingwl 于 2010-06-19 11:36:19发表:
写的麻烦,没怎么看。
直接在本地执行apt-mirror算了,建立本地仓库、定时同步官方源,岂不是更好?!
shenhao0129 于 2010-06-19 11:24:29发表:
高手。哈哈
dchwlinux 于 2010-06-19 09:34:16发表:
我又想起了一点,就是掐头去尾修改下载列表那一步,应该直接用vi编辑器,爱怎么改就怎么改,不需要用到sed工具。我把事情想复杂了
Autobi 于 2010-06-19 08:32:55发表:
学习了