LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 842|回复: 0

打造自己的Fedora9全镜像的本地源!!

[复制链接]
发表于 2008-6-3 11:46:19 | 显示全部楼层 |阅读模式
考虑到自己的网速问题,每次使用网络源速度都特别的慢,特别是要是下载比较大的文件, 以下是自己创建feodra9本地源的方法, 注意里面有些内容你可能需要根据自己的实际需要去手动更改:


1,  下载包文件信息列表文件:
     wget http://ftp.twaren.net/Linux/Fedo ... ta/filelists.xml.gz

2, 使用如下命令获取包信息列表(把代码部分复制下来创建一个C语言的原文件,取名为respo_info.c):
  
  1.    #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <libxml/parser.h>
  5. void package_info_store(xmlDocPtr doc, xmlNodePtr cur) {
  6.    char *id = NULL;
  7.    char *name = NULL;
  8.    char *arch = NULL;
  9.    char *epoch = NULL;
  10.    char *ver = NULL;
  11.    char *rel = NULL;
  12.    /* Get package base info */
  13.    xmlAttrPtr aptr = cur->properties;
  14.    while(aptr) {
  15.       if(!xmlStrcmp(aptr->name, (const xmlChar*)"pkgid")) {
  16.          id = strdup(aptr->children->content);
  17.       }
  18.       if(!xmlStrcmp(aptr->name, (const xmlChar*)"name")) {
  19.          name = strdup(aptr->children->content);
  20.       }
  21.       if(!xmlStrcmp(aptr->name, (const xmlChar*)"arch")) {
  22.          arch = strdup(aptr->children->content);
  23.       }
  24.       aptr = aptr->next;
  25.    }
  26.    /* Get package version info */
  27.    xmlNodePtr tmp = cur->children;
  28.    while(tmp) {
  29.       if(tmp->type == XML_ELEMENT_NODE) {
  30.          if(!xmlStrcmp(tmp->name, (const xmlChar*)"version")) {
  31.             aptr = tmp->properties;
  32.             while(aptr) {
  33.                if(!xmlStrcmp(aptr->name, (const xmlChar*)"epoch")) {
  34.                   epoch = strdup(aptr->children->content);
  35.                }
  36.                if(!xmlStrcmp(aptr->name, (const xmlChar*)"ver")) {
  37.                   ver = strdup(aptr->children->content);
  38.                }
  39.                if(!xmlStrcmp(aptr->name, (const xmlChar*)"rel")) {
  40.                   rel = strdup(aptr->children->content);
  41.                }
  42.                aptr = aptr->next;
  43.             }
  44.         }
  45.       }
  46.       tmp = tmp->next;
  47.    }
  48.    /* Check package values */
  49.    /*
  50.    printf("id:%s\n", id);
  51.    printf("name:%s\n", name);
  52.    printf("arch:%s\n", arch);
  53.    printf("epoch:%s\n", epoch);
  54.    printf("ver:%s\n", ver);
  55.    printf("rel:%s\n", rel);
  56.    */
  57.    if(!id || !name || !arch || !epoch || !ver || !rel) {
  58.       fprintf(stderr, "Invalid package info\n");
  59.       exit(1);
  60.    }
  61.    printf("%s|%s|%s|%s|%s|%s|", id, name, arch, epoch, ver, rel);
  62.    printf("%s-%s-%s.%s.rpm\n", name, ver, rel, arch);
  63.    free(id);
  64.    free(name);
  65.    free(arch);
  66.    free(epoch);
  67.    free(ver);
  68.    free(rel);
  69. }
  70. int main(int argc, char *argv[]) {
  71.    /* Check the argument */
  72.    if(argc != 2) {
  73.       fprintf(stderr, "Usage:respo_file\n");
  74.       exit(1);
  75.    }
  76.    char *respo_file = argv[1];
  77.    /* Open the respo file */
  78.    xmlDocPtr rdoc;
  79.    xmlNodePtr cur;
  80.    if(!(rdoc = xmlParseFile(respo_file))) {
  81.       fprintf(stderr, "Respo document parse not successfully!\n");
  82.       exit(1);
  83.    }
  84.    /* Check root element */
  85.    cur = xmlDocGetRootElement(rdoc);
  86.    if(!cur) {
  87.       fprintf(stderr, "Invalid respo file\n");
  88.       exit(1);
  89.    } else if(xmlStrcmp(cur->name, (const xmlChar*)"filelists")) {
  90.       fprintf(stderr, "Can not found respo filelists entry\n");
  91.       exit(1);
  92.    }
  93.    /* Get children elements */
  94.    cur = cur->xmlChildrenNode;
  95.    while(cur) {
  96.       if(cur->type == XML_ELEMENT_NODE) {
  97.          if(xmlStrcmp(cur->name, (const xmlChar*)"package")) {
  98.             fprintf(stderr, "Invalid respo package entry\n");
  99.             exit(1);
  100.          } else {
  101.             package_info_store(rdoc, cur);
  102.          }
  103.       }
  104.       cur = cur->next;
  105.    }
  106. }
  107. gcc -o respo_info respo_info.c `pkg-config --libs --cflags libxml-2.0`
  108. gunzip filelists.xml.gz
  109. respo_info filelists.xml > packages
  110.   
复制代码

3, 下载包(耗时比较长, 共计16G多)
  1.   #!/bin/bash
  2. HOST_ROOT="http://mirror.pacific.net.au/linux/fedora/linux/releases/9/Everything/i386/os/Packages"
  3. HOST_ROOT="http://ftp.twaren.net/Linux/Fedora/linux/releases/9/Everything/i386/os/Packages"
  4. #HOST_ROOT="http://ftp.ncnu.edu.tw/Linux/Fedora/linux/releases/9/Everything/i386/os/Packages"
  5. #HOST_ROOT="http://mirrors.kernel.org/fedora/releases/9/Everything/i386/os/Packages"
  6. MIRROR_DIR="/media/disk_part9/fedora/extras"
  7. TMP_DIR="$MIRROR_DIR/.tmp"
  8. cd $MIRROR_DIR
  9. if [ -d "$TMP_DIR" ]; then
  10.    umount $TMP_DIR/mount
  11.    rm -fr $TMP_DIR
  12. fi
  13. mkdir -p $TMP_DIR
  14. mkdir -p $TMP_DIR/mount
  15. mount $MIRROR_DIR/../*.iso $TMP_DIR/mount -o loop
  16. for package in `cat packages`
  17. do
  18.    pkg_name=`echo $package | cut -d'|' -f7`
  19.    #pkg_sha1=`echo $package | cut -d'|' -f1`
  20.    check_pkg_url1="${TMP_DIR}/mount/Packages/${pkg_name}"
  21.    check_pkg_url2="${MIRROR_DIR}/pkgs/${pkg_name}"
  22.    down_pkg_url="${HOST_ROOT}/${pkg_name}"
  23.    if [ -f "$check_pkg_url1" ] || [ -f "$check_pkg_url2" ]; then
  24.       continue
  25.    fi
  26.    echo "Downloading $down_pkg_url ..."
  27.    mytget -n5 -d ${MIRROR_DIR}/pkgs/ $down_pkg_url
  28. done
复制代码

下载完成后使用createrepo命令创建本地镜像!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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