• Gentoo: 屏蔽Linux的启动信息


    1. 屏蔽grub的信息

    Gentoo上amd64 grub的版本是0.97-r12,需要修改源码来屏蔽屏幕打印。

    - 创建本地overlay:/usr/local/portage/xxx-overlay,添加内容:PORTDIR_OVERLAY="/usr/local/portage/xxx-overlay"到/etc/make.conf

    - 在本地overlay目录下创建:sys-boot-xxx/grub,将grub-0.97-r12.ebuild(来自gentoo官方portage树)和metadata.xml拷贝到这里

    - 修改ebuild,因为我们要加入自己的patch,所以在

        EPATCH_SUFFIX="patch" epatch "${WORKDIR}"/patch

        这句的后面添加:

        epatch "${FILESDIR}/<your patch filename>.patch"

    - 在本地overlay目录下创建files目录,将我们的patch文件放进去,这里我的patch文件是(消除了所有正常情况下的输出):

    diff -u -d -r grub-0.97.bak/stage1/stage1.S grub-0.97/stage1/stage1.S
    --- grub-0.97.bak/stage1/stage1.S    2012-12-21 19:13:16.864283386 +0800
    +++ grub-0.97/stage1/stage1.S    2012-12-21 19:41:52.792201571 +0800
    @@ -151,7 +151,7 @@
         pushw    %dx
     
         /* print a notification message on the screen */
    -    MSG(notification_string)
    +    /* MSG(notification_string) */
     
         /* do not probe LBA if the drive is a floppy */
         testb    $STAGE1_BIOS_HD_FLAG, %dl
    diff -u -d -r grub-0.97.bak/stage2/boot.c grub-0.97/stage2/boot.c
    --- grub-0.97.bak/stage2/boot.c    2012-12-21 19:13:16.855282243 +0800
    +++ grub-0.97/stage2/boot.c    2012-12-21 19:15:08.341435413 +0800
    @@ -280,8 +280,8 @@
         errnum = ERR_WONT_FIT;
           else
         {
    -      grub_printf ("   [Linux-%s, setup=0x%x, size=0x%x]\n",
    -               (big_linux ? "bzImage" : "zImage"), data_len, text_len);
    +      /* grub_printf ("   [Linux-%s, setup=0x%x, size=0x%x]\n",
    +               (big_linux ? "bzImage" : "zImage"), data_len, text_len); */
     
           /* Video mode selection support. What a mess!  */
           /* NOTE: Even the word "mess" is not still enough to
    diff -u -d -r grub-0.97.bak/stage2/cmdline.c grub-0.97/stage2/cmdline.c
    --- grub-0.97.bak/stage2/cmdline.c    2012-12-21 19:13:16.861283005 +0800
    +++ grub-0.97/stage2/cmdline.c    2012-12-21 19:14:47.768836881 +0800
    @@ -232,12 +232,12 @@
           builtin = find_command (heap);
           if (! builtin)
         {
    -      grub_printf ("%s\n", old_entry);
    +      /* grub_printf ("%s\n", old_entry); */
           continue;
         }
     
    -      if (! (builtin->flags & BUILTIN_NO_ECHO))
    -    grub_printf ("%s\n", old_entry);
    +      /* if (! (builtin->flags & BUILTIN_NO_ECHO))
    +    grub_printf ("%s\n", old_entry); */
     
           /* If BUILTIN cannot be run in the command-line, skip it.  */
           if (! (builtin->flags & BUILTIN_CMDLINE))
    diff -u -d -r grub-0.97.bak/stage2/disk_io.c grub-0.97/stage2/disk_io.c
    --- grub-0.97.bak/stage2/disk_io.c    2012-12-21 19:13:16.858282624 +0800
    +++ grub-0.97/stage2/disk_io.c    2012-12-21 19:22:50.732885018 +0800
    @@ -1351,7 +1351,7 @@
     {
       if (! do_completion)
         {
    -      printf (" Filesystem type ");
    +      /* printf (" Filesystem type ");
           
           if (fsys_type != NUM_FSYS)
         printf ("is %s, ", fsys_table[fsys_type].name);
    @@ -1361,7 +1361,8 @@
           if (current_partition == 0xFFFFFF)
         printf ("using whole disk\n");
           else
    -    printf ("partition type 0x%x\n", current_slice & 0xFF);
    +    printf ("partition type 0x%x\n", current_slice & 0xFF); */
    +      return;
         }
     }
     #endif /* STAGE1_5 */
    diff -u -d -r grub-0.97.bak/stage2/stage1_5.c grub-0.97/stage2/stage1_5.c
    --- grub-0.97.bak/stage2/stage1_5.c    2012-12-21 19:13:16.862283132 +0800
    +++ grub-0.97/stage2/stage1_5.c    2012-12-21 19:24:14.499534514 +0800
    @@ -30,7 +30,7 @@
     void
     cmain (void)
     {
    -  grub_printf ("\n\nGRUB loading, please wait...\n");
    +  /* grub_printf ("\n\nGRUB loading, please wait...\n"); */
     
       /*
        *  Here load the true second-stage boot-loader.
    diff -u -d -r grub-0.97.bak/stage2/stage2.c grub-0.97/stage2/stage2.c
    --- grub-0.97.bak/stage2/stage2.c    2012-12-21 19:13:16.857282497 +0800
    +++ grub-0.97/stage2/stage2.c    2012-12-21 20:02:25.576707562 +0800
    @@ -288,8 +288,8 @@
               grub_timeout--;
               
               /* Print a message.  */
    -          grub_printf ("\rPress `ESC' to enter the menu... %d   ",
    -               grub_timeout);
    +          /* grub_printf ("\rPress `ESC' to enter the menu... %d   ",
    +               grub_timeout); */
             }
         }
         }
    @@ -730,11 +730,11 @@
       
       while (1)
         {
    -      if (config_entries)
    +      /* if (config_entries)
         printf ("  Booting \'%s\'\n\n",
             get_entry (menu_entries, first_entry + entryno, 0));
           else
    -    printf ("  Booting command-list\n\n");
    +    printf ("  Booting command-list\n\n"); */
     
           if (! cur_entry)
         cur_entry = get_entry (config_entries, first_entry + entryno, 1);
    diff -u -d -r grub-0.97.bak/stage2/start.S grub-0.97/stage2/start.S
    --- grub-0.97.bak/stage2/start.S    2012-12-21 19:13:16.857282497 +0800
    +++ grub-0.97/stage2/start.S    2012-12-21 20:18:41.119650361 +0800
    @@ -67,7 +67,7 @@
     
         /* print a notification message on the screen */
         pushw    %si
    -    MSG(notification_string)
    +    /* MSG(notification_string) */
         popw    %si
         
         /* this sets up for the first run through "bootloop" */
    @@ -293,7 +293,7 @@
         /* restore addressing regs and print a dot with correct DS 
            (MSG modifies SI, which is saved, and unused AX and BX) */
         popw    %ds
    -    MSG(notification_step)
    +    /* MSG(notification_step) */
         popa
     
         /* check if finished with this dataset */
    @@ -310,7 +310,7 @@
     
     bootit:
         /* print a newline */
    -    MSG(notification_done)
    +    /* MSG(notification_done) */
         popw    %dx    /* this makes sure %dl is our "boot" drive */
     #ifdef STAGE1_5
         ljmp    $0, $0x2200

    - ebuild grub-0.97-r12.ebuild manifest

    - 前面我们创建的grub包所属的category是sys-boot-xxx,这是为了区别系统的sys-boot/grub,方便emerge我们自己的grub。为了让这个category能被emerge认识,为此,在我们的overlay根目录(/usr/local/portage/xxx-overlay)下创建目录profiles,然后继续在profiles下新建文件categories,在其中输入内容:sys-boot-xxx

    - emerge -C sys-boot/grub

    - emerge -avt sys-boot-xxx/grub,这里注意观察我们的patch是否被apply了(官方grub本身就有很多patch会打,所以注意观察我们的,是最后一个打的。我们制作这个patch时,其实也是在官方grub+官方patch的基础上制作出来的,否则patch是打不上的)。

    - grub编译安装完成了,运行:grub --no-floppy,然后:root (hd0,0) -> setup (hd0) -> quit

    - 编辑/boot/grub/grub.conf,加入一行:hiddenmenu,这样grub的menu就不会出现了。如果只是将timeout设成0的话,还是有一个闪动的画面,所以这里禁止了menu。

    - Done. 可以重启试一下。

    2. 屏蔽kernel和Linux启动信息(init开始执行之后产生的信息)

    这相对就简单很多了。网上有说添加kernel command option:console=/dev/null或者console=/dev/ttyS0,但是这样还有一小部分信息无法屏蔽,比如一开始的Uncompressing kernel...。所以我的做法是直接关掉所有的console,也就是VGA console(x86架构)和framebuffer console,make menuconfig轻松搞定。需要注意首先要enable CONFIG_EXPERT,否则VGA console是默认enable并且无法更改的。

    Done. 现在除了BIOS信息,其他就什么信息都没有了。

  • 相关阅读:
    Java创建和解析Json对象
    Tyche 2191 WYF的递推式
    Tyche 2147 旅行
    Tyche 2317 Color
    洛谷 P1092 虫食算
    洛谷 P3951 小凯的疑惑
    BZOJ 1800 [Ahoi2009]fly 飞行棋
    BZOJ 1034 [ZJOI2008]泡泡堂BNB
    洛谷 P2151 [SDOI2009]HH去散步
    Android开发环境配置
  • 原文地址:https://www.cnblogs.com/super119/p/2828624.html
Copyright © 2020-2023  润新知