ubuntu16.04升级内核基础 查看当前启动的是哪一个内核

您所在的位置: &
如何在Linux中查看所有正在运行的进程
如何在Linux中查看所有正在运行的进程
进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。在Linux系统中有很多命令。那么哪些命令可以查看所有运行中的进程呢?让我们听飞哥介绍一下。
你可以使用ps命令。它能显示当前运行中进程的相关信息,包括进程的PID。Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息。ps命令能提供一份当前进程的快照。如果你想状态可以自动刷新,可以使用top命令。
输入下面的ps命令,显示所有运行中的进程:
# ps aux | less
-A:显示所有进程
a:显示终端中包括其它用户的所有进程
x:显示无控制终端的进程
任务:查看系统中的每个进程。
任务:查看非root运行的进程
# ps -U root -u root -N
任务:查看用户vivek运行的进程
# ps -u vivek
任务:top命令
top命令提供了运行中系统的动态实时视图。在命令提示行中输入top:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height="356" alt="图1:top命令:显示Linux任务" width="598" src="/files/uploadimg/5270.jpg" />
图1:top命令:显示Linux任务
按q退出,按h进入帮助。
任务:显示进程的树状图。
pstree以树状显示正在运行的进程。树的根节点为pid或init。如果指定了用户名,进程树将以用户所拥有的进程作为根节点。
输出示例:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height="427" alt="图2:pstree - 显示进程的树状图" width="603" src="/files/uploadimg/5271.jpg" />
图2:pstree - 显示进程的树状图
任务:使用ps列印进程树
任务:获得线程信息
输入下列命令:
任务:获得安全信息
输入下列命令:
# ps -eo euser,ruser,suser,fuser,f,comm,label
任务:将进程快照储存到文件中
输入下列命令:
# top -b -n1 & /tmp/process.log
你也可以将结果通过邮件发给自己:
# top -b -n1 | mail -s 'Process snapshot'
任务:查找进程
使用pgrep命令。pgrep能查找当前正在运行的进程并列出符合条件的进程ID。例如显示firefox的进程ID:
$ pgrep firefox
下面命令将显示进程名为sshd、所有者为root的进程。
$ pgrep -u root sshd
向htop和atop说hello
htop是一个类似top的交互式进程查看工具,但是可以垂直和水平滚动来查看所有进程和他们的命令行。进程的相关操作(killing,renicing)不需要输入PID。要安装htop输入命令:
# apt-get install htop
# yum install htop
在命令提示行中输入htop:
输出示例:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height="249" alt="图3:htop - Interactive Linux / UNIX process viewer" width="308" src="/files/uploadimg/5272.jpg" />
图3:htop - Interactive Linux / UNIX process viewer
atop是一个用来查看Linux系统负载的交互式监控工具。它能展现系统层级的关键硬件资源(从性能角度)的使用情况,如CPU、内存、硬盘和网络。
它也可以根据进程层级的CPU和内存负载显示哪个进程造成了特定的负载;如果已经安装内核补丁可以显示每个进程的硬盘和网络负载。输入下面的命令启动atop:
输出示例:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' height="258" alt="图4:AT Computing's System
Process Monitor" width="308" src="/files/uploadimg/5273.jpg" />
图4:AT Computing's System & Process Monitor
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
Linux命令行吸引了大多数Linux爱好者。一个正常的Linux用户一般
八月的天气依然那样炎热,仿佛一点星火就会引起爆炸。
那些由“补丁周二”引发的大麻烦已经成为传说,但却依
日前,微软宣布 Windows 8.1 企业预览版开放下载,很
本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java
51CTO旗下网站Ubuntu误删当前内核后的修复方法_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Ubuntu误删当前内核后的修复方法
来源:Linux社区&
作者:AD4546
昨天想把内核升级后多余的旧内核删除掉,可是不小心连同当前使用的内核一起删除了。这下系统没有了内核,更新后的grub启动列表里也没有了Ubuntu。问题貌似很严重。这时,最佳的解决方法应该是不关机,立刻安装新的内核。可是在那个瞬间我突然很二地想到,我要关机看看会出现什么情况。于是关机、重启,然后发现根本没有任何办法进入Ubuntu。彻底傻掉。
发现网上有些人和我遇到同样的问题,有的直接不淡定地重装了系统。其实还是有温和的解决方案的。
首先进入liveCD,然后将安装介质中的vmlinuz和initrd文件拷贝到原系统中。我所使用的是kubuntu 11.10,当初是U盘安装的。所需要的文件在安装U盘的casper文件夹中,名字是vmlinuz和initrd.lz。我将两个文件拷贝到原系统的/boot中。
然后重启,进入grub的命令行。执行下面的命令引导系统
set root=(hd0,msdos9)
linux /vmlinuz root=UUID=xxx ro locale=zh_CN quiet splash
initrd /initrd.lz
其中(hd0,msdos9)是/boot挂载的分区,具体的序号因人而异。而xxx表示/分区的uuid,可以执行ls -l查看所有的分区及其对应的uuid。
现在可以正常进入系统了。然后安装新的内核,替换掉刚才拷贝进来的山寨版。因为从安装包拷贝进来的内核版本低,缺少部分驱动(我的声卡驱动就有问题),而且日后更新升级可能会不正常。安装内核的方法有两种,一种直接从源安装
apt-get install linux-headers-x.x.x-xx&&& #x代表版本号
apt-get install linux-image
另一种是从官网里下载内核的deb包进行安装。但是我使用这种方法安装后一直无法正常启动,可能是下载的版本不对吧,具体原因不详。
新内核安装完成后重启,系统就恢复了原样。
最后吐个槽。当初听说系统当前使用的内核是无法被删除的,删除时系统会报错。现在发现系统确实会发出警告,可是警告后内核文件照删不误,这个警告的意义未免小了点吧。
相关资讯 & & &
& (12/18/:16)
& (11/15/:50)
& (11/03/:47)
& (11/27/:47)
& (11/05/:34)
& (10/12/:38)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 按照方法boor以后黑屏了怎么办?现实无视频信号输入,但是电脑是运转的。19050人阅读
Ubuntu(56)
目前,我的Ubuntu系统的内核版本是3.11.0,我想使用低版本的内核3.2.65来替代它,步骤如下:
以下过程全部在root权限下操作。
1、 安装必备软件编译工具:
#apt-get install libncurses5-dev build-essential kernel-package
(1)libncurses5-dev是为之后配置内核能运行 make menuconfig程序做准备
Build-essential为编译工具,kernel-package是编译内核工具
(2)如果系统显示无法查找到这三个文件,输入#apt-get update更新数据源。
2、 下载内核
去下载你需要的内核版本的源代码:linux-3.2.65.tar.xz& 解压后linux-3.2.65.
4、 将该压缩包解压后的内容拷贝到/usr/src/目录下
cp& -r& linux-3.2.65& /usr/src/
5、 配置内核:
(1)建议使用当前系统配置文件,使用当前系统配置文件方法:
&#cp /boot/config-XX& ./.config,
(2)#make mrproper&&&& ///这一步可以不做!
作用是在每次配置并重新编译内核前需要先执行“make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。
即检查有无不正确的.o文件和依赖关系,如果使用刚下载的完整的源程序包即第一次进行编译,那么本步可以省略。而如果你多次使用了这些源程序编译内核,则最好要先运行一下这个命令。
(3)然后进入menuconfig选择load选项。
#make menuconfig
注:使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。
在这里就不介绍具体的内核配置操作,但是建议就算不打算配置什么也执行一下make menuconfig这个命令,因为如果不执行此操作的话在后面make编译内核的时候会提示你回答很多问题。
内核配置可参考:
Make menuconfig配置详解:http://blog.csdn.net/xuyuefei1988/article/details/8635539
配置内核还有很多其他方法,主要区别如下:
#make menuconfig //基于ncurse库编制的图形工具界面
#make config //基于文本命令行工具,不推荐使用
#make xconfig //基于X11图形工具界面
#make gconfig //基于gtk+的图形工具界面
这里选择简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。
对每一个配置选项,用户有三种选择,它们分别代表的含义如下:
&*&或[*]——将该功能编译进内核
[ ]——不将该功能编译进内核
[M]——将该功能编译成可以在需要时动态插入到内核中的代码
6、 编译内核:
#make&&&&&&&& ///这可能需要2~3个小时的时间。
7、加入模块
#make modules_install
8、生成可执行的内核引导文件
#make bzImage
这一步会生成内核引导文件,其路径是: arch/x86/boot/bzImage
#cp arch/x86/boot/bzImage /boot/vmlinuz-3.2.65
这一步,是将刚刚生成的引导文件拷贝到 /boot的目录下,并重新命名为vmlinuz-3.2.65
9、将System.map复制到/boot下:
#cp System.map /boot/System.map-3.2.65
10、生成initrd.img文件
#cd /lib/modules/3.2.65
#update-initramfs –c –k 3.2.65
11、自动查找新内核,并添加至grub引导
#update-grub
12、修改/boot/grub/grub.cfg文件,将几个timeout的值设为10
这样grub在引导的时候就会出现10秒的停留,如果有按键输入,则可以对内核镜像进行选择.
还可以直接设置“set default=&0”, 把0修改为对应的新内核对应的数值(查看新内核menuentry的序号,第一个是0,我的安装完后排在第三个,所以序号是2)&
set default=&2&.不过修改默认启动的系统要谨慎,别把序号搞错了!!
OK, 至此,新的内核一切成功!重启试试吧!
---------------@GMG 凌晨3点半,新内核成功运行!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:538600次
积分:5285
积分:5285
排名:第3884名
原创:94篇
转载:114篇
评论:54条
(9)(1)(1)(5)(5)(1)(2)(2)(2)(1)(1)(4)(6)(5)(10)(1)(5)(3)(1)(1)(8)(8)(7)(3)(5)(4)(2)(5)(2)(2)(4)(2)(1)(2)(6)(8)(4)(12)(9)(4)(5)(7)(4)(2)(3)(4)(2)(9)(1)(1)(1)(1)(1)(1)(5)linux内核启动过程追踪
一、使用自己的环境搭建MenuOS的过程
  # 下载内核源代码编译内核
  cd ~/LinuxKernel/
  wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
  xz -d linux-3.18.6.tar.xz
  tar -xvf linux-3.18.6.tar
  cd linux-3.18.6
  make i386_defconfig
  make # 一般要编译很长时间,少则20分钟多则数小时
  # 制作根文件系统
  cd ~/LinuxKernel/
  mkdir rootfs
  git clone /mengning/menu.git # 如果被墙,可以使用附件menu.zip
  cd menu
  gcc -o init linktable.c menu.c test.c -m32 -static &lpthread
  cd ../rootfs
  cp ../menu/init ./
  find . | cpio -o -Hnewc |gzip -9 & ../rootfs.img
  # 启动MenuOS系统
  cd ~/LinuxKernel/
  qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
    // -initrd file Use file as initial ram disk.
二、重新配置编译Linux使之携带调试信息
在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息
  kernel hacking&&[*] compile the kernel with debug info
  make重新编译(时间较长)
三、使用gdb跟踪调试内核
  1、qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
  // # -S freeze CPU at startup (use &c& to start execution)
  //# -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
 2、另开一个shell窗口
  (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
  (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
四、过程图示:
  1、可以看到QEMU 已经运行而且被&冻结&。(有几个文件没有,不影响后续操作)
  2、另外打开一个窗口,进入linuxkernel目录,输入gdb 回车
  3、输入:(gdb)file linux-3.18.6/vmlinux
     (gdb)target remote:1234
       (gdb)break start_kernel
  4、输入c 回车,可以看到内核继续启动,最后停在了start_kernel处:
更多gdb指令:
显示和查找程序源代码
(1)list :显示10行代码,但是我为什么没有显示成功呢?
(2)list 5,10:显示源文件第五行到第十行的代码
(3)list t4.c:5,10:显示源文件中第五行到第十行的代码,在跳是含有多个源文件的次序时使用;
(4)list get_sum:显示get_sum函数周围的代码//什么叫周围的代码呢?
(5)list t4.c :get_sum:显示源文件t4.c中第五行到第十行的代码,在跳是含有多个源文件的次序时使用;
(6)如果在调试中运行linux命令,则可以在gdb的提示符下输入shell命令. (gdb)shell ls
(7)search forward用来从当前行向前查找第一个匹配的字符串;
search get_sum forward get_sum
(8)reverse_search 用来从当前行想前查找第一个匹配的字符串: Example: reverse_search main
设置和管理断点:
(1)以行号设置断点:(gdb)break 7
(2)以函数名设置断点:(gdb)break get_sum
(3)以条件表达式设置断点:方法一:break 行号或者函数名 if 条件. Example: (gdb)break 7 if i==99
方法二:watch 条件表达式,下面是具体的举例:
方法三:awatch;用来给表达式设置断点,在表达式的值发生改变或者表达式的值杯读取的时候,程序暂时停止;
(4).查看当前设置的断点:info breakpoints
(5)使用&disable 断点编号&命令可以是某个断点失效,程序运行到该段点时不会停下来而是继续运行。
(6)使用&enable 断点编号&命令可以是某个断点恢复有效。
彻底的删除某个断点,可以使用clear或者delete命令。
(1)clear:删除程序中所有的断点;
(2)clear 行号:删除此行中的断点
(3)clear 函数名:删除该函数的断点
(4)delete 断点编号:删除指定编号的断点。如果一次要删除多个断点,各个断点编号以空格隔开。
控制程序的执行:
(1)continue命令:让程序继续运行,直到下一个断点或者运行完为止。格式:continue
(2)kill命令:用于结束当前程序的调试
(3)next和step命令
   区别:如果遇到函数,next会把函数调用当作一条语句来执行,再次输入next会执行函数调用后的语句;
   而step则会跟踪进入函数,一次一条的执行函数内的代码,直到函数内的代码执行完,在进行函数调用后的语句;
(4)nexti和stepi命令:用来单步执行一条机器指令,注意不是单步执行一条鱼据。单步执行一条语句使用next和step命令。通常一条语句有多条机器指令构成的。
   注意的是:gdb的一些命令可以简写,比如list可以用li来代替,continue命令可以用cont来代替。
  5、继续输入 list start_kernel 查看start_kernel函数为中心上下10行的代码
    然后接着输入list 查看后续的代码(每输入一次list,向后显示10行)
我们继续输入list跟踪start_kernel以后的代码,看看后面的执行过程:
可以看到,在start_kernel之后是一大堆的初始化操作,初始化外设、时钟、寄存器等。后面还有很多操作,这里不作过多的截图展示,
  6、后面进入rest_init函数:
四、总结:
  在start_kernel中调用了一系列的初始化函数,已完成内核本身的设置:设置与体系结构相关的环境、进程调度器初始化、控制台初始化、系统IRQ初始化、内存初始化等。在Start_kernel函数的最后调用了rest_init()函数,在rest_init中建立了init线程,并在最后调用cpu_idle()函数。
  可以这样理解:start_kernel最后clone出一个新的进程,也就是init进程,然后原来的进程就去执行cpu_idle()函数了,也就变成了idle进程,当发生一次进程调度后,init进程被调度运行。
  核心进程init()主要进行一些外设初始化的工作包括SMP(Symmetric Multi-Processing 对称多处理)的初始化,以及调用do_basic_setup()完成外设及其驱动程序的加载和初始化,当do_basic_setup()函数返回init() ,init() 又打开了、dev/console设备,重定向输出文件到控制台,最后通过kernel&&execve加载执行init程序。
  追踪到init后可以修改文件系统,比如把显示的MENUOS修改为MYOS,修改quit指令,让其退出文件系统等:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
    // -initrd file Use file as initial ram disk.
  这里将-initrd 后面的参数rootfs.img加载到内存中运行,所以,这里的rootfs.img 可以随便改名字,因为内核代码中不会直接用这个名字而是通过initrd来传递的。再者rootfs.img是由tootfs文件夹打包得来的,而rootfs文件夹中只有一个init可执行文件,而init可执行文件来自于menu文件夹,menu文件夹中执行make指令会发现生成了一个test可执行文件,运行menu文件夹中的test和init后会发现效果是一模一样的,所以显然init是由test通过(cp test init) 拷贝、重命名得来的,所以最终修改文件系统可以归结为修改menu文件夹中的main.c、test.c文件。
  在init/initramfs.c文件中:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'获知Linux的进程运行在哪个CPU内核上的方法
作者:佚名
字体:[ ] 来源:开源中文社区 时间:10-07 12:36:10
这篇文章主要介绍了获知Linux的进程运行在哪个CPU内核上的方法,在服务器维护方面有时候会用得到,需要的朋友可以参考下
当你在 多核 NUMA 处理器上运行需要较高性能的 HPC(高性能计算)程序或非常消耗网络资源的程序时,CPU/memory 的亲和力是限度其发挥最大性能的重要因素之一。在同一 NUMA 节点上调度最相关的进程可以减少缓慢的远程内存访问。像英特尔 Sandy Bridge 处理器,该处理器有一个集成的 PCIe 控制器,你可以在同一 NUMA 节点上调度网络 I/O 负载(如网卡)来突破 PCI 到 CPU 亲和力限制。
作为性能优化和故障排除的一部分,你可能想知道特定的进程被调度到哪个 CPU 内核(或 NUMA 节点)上运行。
这里有几种方法可以 找出哪个 CPU 内核被调度来运行给定的 Linux 进程或线程。
方法一如果一个进程使用 taskset 命令明确的被固定(pinned)到 CPU 的特定内核上,你可以使用 taskset 命令找出被固定的 CPU 内核:代码如下:$ taskset -c -p &pid&例如, 如果你对 PID 5357 这个进程有兴趣:代码如下:$ taskset -c -p 5357pid 5357's current affinity list: 5输出显示这个过程被固定在 CPU 内核 5上。
但是,如果你没有明确固定进程到任何 CPU 内核,你会得到类似下面的亲和力列表。
pid 5357's current affinity list: 0-11输出表明该进程可能会被安排在从0到11中的任何一个 CPU 内核。在这种情况下,taskset 不能识别该进程当前被分配给哪个 CPU 内核,你应该使用如下所述的方法。
方法二ps 命令可以告诉你每个进程/线程目前分配到的 (在&PSR&列)CPU ID。代码如下:$ ps -o pid,psr,comm -p &pid&& PID PSR COMMAND&5357& 10 prog输出表示进程的 PID 为 5357(名为&prog&)目前在CPU 内核 10 上运行着。如果该过程没有被固定,PSR 列会根据内核可能调度该进程到不同内核而改变显示。
方法三top 命令也可以显示 CPU 被分配给哪个进程。首先,在top 命令中使用&P&选项。然后按&f&键,显示中会出现 &Last used CPU& 列。目前使用的 CPU 内核将出现在 &P&(或&PSR&)列下。代码如下:$ top -p 5357相比于 ps 命令,使用 top 命令的好处是,你可以连续监视随着时间的改变, CPU 是如何分配的。
方法四另一种来检查一个进程/线程当前使用的是哪个 CPU 内核的方法是使用 htop 命令。
从命令行启动 htop。按 键,进入&Columns&,在&Available Columns&下会添加 PROCESSOR。
每个进程当前使用的 CPU ID 将出现在&CPU&列中。请注意,所有以前使用的命令 taskset,ps 和 top 分配CPU 内核的 IDs 为 0,1,2,...,N-1。然而,htop 分配 CPU 内核 IDs 从 1开始(直到 N)。
大家感兴趣的内容
12345678910
最近更新的内容

我要回帖

更多关于 ubuntu 编译内核 的文章

 

随机推荐