Difference between revisions of "Change root"

From ArchWiki
Jump to: navigation, search
(Mount the partitions: grammar)
(moar grammar; fixed a comma splicing, added notes and tips)
Line 55: Line 55:
 
  # chroot . /bin/bash
 
  # chroot . /bin/bash
  
If you see the error, "{{ic|chroot: cannot run command '/bin/bash': Exec format error}}" it is likely that the two architectures do not match.
+
{{Note|
 +
If you see the error {{ic|chroot: cannot run command '/bin/bash': Exec format error}}, it is likely that the two architectures do not match.
  
If you use Bash, your root {{ic|$HOME/.bashrc}} will be sourced on login provided your {{ic|~/.bash_profile}} specifies it ({{ic|source ~/.bashrc}}). To source your chrooted, global bash configuration do:
+
If you use Bash, your root's {{ic|$HOME/.bashrc}} will be sourced on login, provided your {{ic|~/.bash_profile}} specifies it ({{ic|source ~/.bashrc}}). To source your chrooted, global bash configuration, do:
 +
{{bc|# source /etc/profile}}}}
  
# source /etc/profile
+
{{Tip|Consider creating a unique prompt to be able to differentiate your chroot environment:
 
+
{{bc|1=# export PS1="(chroot) $PS1"}}}}
Consider creating a unique prompt to be able to differentiate your chroot environment:
+
 
+
# export PS1="(chroot) $PS1"
+
  
 
== Run graphical chrooted applications ==
 
== Run graphical chrooted applications ==
Line 79: Line 78:
 
== Perform system maintenance ==
 
== Perform system maintenance ==
  
At this point you can perform whatever system maintenance you require inside the chroot environment, some common examples being:
+
At this point you can perform whatever system maintenance you require inside the chroot environment. A few common examples are:
  
 
* Reinstall the bootloader.
 
* Reinstall the bootloader.
Line 96: Line 95:
 
  # umount {proc,sys,dev,boot,[...],}
 
  # umount {proc,sys,dev,boot,[...],}
  
Finally attempt to unmount your hard drive:
+
Finally, attempt to unmount your hard drive:
  
 
  # cd ..
 
  # cd ..
 
  # umount arch/
 
  # umount arch/
  
 +
{{Note|
 
If you get an error saying that {{ic|/mnt}} (or any other partition) is busy, this can mean one of two things:
 
If you get an error saying that {{ic|/mnt}} (or any other partition) is busy, this can mean one of two things:
  
Line 108: Line 108:
 
: {{bc|lsblk /dev/sda}}
 
: {{bc|lsblk /dev/sda}}
  
: If you are still unable to unmount a partition, use the force option:
+
: If you are still unable to unmount a partition, use the {{ic|--force}} option:
  
: {{bc|# umount -f /mnt}}
+
: {{bc|# umount -f /mnt}}}}
  
 
After this, you will be able to safely reboot.
 
After this, you will be able to safely reboot.

Revision as of 08:30, 8 October 2012

Chroot is the process of changing of the apparent disk root directory (and the current running process and its children) to another root directory. When you change root to another directory you cannot access files and commands outside that directory. This directory is called a chroot jail. Changing root is commonly done for system maintenance, such as reinstalling the bootloader or resetting a forgotten password.

Requirements

  • You'll need to boot from another working Linux environment (e.g. from a LiveCD or USB flash media, or from another installed Linux distribution).
  • Root privileges are required in order to chroot.
  • Be sure that the architecture of the Linux environment you have booted into matches the architecture of the root directory you wish to enter (i.e. i686, x86_64). You can find the architecture of your current environment with:
# uname -m
  • If you need any kernel modules loaded in the chroot environment, load them before chrooting. It may also be useful to initialize your swap (swapon /dev/sdxY) and to establish an internet connection before chrooting.

Mount the partitions

The root partition of the Linux system that you're trying to chroot into needs to be mounted. To find out the device name assigned by the kernel, run:

# lsblk /dev/sda

Then create a directory where you would like to mount this partition and mount it:

# mkdir /mnt/arch
# mount /dev/sda3 /mnt/arch

Next, if you have separate partitions for other parts of your system (e.g. /boot, /home, /var, etc), you should mount them, as well:

# mount /dev/sda1 /mnt/arch/boot/
# mount /dev/sdb5 /mnt/arch/home/
# mount ...

While it's possible to mount filesystems after you've chrooted, it is more convenient to do so beforehand. The reasoning for this is that you'll have to unmount the temporary filesystems after you exit the chroot, so this lets you umount all the filesystems with a single command. This also allows for a safer shutdown. Because the external Linux environment knows all mounted partitions, it can safely unmount them during shutdown.

Change root

Mount the temporary filesystems:

Note: Using a newer (2012) Arch release, the following mount commands can be replaced with arch-chroot /mnt/arch, if the root partition was mounted in that location. Of course, you may still type these, if you want, or if you only have some other "live" Linux distribution.
# cd /mnt/arch
# mount -t proc proc proc/
# mount -t sysfs sys sys/
# mount -o bind /dev dev/
# mount -t devpts pts dev/pts/

If you established an internet connection and want to use it in the chroot environment, you may have to copy over your DNS servers so that you will be connected to the network:

# cp -L /etc/resolv.conf etc/resolv.conf

Now chroot to your installed device or partition and define your shell:

# chroot . /bin/bash
Note:

If you see the error chroot: cannot run command '/bin/bash': Exec format error, it is likely that the two architectures do not match.

If you use Bash, your root's $HOME/.bashrc will be sourced on login, provided your ~/.bash_profile specifies it (source ~/.bashrc). To source your chrooted, global bash configuration, do:

# source /etc/profile
Tip: Consider creating a unique prompt to be able to differentiate your chroot environment:
# export PS1="(chroot) $PS1"

Run graphical chrooted applications

If you have X running on your system, you can start graphical applications from the chroot environment.

To allow the connection to your X server, you have to type the following into a terminal of your running system:

# xhost +

In your chroot environment type the following, to direct the applications to your xserver:

# export DISPLAY=:0.0

Perform system maintenance

At this point you can perform whatever system maintenance you require inside the chroot environment. A few common examples are:

Exit the chroot environment

When you're finished with system maintenance, exit the chroot shell:

# exit

Then unmount the temporary filesystems and any mounted devices:

# umount {proc,sys,dev,boot,[...],}

Finally, attempt to unmount your hard drive:

# cd ..
# umount arch/
Note:

If you get an error saying that /mnt (or any other partition) is busy, this can mean one of two things:

  • A program was left running inside of the chroot.
  • Or, more frequently, a sub-mount still exists (e.g. /mnt/arch/boot within /mnt/arch). Check with lsblk to see if there are any mountpoints left:
lsblk /dev/sda
If you are still unable to unmount a partition, use the --force option:
# umount -f /mnt

After this, you will be able to safely reboot.