当前位置:  建站>运营/SEO
本页文章导读:
    ▪Linux Mint Debain 2013.3.4版 硬盘安装笔记      1、自己安装grub4dos ,(解压grldr到C:\,  编辑boot.ini... )。 2、编辑grub的menu.lst (如果是grub4dos,编辑的是c:\menu.lst),示例如下: title LinuxMint Debian 201012 Live CD & Install root (hd0,5) kernel /casper.........
    ▪linux网络协议栈分析笔记13-路由3-FIB2      当然,我们选择路由1那章的遗留的接口进入分析 fib_lookup()       我们前面提到过fib初始化时,CONFIG_IP_MULTIPLE_TABLES  宏导致了两种方式的fib表初始化, 因此存在了有多路由表存在.........
    ▪linux网络协议栈分析笔记12-路由2-FIB1      上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么 FIB(Forward Information Base) 转发信息库 inet_init()->ip_init()->ip_rt_init()-> ipv4_dst_ops.kmem_cachep =  &nb.........

[1]Linux Mint Debain 2013.3.4版 硬盘安装笔记
    来源: 互联网  发布时间: 2013-10-27

1、自己安装grub4dos ,(解压grldr到C:\,  编辑boot.ini... )。

2、编辑grub的menu.lst (如果是grub4dos,编辑的是c:\menu.lst),示例如下:

title LinuxMint Debian 201012 Live CD & Install

root (hd0,5)

kernel /casper/vmlinuz boot=live live-media-path=/casperquiet splash --

initrd  /casper/initrd.lz

3、下载LMDE的ISO文件,然后将它解压到某个分区的根目录(必须解压)

4、重启动,在Windows启动时选择GRUB 4 DOS,然后选择 LinuxMint Debian 201012 Live CD & Install

5、进入LMDE的图形界面后,点击桌面上的Installer进行安装时出现错误“failed to run /usr/bin/live-installer as user root”,解决如下:

A)按下Ctrl+Alt+F1切换到 命令行界面,登录,用户名:root,密码:空。

B) 输入passwd命令设置新的root的密码;密码设置 好后按下Alt+F7切换回 图形界面,运行安装向导、登录root账户, 输入设置后的新root密码!

6、其它:配置中文:

sudo apt-get install task-chinese-s-desktop //安装中文语言支持

sudo nano /etc/locale.gen //编辑locale.gen,在要使用的语言zh_CN前面去掉注释符号“#”。

sudo locale-gen 

重启计算机。

安装中文输入法: sudo apt-get install ibus-pinyin google-pinyin

更新源,使用apt-spy 的方式自动找到最快的源:

sudo apt-get install apt-spy //安装

man apt-spy //获取详细的使用方法

sudo apt-spy update //更新您的镜像列表文件 /var/lib/apt-spy/mirrors.txt

sudo apt-spy -d testing -t 6 -a Asia //在亚洲地区源列表中选取最快的testing版源,请求时间限制为6秒

可以参照这篇文章:http://www.linuxdiyf.com/viewarticle.php?id=52437

附:grub修复:

1、进入liveCD系统界面

2、把根分区挂在/mnt,如:mount /dev/sda9 /mnt

3、把boot分区挂载到/mnt/boot目录 ,如:mount /dev/sda11 /mnt/boot(没有boot分区的忽略该步骤)

4、grub-install --root-directory=/mnt/ /dev/sda

5、重启

作者:love254443233 发表于2013-4-14 20:58:57 原文链接
阅读:23 评论:0 查看评论

    
[2]linux网络协议栈分析笔记13-路由3-FIB2
    来源: 互联网  发布时间: 2013-10-27
当然,我们选择路由1那章的遗留的接口进入分析
fib_lookup()       我们前面提到过fib初始化时,CONFIG_IP_MULTIPLE_TABLES  宏导致了两种方式的fib表初始化,
因此存在了有多路由表存在和无多路由表存在的情况,我们先看无多路由表的情况
static inline int fib_lookup(struct net *net, const struct flowi *flp,
                    struct fib_result *res)
{
     struct fib_table *table;

     table = fib_get_table(net, RT_TABLE_LOCAL);            先查LOCAL 
     if (!table->tb_lookup(table, flp, res))
          return 0;

     table = fib_get_table(net, RT_TABLE_MAIN);               再查MAIN
     if (!table->tb_lookup(table, flp, res))
          return 0;
     return -ENETUNREACH;
}

static inline struct fib_table *fib_get_table(struct net *net, u32 id)
{
     struct hlist_head *ptr;

     ptr = id == RT_TABLE_LOCAL ?
          &net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX] :
          &net->ipv4.fib_table_hash[TABLE_MAIN_INDEX];
     return hlist_entry(ptr->first, struct fib_table, tb_hlist);                 根据传入的id找到fib_table
}
上一章的一幅图说明了这种结构
!table->tb_lookup(table, flp, res))   即fn_hash_lookup
static int
fn_hash_lookup(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
{
     int err;
     struct fn_zone *fz;
     struct fn_hash *t = (struct fn_hash *)tb->tb_data;            获得路由区队列

     read_lock(&fib_hash_lock);
     for (fz = t->fn_zone_list; fz; fz = fz->fz_next) {              扫描网络区
          struct hlist_head *head;
          struct hlist_node *node;
          struct fib_node *f;
          __be32 k = fz_key(flp->fl4_dst, fz);         取目标地址在该网络区的网络号  fl4_det&((fz)->fz_mask)

          head = &fz->fz_hash[fn_hash(k, fz)];            fn_hash(k, fz)得到hash关键字    获得hash链头
          hlist_for_each_entry(f, node, head, fn_hash) {       
               if (f->fn_key != k)                                  通过fn_key找到匹配的fib node节点                        
                    continue;

               err = fib_semantic_match(&f->fn_alias,           进入fib semantic查找
                              flp, res,
                              fz->fz_order);
               if (err <= 0)
                    goto out;
          }
     }
     err = 1;
out:
     read_unlock(&fib_hash_lock);
     return err;
}
int fib_semantic_match(struct list_head *head, const struct flowi *flp,
                 struct fib_result *res, int prefixlen)          这里head是f->fn_alias结构
{
     struct fib_alias *fa;
     int nh_sel = 0;

     list_for_each_entry_rcu(fa, head, fa_list) {
          int err;

          if (fa->fa_tos &&
              fa->fa_tos != flp->fl4_tos)                比较TOS
               continue;

          if (fa->fa_scope < flp->fl4_scope)         比较路由范围 scope
               continue;

          fa->fa_state |= FA_S_ACCESSED;

          err = fib_props[fa->fa_type].error;            取转发类型错误码       根据错误码进行特定处理
          if (err == 0) {                                            允许的转发类型
               struct fib_info *fi = fa->fa_info;

               if (fi->fib_flags & RTNH_F_DEAD)            如果该转发节点不通
                    continue;

               switch (fa->fa_type) {
               case RTN_UNICAST:               单目转发
               case RTN_LOCAL:                   本地转发
               case RTN_BROADCAST:           广播转发
               case RTN_ANYCAST:               任意转发
               case RTN_MULTICAST:            多目转发
                    for_nexthops(fi) {            对于转发信息中
    
[3]linux网络协议栈分析笔记12-路由2-FIB1
    来源: 互联网  发布时间: 2013-10-27
上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么
FIB(Forward Information Base) 转发信息库
inet_init()->ip_init()->ip_rt_init()->

ipv4_dst_ops.kmem_cachep =
          kmem_cache_create("ip_dst_cache", sizeof(struct rtable), 0,         rtable结构高速缓存的创建
                      SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);

rt_hash_table = (struct rt_hash_bucket *)                                              路由缓存的hash表创建
          alloc_large_system_hash("IP route cache",
                         sizeof(struct rt_hash_bucket),
                         rhash_entries,
                         (totalram_pages >= 128 * 1024) ?
                         15 : 17,
                         0,
                         &rt_hash_log,
                         &rt_hash_mask,
                         rhash_entries ? 0 : 512 * 1024);
     memset(rt_hash_table, 0, (rt_hash_mask + 1) * sizeof(struct rt_hash_bucket));

ip_fib_init()->
     注册与路由相关的rtnetlink 消息以及他的处理函数,主要处理路由添加删除  
rtnl_register(PF_INET, RTM_NEWROUTE, inet_rtm_newroute, NULL);
          rtnl_register(PF_INET, RTM_DELROUTE, inet_rtm_delroute, NULL);
          rtnl_register(PF_INET, RTM_GETROUTE, NULL, inet_dump_fib); 

register_pernet_subsys(&fib_net_ops);    注册协议栈子系统,也就是路由系统。 重点--fib_net_ops
          register_netdevice_notifier(&fib_netdev_notifier);         通知链注册
          register_inetaddr_notifier(&fib_inetaddr_notifier);
          fib_hash_init()
fib_hash_init()    该函数出现在fib_hash.c   fib_trie.c两个文件中都有,系统可配置两种路由表组织算法,默认hash算法

void __init fib_hash_init(void)
{
     fn_hash_kmem = kmem_cache_create("ip_fib_hash", sizeof(struct fib_node),     fib_node高速缓存创建
                         0, SLAB_PANIC, NULL);

     fn_alias_kmem = kmem_cache_create("ip_fib_alias", sizeof(struct fib_alias),      fib_alias高速缓存创建
                           0, SLAB_PANIC, NULL);

}
主要数据结构:
struct fib_node {        代表一个路由指向的子网
     struct hlist_node     fn_hash;                    hash节点
     struct list_head     fn_alias;                     路由别名
     __be32               fn_key;                        子网地址
     struct fib_alias        fn_embedded_alias;   内嵌的路由别名
};

struct fib_alias {
     struct list_head     fa_list;               
     struct fib_info          *fa_info;      路由信息结构保存着如何处理数据包
     u8               fa_tos;                   TOS
     u8               fa_type;                 路由类型
     u8               fa_scope;               路由范围
     u8               fa_state;                状态标志
#ifdef CONFIG_IP_FIB_TRIE
     struct rcu_head          rcu;
#endif
};


fib_net_ops:
static struct pernet_operations fib_net_ops = {
     .init = fib_net_init,
     .exit = fib_net_exit,
};
fib_net_init()
{
 ip_fib_net_init(net);

 nl_fib_lookup_init(net);                  netlink初始化相关

 fib_proc_init(net);                          初始化proc文件系统
}
static int __net_init ip_fib_net_init(struct net *net)
{
     int err;
     unsigned int i;

     net->ipv4.fib_table_hash = kzalloc(
               sizeof(struct hlist_head)*FIB_TABLE_HASHSZ, GFP_KERNEL);          申请256大小的hash表
     if (net->ipv4.fib_table_hash == NULL)
          return -ENOMEM;

     fo
    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3