|
Friday, November 14, 2008
kernel c++
how to create and use patch in linux
Creating a Patch File:
diff -Naur olddir newdir > new-patch- or -
diff -Naur oldfile newfile >new-patch
A Note concerning Patch and the number of Directory Levels used:
Try to make sure when creating a patchfile that you have the same number of directories levels for both the olddir path and newdir path. For Ex:--- old/modules/pcitable Mon Sep 27 11:03:56 1999The above diff would work ok as a patch.
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
--- old/try1/other/modules/pcitable Mon Sep 27 11:03:56 1999You may have problems with the above diff working as a patch. Note that the first one has 4 directory levels mentioned and the 2nd one has only two. I would suggest modifying the --- and +++ lines to make the directory structure in both to be the same number of levels deep.
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
Using the Patch Command:
patch -p0 <new-patchWhich one of the above patch commands you use depends on your current working directory.
patch -p1 <new-patch
Other Methods for calling the patch command - using standard input of patch:
cat new-patch | patch -p0Other methods for calling the patch command - using a "here document":
patch -p0 << EOFFor the "here document", patch will read all the following lines, up until it reaches the delimeter that we specified after the << symbol. The delimeter we choose must appear at the beginning of a line, and must appear alone. In our case we are using the delimeter EOF. EOF has no special meaning, other than the fact that it is not likely that we would have a reason to type EOF at the beginning of any given line.
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
@@ -1,4 +1,6 @@
0x0e11 0xae10 "cpqarray" "Compaq|Smart-2/P RAID Controller"
+0x1000 0x0010 "cpqarray" "Compaq|Integrated Array Controller"
+0x1011 0x0046 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae32 "tlan" "Compaq|Netelligent 10/100"
0x0e11 0xae34 "tlan" "Compaq|Netelligent 10"
0x0e11 0xae35 "tlan" "Compaq|Integrated NetFlex-3/P"
@@ -21,6 +23,7 @@
0x1000 0x000f "ncr53c8xx" "Symbios|53c875"
0x1000 0x0012 "ncr53c8xx" "Symbios|53c895a"
0x1000 0x008f "ncr53c8xx" "Symbios|53c875J"
+0x1000 0x000a "sym53c8xx" "Symbios|53c1510"
0x1000 0x0701 "yellowfin" "Symbios|83C885 gigabit ethernet"
0x1000 0x0702 "yellowfin" "Symbios|Yellowfin G-NIC gigabit ethernet"
0x1011 0x0001 "tulip" "DEC|DECchip 21050"
--- old/usr/share/kudzu/pcitable Sun Sep 26 17:11:23 1999
+++ new/usr/share/kudzu/pcitable Tue Dec 19 20:05:41 2000
@@ -15,6 +15,8 @@
0x0e11 0x3034 "unknown" "Compaq|QVision 1280/p"
0x0e11 0x4000 "unknown" "Compaq|4000 [Triflex]"
0x0e11 0xa0f3 "ignore" "Compaq|Triflex PCI to ISA Bridge"
+0x1000 0x0010 "cpqarray" "Compaq|Integrated Array Controller"
+0x1011 0x0046 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae10 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae29 "unknown" "Compaq|MIS-L"
0x0e11 0xae2a "unknown" "Compaq|MPC"
@@ -46,6 +48,7 @@
0x1000 0x000f "ncr53c8xx" "Symbios|53c875"
0x1000 0x0012 "ncr53c8xx" "Symbios|53c895a"
0x1000 0x008f "ncr53c8xx" "Symbios|53c875J"
+0x1000 0x000a "sym53c8xx" "Symbios|53c1510"
0x1000 0x0701 "yellowfin" "Symbios|83C885 gigabit ethernet"
0x1000 0x0702 "yellowfin" "Symbios|Yellowfin G-NIC gigabit ethernet"
0x1000 0x0901 "unknown" "Symbios|61C102"
EOF
For more information on here documents click here: heredoc.html
Levels in the Patch Command (-p0 or -p1?):
The -p option will optionally strip off directory levels from the patchfile. For Ex: if you have a patchfile with a header as such:--- old/modules/pcitable Mon Sep 27 11:03:56 1999Using a -p0 will expect, from your current working directory, to find a subdirectory called "new", then "modules" below that, then the "pcitable" file below that.
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
Using a -p1 will strip off the 1st level from the path and will expect to find (from your current working directory) a directory called "modules", then a file called "pcitable". Patch will ignore the "new" directory mentioned in the header of the patchfile.
Using a -p2 will strip of the first two levels from the path. Patch will expect to find "pcitable" in the current working directory. Patch will ignore the "new" and "modules" directories mentioned in the header of the patchfile.
Using a -p3 in this example would not be a good thing. Patch probably wouldn't patch anything.
...
Applying a Patch:
Just change to the correct directory and give the patch command (see Using the Patch Command above). Usually is:cd /usr/src/linuxunless the patchfile has "linux" as part of the directory structure on the +++ line, in that case issue the patch command with the -p1 as follows:
patch -p0 <new-patch
patch -p1 <new-patch
Patch Header:
In these examples a patch header begins with the two lines that begin with a --- and +++. This would indicate which filename to begin processing.Multiple Patches in a Patchfile:
A patchfile can have multiple sections, each beginning with the --- / +++ headers mentioned above. So a single patchfile can actually modify several files. If you are reviewing a patchfile be sure to search for every instance of --- throughout the patchfile to see all the different files it patches.An Example of one method to browse a patchfile:
less /tmp/file-patch <ENTER>Note that the "/" invokes the search function in less, and each time you press "n" less will search for the next matching searchstring.
/--- <ENTER>
n
n
n
Hunks:
A hunk is a section to be patched. A hunk usually begins and ends with lines that don't need any changes, they are just mentioned so that Patch can find the appropriate place in the files to be patched. Hunk in these examples begins with a double at symbol (@@) and ends when either a new hunk starts or it finds a new patch header. Here's an example of a hunk:@@ -1,4 +1,6 @@
0x0e11 0xae10 "cpqarray" "Compaq|Smart-2/P RAID Controller"
+0x1000 0x0010 "cpqarray" "Compaq|Integrated Array Controller"
+0x1011 0x0046 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae32 "tlan" "Compaq|Netelligent 10/100"
0x0e11 0xae34 "tlan" "Compaq|Netelligent 10"
0x0e11 0xae35 "tlan" "Compaq|Integrated NetFlex-3/P"
Indentation in a Hunk:
In these examples you will notice that each hunk has been indented so that the text does not occupy the first column. In these examples Patch uses the first column in each patch to list the lines to be added or removed.The First Column of a Hunk (+, -, and a blank):
The + would indicate that this particular line is to be added.The - would indicate that this particular line is to be removed.
A line with neither a plus or minus would indicate that this particular line of code is just a reference point.
An Example Patchfile:
diff -u old/modules/pcitable new/modules/pcitable
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
@@ -1,4 +1,6 @@
0x0e11 0xae10 "cpqarray" "Compaq|Smart-2/P RAID Controller"
+0x1000 0x0010 "cpqarray" "Compaq|Integrated Array Controller"
+0x1011 0x0046 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae32 "tlan" "Compaq|Netelligent 10/100"
0x0e11 0xae34 "tlan" "Compaq|Netelligent 10"
0x0e11 0xae35 "tlan" "Compaq|Integrated NetFlex-3/P"
@@ -21,6 +23,7 @@
0x1000 0x000f "ncr53c8xx" "Symbios|53c875"
0x1000 0x0012 "ncr53c8xx" "Symbios|53c895a"
0x1000 0x008f "ncr53c8xx" "Symbios|53c875J"
+0x1000 0x000a "sym53c8xx" "Symbios|53c1510"
0x1000 0x0701 "yellowfin" "Symbios|83C885 gigabit ethernet"
0x1000 0x0702 "yellowfin" "Symbios|Yellowfin G-NIC gigabit ethernet"
0x1011 0x0001 "tulip" "DEC|DECchip 21050"
--- old/usr/share/kudzu/pcitable Sun Sep 26 17:11:23 1999
+++ new/usr/share/kudzu/pcitable Tue Dec 19 20:05:41 2000
@@ -15,6 +15,8 @@
0x0e11 0x3034 "unknown" "Compaq|QVision 1280/p"
0x0e11 0x4000 "unknown" "Compaq|4000 [Triflex]"
0x0e11 0xa0f3 "ignore" "Compaq|Triflex PCI to ISA Bridge"
+0x1000 0x0010 "cpqarray" "Compaq|Integrated Array Controller"
+0x1011 0x0046 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae10 "cpqarray" "Compaq|Smart-2/P RAID Controller"
0x0e11 0xae29 "unknown" "Compaq|MIS-L"
0x0e11 0xae2a "unknown" "Compaq|MPC"
@@ -46,6 +48,7 @@
0x1000 0x000f "ncr53c8xx" "Symbios|53c875"
0x1000 0x0012 "ncr53c8xx" "Symbios|53c895a"
0x1000 0x008f "ncr53c8xx" "Symbios|53c875J"
+0x1000 0x000a "sym53c8xx" "Symbios|53c1510"
0x1000 0x0701 "yellowfin" "Symbios|83C885 gigabit ethernet"
0x1000 0x0702 "yellowfin" "Symbios|Yellowfin G-NIC gigabit ethernet"
0x1000 0x0901 "unknown" "Symbios|61C102"
Analyzing the above Example:
This example was created using the following diff command:diff -u old/modules/pcitable new/modules/pcitableHowever, now I would probably only use the -Naur options instead of just -u. This example modifies two files: new/modules/pcitable, and new/usr/share/kudzu/pcitable.
The first patch header has two hunks. These particular hunks are adding 2 lines and 1 line respectively.
Thursday, November 13, 2008
linux device driver resource
Linux device drivers and modules (as the kernel itself) are written in C language.
Important documents:
Howto do kernel development. Converting to a kernel monkey.
http://lwn.net/Articles/160191/
+
http://www.kroah.com/log/linux/howto.html
Online book: Linux Device Drivers
http://www.xml.com/ldd/chapter/book/index.html but the 3.ed is more up to date. ( EDIT: online PDF edition...)
Device Driver Kit (Download this KIT before you start
http://kerneltrap.org/node/6638
Coding in and for the kernel, coding style
http://kerneltrap.org/files/Jeremy/CodingStyle.txt
A tiny driver sample
http://www.linuxdevices.com/articles/AT3711365653.html
There have been some tests on using C++ in the kernel, but honestly, it doesn't fit in.
http://netlab.ru.is/exception/LinuxCXX.shtml
#########
Linux kernel factory (the hot core revealed )
http://lug.oregonstate.edu/projects/kernelmap/map.php
I collected these links from my super chaotic kernel page... BE WARNED !!
Other importante programming resources....
Tuesday, November 11, 2008
how to bind a irq to a specified CPU
cpu_mask is a 32-bit mask
n is the interrupt vector
Monday, October 20, 2008
Downloading an Entire Web Site with wget
If you ever need to download an entire Web site, perhaps for off-line viewing, wget can do the
job—for example:
$ wget \
--recursive \
--no-clobber \
--page-requisites \
--html-extension \
--convert-links \
--restrict-file-names=windows \
--domains website.org \
--no-parent \
www.website.org/tutorials/html/
This command downloads the Web site www.website.org/tutorials/html/.
The options are:
-
--recursive: download the entire Web site.
-
--domains website.org: don't follow links outside website.org.
-
--no-parent: don't follow links outside the directory tutorials/html/.
-
--page-requisites: get all the elements that compose the page (images, CSS and so on).
-
--html-extension: save files with the .html extension.
-
--convert-links: convert links so that they work locally, off-line.
-
--restrict-file-names=windows: modify filenames so that they will work in Windows as well.
-
--no-clobber: don't overwrite any existing files (used in case the download is interrupted and
resumed).
Wednesday, September 24, 2008
compress decompress files in Linux
How to compress/decompress files in Linux.
Zip files
To compress of decompress zip files you must have the following programs installed in your computer
zip to compress files
unzip to decompress files
here are the commands
to zip a single file
$zip archive_name.zip file_name
to zip a single folder use the folder name instead of file_name
$zip -r archive_name.zip folder_name
to zip multiple files use
$zip archive_name.zip file1 file2 file3 file4 file5
you can also zip a combination of files and folders into one zip file like this
$zip -r archive_name.zip file1 file3 file4 folder_name1/ folder2/ folder3/
to unzip a file u need unzip program installed in your system
$unzip file.zip
to view data in the zip file use
$unzip -v file.zip
Rar files
You need the rar program from rarlabs.com to compress/decompress these files or you can use unrar or unrar-nonfree packages
$rar -a file.rar /folder/
to uncompress use
$rar -x file.rar
to view the data in the file use
$rar -v file.rar
Tar Files
to compress files into a tar archive use
$tar cvf file.tar folder/ *
to unpack or to uncompress us
$tar -xvf file.tar
to view data in the tar file use
$tar -tvf file
Here the 'v' is optional, it just gives verbose output
Tar.gz files
to compress into .tar.gz use
$tar czvf file.tar.gz folder
to uncompress use
$tar xzvf file.tar.gz
to view data in the tar.gz file use
tar tzvf file.tar.gz
bz2 files
to compress into bz2 format use bzip2
$bzip2 file
above command will create an archive named file.bz2. Also bz2 works on only files.
So if you want to compress a folder you have to pack it into a tar file first and use bzip2 on it.
to uncompress or unpack use
$bzip2 -d file.bz2
tar.bz2 files
to compress into a tar.bz2 file use
$tar cjvf file.tar.bz2 folder
to uncompress tar.bz2 files use
$tar -xjvf file.tar.bz2
to view data in the file use
$tar -tjvf file.tar.bz2
Friday, September 19, 2008
gentoo install from harddisk
http://www.gentoo.org/doc/en/gentoo-x86-quickinstall.xml
grub load untared minimal live cd
======
1. for windows system (fat32): install grub for dos
cp grld to C:\
add "c:\grldr="grub"" to the last of boot.ini file
2. configure menu.lst
need to uncompress *.sqashfs folder to partition
uncompress isolinux folder
set it to :
kernel (hd0,0)/boot/gentoo/gentoo root=/dev/ram0 init=/linuxrc dokeymap
looptype=squashfs loop=/image.squashfs cdroot vga=791
splash=silent,theme:livecd-2007.0 CONSOLE=/dev/tty1 nox
initrd (hd0,0)/boot/gentoo/gentoo.igz
c:\boot.ini
c:\grldr
c:\menu.lst
c:\boot\gentoo\gentoo
c:\boot\gentoo\gentoo.igz
x:\livecd
x:\image.squashfs
if it is grub for linux , just need to set menu.lst file correctly.
(The following specs and the timing information should help you determine
a rough estimate of the time you need to complete your install)
# grep bogo /proc/cpuinfo
bogomips : 3337.81
# hdparm -tT /dev/sda
/dev/sda:
Timing cached reads: 1100 MB in 2.00 seconds = 549.97 MB/sec
Timing buffered disk reads: 224 MB in 3.01 seconds = 74.36 MB/sec
# grep MemTotal /proc/meminfo
MemTotal: 509248 kB
livecd root # ifconfig eth0 192.168.1.10/24
livecd root # route add default gw 192.168.1.1
livecd root # echo nameserver 192.168.1.1 > /etc/resolv.conf
(ext2 is all you need on the /boot partition)
livecd ~ # mke2fs /dev/sda1
(Let's use ext3 on the main partition)
livecd ~ # mke2fs -j /dev/sda3
(Create and activate swap)
livecd ~ # mkswap /dev/sda2 && swapon /dev/sda2
livecd ~ # mount /dev/sda3 /mnt/gentoo
livecd ~ # mkdir /mnt/gentoo/boot
livecd ~ # mount /dev/sda1 /mnt/gentoo/boot
livecd ~ # cd /mnt/gentoo
Howto make partition changes visible to the kernel without reboot
(very important if you cannot reboot your system but changed partition during installation )Install parted in debian
#apt-get install parted
Now this will install partprobe and parted.Partprobe inform the OS of partition table changes. partprobe is a program that informs the operating system kernel of partition table changes, by requesting that the operating system re-read the
partition table.
Syntax
partprobe [-d] [-s] [devices...]
-d Donât update the kernel.
-s Show a summary of devices and their partitions.
-h Show summary of options.
-v Show version of program.
Using partprobe
#partprobe
(Check the clock)
livecd gentoo # date
Mon Mar 6 00:14:13 UTC 2006
(Set the current date and time if required)
livecd gentoo # date 030600162006 (Format is MMDDhhmmYYYY)
Mon Mar 6 00:16:00 UTC 2006
livecd gentoo # links http://www.gentoo.org/main/en/mirrors.xml
(Pick a mirror, move to the releases/x86/2008.0/stages/ directory, highlight the
stage3 of your choice, probably the i686 stage3 and press D to download it)
(Or download it directly with wget without choosing a nearby mirror)
livecd gentoo # wget ftp://gentoo.osuosl.org/pub/gentoo/releases/x86/2008.0/stages/stage3-i686*tar.bz2
livecd gentoo # time tar xjpf stage3*
real 1m14.157s
user 1m2.920s
sys 0m7.530s
livecd gentoo # cd /mnt/gentoo/usr
livecd usr # links http://www.gentoo.org/main/en/mirrors.xml
(Pick a mirror, move to the snapshots/ directory,
highlight portage-latest.tar.bz2 and press D to download it)
(Or download it directly with wget without choosing a nearby mirror)
livecd gentoo # cd /mnt/gentoo/usr
livecd usr # wget http://gentoo.osuosl.org/snapshots/portage-latest.tar.bz2
livecd usr # time tar xjf portage-lat*
real 0m40.523s
user 0m28.280s
sys 0m8.240s
livecd usr # cd /
livecd / # mount -t proc proc /mnt/gentoo/proc
livecd / # cp -L /etc/resolv.conf /mnt/gentoo/etc/
livecd / # chroot /mnt/gentoo /bin/bash
livecd / # env-update && source /etc/profile
>>> Regenerating /etc/ld.so.cache...
livecd / # ls /usr/share/zoneinfo
(Using Brussels as an example)
livecd / # cp /usr/share/zoneinfo/Europe/Brussels /etc/localtime
livecd / # date
Wed Mar 8 00:46:05 CET 2006
livecd / # cd /etc
livecd etc # echo "127.0.0.1 mybox.at.myplace mybox localhost" > hosts
livecd etc # sed -i -e 's/HOSTNAME.*/HOSTNAME="mybox"/' conf.d/hostname
(Use defined host name and check)
livecd etc # hostname mybox
livecd etc # hostname -f
mybox.at.myplace
livecd etc # time emerge gentoo-sources
real 2m51.435s
user 0m58.220s
sys 0m29.890s
livecd etc # cd /usr/src/linux
livecd linux # make menuconfig
(Configure your kernel)
livecd linux # time make -j2
(Elapsed time depends highly on the options you selected)
real 3m51.962s (so fast ........ impossible .... -_-! )
user 3m27.060s
sys 0m24.310s
livecd linux # make modules_install
livecd linux # cp arch/i386/boot/bzImage /boot/kernel
livecd linux # cd /etc
livecd etc # nano -w fstab
/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/sda3 / ext3 noatime 0 1
/dev/sda2 none swap sw 0 0
livecd etc # cd conf.d
livecd conf.d # echo 'config_eth0=( "192.168.1.10/24" )' >> net
livecd conf.d # echo 'routes_eth0=( "default via 192.168.1.1" )' >> net
livecd conf.d # rc-update add net.eth0 default
(If you compiled your network card driver as a module,
add it to /etc/modules.autoload.d/kernel-2.6)
livecd conf.d # echo r8169 >> /etc/modules.autoload.d/kernel-2.6
(If you want to reconnect via ssh after you have rebooted your new box)
livecd conf.d # rc-update add sshd default
livecd conf.d # passwd
New UNIX password: type_the_password
Retype new UNIX password: type_the_password_again
passwd: password updated successfully
livecd conf.d # nano -w /etc/conf.d/clock
TIMEZONE="Europe/Brussels"
livecd conf.d # nano -w /etc/rc.conf
livecd conf.d # nano -w /etc/conf.d/rc
livecd conf.d # nano -w /etc/conf.d/keymaps
livecd conf.d # time emerge syslog-ng vixie-cron
real 1m54.099s
user 1m2.630s
sys 0m34.620s
livecd conf.d # rc-update add syslog-ng default
livecd conf.d # rc-update add vixie-cron default
livecd conf.d # emerge xfsprogs (If you use the XFS file system)
livecd conf.d # emerge jfsutils (If you use the JFS file system)
livecd conf.d # emerge reiserfsprogs (If you use the Reiser file system)
livecd conf.d # emerge dhcpcd (If you need a DHCP client)
livecd conf.d # emerge ppp (If you need PPPoE ADSL connectivity)
livecd conf.d # time emerge grub
real 1m4.634s
user 0m39.460s
sys 0m15.280s
livecd conf.d # nano -w /boot/grub/grub.conf
default 0
timeout 10
title Gentoo
root (hd0,0)
kernel /boot/kernel root=/dev/sda3
livecd conf.d # grub
Probing devices to guess BIOS drives. This may take a long time.
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs__5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/
grub/menu.lst"... succeeded
Done.
grub> quit
livecd conf.d # exit
livecd / # umount /mnt/gentoo/proc /mnt/gentoo/boot /mnt/gentoo
livecd / # reboot
(Don't forget to remove the CD)
(Clean up your known_hosts file because your new box
has generated a new definitive hostkey)
$ nano -w ~/.ssh/known_hosts
(Look for the IP of your new PC and delete the line,
then save the file and exit nano)
(Use the IP address of your new box)
$ ssh root@192.168.1.10
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
RSA key fingerprint is 96:e7:2d:12:ac:9c:b0:94:90:9f:40:89:b0:45:26:8f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.10' (RSA) to the list of known hosts.
Password: type_the_password
mybox ~ # adduser -g users -G lp,wheel,audio,cdrom,portage,cron -m john
mybox ~ # passwd john
New UNIX password: Set John's password
Retype new UNIX password: Type John's password again
passwd: password updated successfully
mybox ~ # emerge mirrorselect
mybox ~ # mirrorselect -i -o >> /etc/make.conf
mybox ~ # mirrorselect -i -r -o >> /etc/make.conf
(Usually, (the number of processors + 1) is a good value)
mybox ~ # echo 'MAKEOPTS="-j2"' >> /etc/make.conf
mybox ~ # emerge -vpe world
(Portage displays the packages and their USE flags, as an example, let's
disable ipv6 and fortran, and enable unicode)
mybox ~ # echo 'USE="nptl nptlonly -ipv6 -fortran unicode"' >> /etc/make.conf
mybox ~ # cd /etc
mybox etc # nano -w locale.gen
mybox etc # locale-gen
mybox etc # nano -w make.conf
(Set -march to your CPU type in CFLAGS)
CFLAGS="-O2 -march=athlon-xp -pipe"
(Add the following line)
FEATURES="ccache"
(Only add the following if you know what you're doing)
ACCEPT_KEYWORDS="~x86"
(Install ccache)
mybox etc # emerge ccache
(Please note that the switch to ~x86 causes many packages to be upgraded)
mybox etc # emerge -vpuD --newuse world
(Take a good look at the package list and their USE flags,
remove blocking packages if any, and start the lengthy process)
mybox etc # time emerge -vuD --newuse world
(79 packages have been (re)compiled)
real 180m13.276s
user 121m22.905s
sys 36m31.472s
(Remerge libtool to avoid further potential problems)
mybox etc # emerge --oneshot libtool
(Update config files, make sure you do not let dispatch-conf
update config files you have edited)
mybox etc # dispatch-conf
(If perl has been updated, you should run the perl-cleaner script)
mybox etc # time perl-cleaner all
real 1m6.495s
user 0m42.699s
sys 0m10.641s
(In case of a major upgrade of python, you should run the python-updater script)
mybox etc # python-updater