Module 03: File Permissions and Ownership
🎯 Goal: Read Linux permissions with confidence, choose the least access a file needs, and recover safely from a permission failure.
By the end of this module, you should be able to inspect ownership, explain the meaning of each permission bit on files and directories, use symbolic and octal chmod deliberately, and recognize when sudo is appropriate rather than using it by reflex.
Why this matters
Nearly every confusing "Permission denied" error you'll hit in Linux, Docker, or Kubernetes comes down to the concepts in this module - who owns a file and what they're allowed to do with it. Docker containers run processes as specific users with specific permissions, and getting file permissions wrong is one of the most common causes of broken deployments. Understanding this model now will save you hours of confusion later.
Concepts
Your operating rule: inspect before changing
Permissions are security controls, not decoration. Before changing a mode or owner, inspect the target with ls -ld path (a directory) or ls -l path (a file), state who needs access and why, then make the smallest change that solves the problem. Avoid copying commands such as chmod -R 777 from a forum: they can make application data writable by every local process and hide the real ownership problem.
Every file has an owner and a group. When you create a file (with touch, for example), Linux automatically records two things about it: which user owns it, and which group it belongs to. Think of the owner as "the specific person responsible for this file" and the group as "a team of users who share some level of access to it." A file can only have one owner and one group at a time, but a user can belong to multiple groups.
Three categories of "who," three kinds of access. Linux permissions boil down to answering nine yes/no questions, organized as a 3x3 grid:
Categories of "who" can access the file:
- owner (u) - the single user who owns the file.
- group (g) - any user who is a member of the file's group.
- other (o) - everyone else on the system.
Kinds of access each category can have:
- read (r) - view the file's contents (or, for a directory, list what's inside it).
- write (w) - modify the file's contents (or, for a directory, add/remove/rename files inside it).
- execute (x) - run the file as a program/script (or, for a directory, "enter" it - i.e.
cdinto it or access files inside by full path).
So permissions are really: what can the owner do, what can the group do, what can everyone else do - each answered with some combination of read/write/execute.
Reading ls -l output. Recall from module 02 that ls -l shows a detailed listing. The very first column is a 10-character permissions string, like this:
-rwxr-xr--
Broken down:
- The first character is the file type:
-means a regular file,dmeans a directory (there are other rarer types too, but these two cover almost everything you'll see as a beginner). - The next 9 characters are three groups of three: owner (
rwx), group (r-x), and other (r--). In each group, the letters appear in a fixed order -r, thenw, thenx- and a-means that particular permission is absent.
So -rwxr-xr-- means: it's a regular file; the owner can read, write, and execute it; the group can read and execute it (but not write); and everyone else can only read it.
- rwx r-x r--
│ │ │ │
│ │ │ └── other: read only
│ │ └── group: read + execute
│ └── owner: read + write + execute
└── type: '-' regular file ('d' would mean directory)
Further along an ls -l line, you'll also see the owner's username and the group name printed as separate columns, e.g.:
-rwxr-xr-- 1 alice developers 220 Jul 24 10:03 deploy.sh
Here alice is the owner and developers is the group.
Symbolic vs. octal notation for chmod. chmod ("change mode") is the command used to change a file's permissions. It accepts two different styles of describing the new permissions:
Symbolic notation directly names who and what, using letters:
- Who:
u(owner/user),g(group),o(other),a(all three). - Action:
+(add a permission),-(remove a permission),=(set exactly, wiping out anything not listed). - Permission:
r,w,x.
So chmod u+x script.sh adds execute permission for the owner only, and chmod go-w file.txt removes write permission from group and other.
Octal notation represents each category's permissions as a single digit from 0-7, by adding up values: read = 4, write = 2, execute = 1. Three digits in a row represent owner, group, other respectively.
7= 4+2+1 = read+write+execute (all three).6= 4+2 = read+write only.5= 4+1 = read+execute only.4= read only.0= no permissions at all.
So chmod 750 script.sh means: owner gets 7 (rwx), group gets 5 (r-x), other gets 0 (nothing) - which matches the -rwxr-x--- string you'd see in ls -l.
owner group other
permission: rwx r-x ---
bit values: 4+2+1 4+0+1 0+0+0
digit: 7 5 0 → chmod 750
Ownership: chown and chgrp. While chmod changes what is allowed, chown changes who owns the file, and chgrp changes which group owns it. Changing ownership to another user typically requires sudo, since you can't just hand your files to someone else without administrator rights (and vice versa, you can't take files from other users without it either).
Umask - a basic introduction. When you create a new file or directory, Linux doesn't start it at "no permissions" - it starts from a default and then subtracts based on a setting called the umask ("user file-creation mask"). On a typical Ubuntu setup, new files are usually created as rw-r--r-- (644) and new directories as rwxr-xr-x (755) by default. You don't need to configure umask yourself as a beginner - just understand that this is why newly created files already have some permissions set even though you never ran chmod on them.
1. Permission classes are selected, not combined
Linux does not add together the owner, group, and other triples for one access check.
It selects exactly one class:
- If the process UID matches the file owner, Linux uses the owner triple.
- Otherwise, if one of the process's groups matches the file group, Linux uses the group triple.
- Otherwise, Linux uses the other triple.
This explains a surprising case. If you own a file with mode 640, you cannot use its group's read permission to bypass the owner's missing read bit: once you match the owner, the owner triple is the one that applies.
-w-r----- alex developers config.yml gives owner alex write-only access, even if Alex also belongs to developers. The group read bit does not supplement the owner's missing read bit. Change the owner mode deliberately instead of assuming group membership will help.
2. A directory is a lookup table, not a regular file
The same r, w, and x letters have a different practical effect on directories.
| Directory permission | What it allows | What it does not guarantee |
|---|---|---|
r |
List directory entry names | Open an entry or cd into the directory |
w |
Create, delete, and rename entries | Read the contents of those files |
x |
Traverse the directory and access a known entry by name | List all entry names |
rwx |
List, traverse, and change entries | Permission to ignore the target file's mode |
The subtle consequence is that deleting team/report.txt depends primarily on write and execute permission on the team directory, not write permission on report.txt. The sticky bit, covered below, adds a safety rule for shared directories.
flowchart TD
A["Want to read /srv/app/config.yml"] --> B["Can traverse every parent?\nNeed x on /srv and /srv/app"]
B -->|No| X["Permission denied before target"]
B -->|Yes| C["Can read config.yml?\nNeed r on target"]
C -->|No| Y["Permission denied at target"]
C -->|Yes| Z["Read succeeds"]
3. Executing a file is more than setting x
The execute bit only permits an attempt to execute. The file must still contain something Linux can run:
- a native executable format, or
- a script with a valid interpreter line, such as
#!/usr/bin/env bash.
For a shell script, chmod u+x deploy.sh and ./deploy.sh use the interpreter declared in its shebang. bash deploy.sh instead asks Bash to read the file directly, so it can work even without the execute bit. That is useful for debugging but does not make the script executable by other tools or users.
chmod +x is not a universal repair command. If a script reports bad interpreter, inspect its first line and line endings. A script copied from Windows may contain CRLF line endings; use file script.sh to identify that before changing permissions again.
4. Shared directories need a little more vocabulary
Most day-to-day work needs only rwx, but two special directory modes are worth recognizing:
| Mode | Typical use | Effect |
|---|---|---|
Sticky bit (+t) |
Shared temporary directory such as /tmp |
Users can create files, but may remove or rename only files they own (or files owned by the directory owner/root) |
Setgid (g+s) on a directory |
Shared project directory | New entries inherit the directory's group, helping a team keep one group ownership model |
You may see a sticky directory as drwxrwxrwt: the final t is the sticky bit in the other-execute position. Do not set special bits casually on application directories; recognize them, then use them only when you can explain the shared-workflow requirement.
5. ACLs are an exception layer, not a replacement for basics
Some systems use POSIX access control lists (ACLs) to grant a named user or group access beyond the usual owner/group/other model. getfacl path shows them and setfacl changes them. Learn the basic mode bits first: ACLs are useful for a specific exception, but they make access harder to reason about and should be documented.
Start with a simple ownership model: one service user owns runtime data, one group shares deliberate collaboration access, and “other” gets no access unless there is a clear reason. Add an ACL only when that clean model cannot express a genuine exception.
6. Diagnose permission errors in a fixed order
When a command fails, resist changing random modes. Work from the process toward the object:
Which user runs the process?
↓
Which path is it trying to use?
↓
Can that user traverse every parent directory?
↓
Which permission class applies at the target?
↓
Is an ACL, mount option, immutable flag, or security policy involved?
For ordinary learning environments, id, namei -l, ls -ld, and stat solve most cases. The later possibilities are a reminder not to claim that every access failure can be fixed with chmod.
Command reference
| Command | What it does | Example |
|---|---|---|
ls -l |
Shows the permissions string, owner, group, size, and modification date for each file (introduced in module 02, essential here for reading permissions). | ls -l |
chmod (symbolic) |
Changes permissions using letters for who (u/g/o/a), an operator (+/-/=), and the permission (r/w/x). |
chmod u+x script.sh |
chmod (octal) |
Changes permissions using a three-digit number, one digit per owner/group/other, each digit being a sum of read(4)+write(2)+execute(1). | chmod 750 script.sh |
chmod -R |
The -R flag applies the permission change recursively to a directory and everything inside it. |
chmod -R 755 project-folder |
chown |
Changes the owner of a file. Often needs sudo unless you already own the file and are changing it to yourself (rare in practice). |
sudo chown alice notes.txt |
chown user:group |
Changes both the owner and the group in a single command, separated by a colon. | sudo chown alice:developers notes.txt |
chgrp |
Changes only the group of a file, leaving the owner unchanged. | sudo chgrp developers notes.txt |
umask |
Displays your current umask value (the default permission-subtracting mask applied to newly created files/directories). Run with no arguments to just view it. | umask |
stat |
Shows detailed metadata, including numeric IDs and mode. | stat config.yml |
namei -l |
Shows ownership and permissions for every component of a path. | namei -l /srv/app/config.yml |
id |
Shows the current user's UID, primary group, and supplementary groups. | id |
getfacl |
Displays ACL entries when ACLs are in use. | getfacl shared-report.txt |
Hands-on exercises
Open your Ubuntu terminal and navigate to a fresh practice folder:
mkdir -p ~/perms-practice cd ~/perms-practiceCreate a file and inspect its default permissions. Run:
touch script.sh ls -l script.shExpected output: a line starting with
-rw-r--r--, showing you as the owner and your primary group as the group. Note there's nox(execute) anywhere yet, even though the filename ends in.sh.Try to run the file as a program and see it fail. Run:
./script.shExpected output: an error like
bash: ./script.sh: Permission denied. This happens because the execute (x) permission bit is not set, even though you own the file and can read/write it. This is the error you'll learn to recognize and fix.Fix it with symbolic
chmod. Run:chmod u+x script.sh ls -l script.shExpected output: the permissions string now starts with
-rwxr--r--- notice thexappeared in the owner's group of three, and only there.Add some real content and confirm it now runs. Run:
echo 'echo "Script ran successfully"' > script.sh(This overwrites the file with one line of actual shell code - don't worry about the
>syntax, it's covered later; just know it writes text into the file.) Now run:./script.shExpected output:
Script ran successfully, since the file now has both content and execute permission.Practice octal notation. Run:
chmod 644 script.sh ls -l script.shExpected output:
-rw-r--r--- owner can read/write, group and other can only read, matching 6=rw-, 4=r--, 4=r--. Confirm execute is gone by trying./script.shagain and expecting the same "Permission denied" error as step 3.Restrict a file completely and observe the effect. Run:
chmod 000 script.sh ls -l script.sh cat script.shExpected output for
ls -l:----------(no permissions for anyone, including you). Expected output forcat script.sh: an error likecat: script.sh: Permission denied- even the owner is locked out once all bits are removed. Restore sane permissions before moving on:chmod 644 script.shCreate a directory and test execute permission's special meaning there. Run:
mkdir restricted-dir touch restricted-dir/secret.txt chmod 600 restricted-dir cd restricted-dirExpected output: an error like
bash: cd: restricted-dir: Permission denied, because removing execute (x) on a directory blocks "entering" it, even though read (r) is technically still set on the owner. Fix it:chmod 700 restricted-dir cd restricted-dirThis time it should succeed. Run
pwdto confirm, thencd ..to return.Inspect ownership. Run:
ls -l script.shand look at the third and fourth columns (owner and group). They should both show your own username (a single-user Ubuntu install typically has a personal group matching your username, or a common one like
users).Try to change ownership to another user without
sudoand observe the error. Run:chown root script.shExpected output: an error like
chown: changing ownership of 'script.sh': Operation not permitted, because only the file's current owner (with root's help) or root itself can reassign ownership. Now try it correctly withsudo:sudo chown root script.sh ls -l script.shExpected output: the owner column now shows
rootinstead of your username. Notice you may now have trouble modifying the file yourself - tryecho "test" > script.shand expect a "Permission denied" error, sincerootowns it and the group/other permissions may not allow you to write to it anymore. Reclaim it:sudo chown yourusername script.sh(replace
yourusernamewith your actual username fromwhoami).Check your umask. Run:
umaskNote the value shown (commonly
0022on Ubuntu). Then create a fresh file and directory to see the umask's effect in practice:touch freshfile.txt mkdir freshdir ls -l freshfile.txt ls -ld freshdir(The
-dflag onls -lfor a directory shows the directory's own permissions line instead of listing its contents.) Expected output: the file defaults to-rw-r--r--(644) and the directory todrwxr-xr-x(755) - both consistent with a0022umask being subtracted from a starting point of "everything open."Clean up. Once you're done experimenting, remove the practice folder:
cd ~ rm -r ~/perms-practice
Production practice: making access intentional
A permission problem has three parts: the identity of the process, the ownership and mode of the target, and every directory in the path. Changing only the final file often treats the symptom, not the cause.
Think of a path as a row of locked doors. To read /srv/app/config/settings.json, a process needs permission on settings.json and traverse (x) permission on /, srv, app, and config. The first blocked door is where investigation should begin.
flowchart LR
P["Process: appsvc"] --> A["/srv<br/>x needed"] --> B["/srv/app<br/>x needed"] --> C["config<br/>x needed"] --> D["settings.json<br/>r needed"]
The path diagram explains where access is checked. This second view explains how the final target's mode is decoded.
flowchart LR
M["-rwxr-x---"] --> O["Owner: rwx\n7"]
M --> G["Group: r-x\n5"]
M --> X["Other: ---\n0"]
A web server running as www-data cannot read /home/alex/project/.env, even if the file itself is 644, when /home/alex is not traversable by www-data. Moving deployable configuration to a deliberately owned service directory is usually safer than opening a whole home directory.
Do not solve a permission error with chmod -R 777. It makes every file writable by every local user and process, can mark non-executable data as executable, and leaves no explanation of who actually needs access. Choose a narrow owner, group, and mode instead.
A repeatable permission investigation
- Identify the process user:
ps -o user= -p <PID>or inspect the service unit'sUser=value. - Inspect each path component:
namei -l /path/to/target(installutil-linuxif it is unavailable). - Inspect the target:
stat targetgives the numeric UID/GID and mode as well as friendly names. - Decide the intended access: read, write, execute, or traverse—and for which user or group.
- Change the smallest relevant owner, group, or permission bit; then retest as the affected user when possible.
Create ~/access-lab/private/reports, set the top-level directory to 700, and place a readable file inside it. Use namei -l to explain why a different user would be blocked before reaching the file. Restore the directory to 755 only after you can describe the security trade-off.
Explain why a directory needs execute permission, why 644 is common for ordinary files but not executable scripts, and why a process may receive “Permission denied” despite permissive-looking permissions on the final file.
- Can you decode
drwxr-x---without looking it up? - Can you state the owner/group/other mode you would use for a private
.envfile and why? - Before using
sudo, can you name the process and path component that lacks the required access?
Independent challenge
No commands given here — figure it out yourself using what you know from this module and earlier ones.
Task: Create a fresh directory (building on the directory-creation skills from module 02) and, inside it, a small shell script that prints a line of text. Set things up so that: you (the owner) can read, write, and run the script; members of its group can read and run it but not modify it; and everyone else on the system gets nothing at all. Express that permission choice with a single octal chmod and verify the result by reading the permission string. Then, separately, create a second directory and remove only its "enter/traverse" permission for yourself, and prove to yourself what breaks and what still works when you try to interact with it — explaining the outcome in terms of what execute means on a directory versus on a file.
Stuck? One hint
Add up read(4)+write(2)+execute(1) per category to land on the three-digit mode for the script; and remember that on a directory it is the execute bit, not the read bit, that governs whether you can cd in.
Common mistakes & troubleshooting
- Forgetting execute permission on a script: A "Permission denied" error when running
./myscript.shalmost always means the execute bit isn't set. Check withls -land fix withchmod u+x myscript.shorchmod 744 myscript.sh(adjust the digits to your needs). - Confusing octal digits' meaning: Remember the order is always owner, group, other (left to right), and each digit is a sum of read(4), write(2), execute(1).
644is not "6 for read, 4 for write" - it's three separate digits, each itself a sum. - Removing execute on a directory and being confused why
cdfails: On a directory,xcontrols whether you can enter/traverse it at all, andrcontrols whether you can list its contents - they're not interchangeable. A directory withr--but noxlets you sort of see entries exist in some contexts but not actually enter or fully access them; always keepxset on directories you need tocdinto. - Trying to
chowna file you don't own, withoutsudo: Regular users cannot give away or take ownership of files without elevated privileges - this normally errors with "Operation not permitted." - Locking yourself out with
chmod 000or overly strict permissions: If you remove your own read/write access as the owner, even you will get "Permission denied" until youchmodit back to something sane - remember you (or root) can always restore permissions since ownership itself wasn't changed. - Assuming group permissions apply to you: Group permissions only apply to users who are members of that specific group - not to the file's owner (owner permissions always take precedence for the owner) and not to random other users.
- Using
chown user:groupbut only meaning to change the group: If you accidentally add a colon and leave the group blank or wrong, you may change more than intended. Usechgrpalone if you only want to change the group.
Checkpoint quiz
Write down your answer to each question before expanding it — checking without attempting first is the single easiest way to fool yourself into thinking you've learned this.
- What are the three categories of "who" in the Linux permission model, and what does each one represent?
- Translate
chmod 640 file.txtinto a description of exactly what read/write/execute access owner, group, and other each get. - Why did
./script.shfail with "Permission denied" even though you owned the file and could read and write it? - What's the difference in meaning between the execute (
x) permission on a regular file versus on a directory? - Why did
chmod 000 script.shlock out even the file's own owner, and how would you recover access? - Why does changing a file's owner with
chowntypically requiresudo? - What is the practical difference between using
chownandchgrp? - In your own words, what problem does umask solve, and why doesn't every new file get created with all permissions wide open by default?
Show answers
- Owner (the single user who owns the file), group (users who belong to the file's assigned group), and other (everyone else on the system). Each can be granted a separate combination of read/write/execute access.
640breaks down as owner=6 (rw-, read+write, no execute), group=4 (r--, read only), other=0 (---, no access at all). So the owner can read and modify the file, the group can only view it, and everyone else has no access whatsoever.- Because read and write permissions don't imply execute permission - they're three completely independent bits. Running a file as a program specifically requires the execute (
x) bit to be set for whichever category you fall into (owner, in this case), regardless of your read/write access. - On a regular file, execute means "this file can be run as a program/script." On a directory, execute means "this directory can be entered/traversed" (e.g. via
cdor accessing a file inside it by path) - it does not mean "run the directory," since directories aren't executable programs. chmod 000removes every permission bit for every category, including the owner, so even the owner is blocked from reading, writing, or executing it. Recovery is still possible because the file's ownership itself is unchanged - the owner (or root, viasudo) can always runchmodagain to restore permissions, since changing permissions doesn't itself require having permission on the file's contents.- Because ownership is a security-sensitive property - if any user could freely reassign ownership of any file to themselves or others, it would completely undermine the permission system's ability to protect files. Only root (or the current owner, in limited cases) is allowed to do it, which is why
sudois usually required. chownchanges the owning user (and optionally, withuser:groupsyntax, the group at the same time).chgrpchanges only the group, leaving the owner untouched. Usechgrpwhen you specifically want to change group association without touching ownership.- Umask solves the problem of newly created files/directories needing some sensible default permissions automatically, without every single program that creates a file having to explicitly set safe permissions itself. Not defaulting to "wide open" (everyone can read/write/execute everything) matters because that would be an immediate security risk - any user or process could tamper with newly created files unless the creating program remembered to lock them down manually every time.
Cumulative review
Closed-book. Don't reopen earlier modules while attempting these — the point is to find out what actually stuck.
- You open a fresh Ubuntu window and
pwdprints/home/paresh. Using the~shorthand from module 01 and the filesystem tree from module 02, describe exactly wherecd ~andcd /would each take you from here, and why they differ. - You create
deploy.shwithtouchandls -lshows-rw-r--r--. Break that 10-character string into its file-type character and three permission triples, and explain why./deploy.shfails even though you can clearly read the file. - You run
chmod 640on a directory namedsecrets/(the directory itself, not its contents). Predict what happens when you then try tocdinto it, and justify the outcome in terms of what execute means on a directory. sudofirst appeared in module 00 and again behindchownin module 03. In one sentence each, say whatsudodoes and whychown root notes.txttypically fails without it.- With a single
lscommand using a wildcard, how would you list every hidden file in your home directory whose name ends in.conf? Identify which part is globbing (module 02) and which part is a flag doing its own job. - You run
cp -r project project-backup. Explain what-raccomplishes, and state whether the copied files carry the same read/write/execute bits as the originals. - Why can your everyday user freely
chmodfiles inside/home/pareshwithoutsudo, yet handing one of those files to another user viachownrequiressudo? - You just ran
chmod 755 myscript.sh. Which single command confirms the resulting permission string, and what does755look like written out asrwxletters for owner, group, and other? - From
/home/paresh/projects, give both an absolute path and a relative path that refer to the same file,/home/paresh/notes.txt. - You mistype a command as
whoiamand the shell answerscommand not found. Connect this to the Unix idea (module 01) that the shell looks up a program by name on disk, and name the built-in facility you'd use to check the command's correct spelling and usage.
Show answers
cd ~takes you to your home directory,/home/paresh— the same place you already are, so effectively nowhere.cd /takes you to the root of the entire filesystem, the top of the single unified tree from which/home,/etc,/var, etc. all branch.~is a shorthand that always expands to your own home directory;/is the absolute top.-(file type: a regular file) thenrw-(owner: read+write, no execute),r--(group: read only),r--(other: read only)../deploy.shfails because running a file as a program needs the execute bit for your category (owner), and it isn't set — read and write don't imply execute.640on the directory gives the ownerrw-(no execute). Without execute on a directory you can't enter/traverse it, socd secrets/fails with "Permission denied" even though read is set — read alone doesn't let youcdin.sudoruns a single command with root (superuser) privileges after confirming your password.chown root notes.txtfails without it because giving a file away to another user is a privileged action; only root (or viasudo) may reassign ownership, so the permission system can't be trivially bypassed.ls -a ~/*.conf(orls -a ~/.*.confdepending on how the hidden names are formed) — the*.confis the shell's globbing expanding to matching filenames, and-ais the flag that tellslsto include hidden (dot-prefixed) entries at all.-rcopies recursively — the directory plus everything nested inside it — because a directory isn't a single unit of data. The copied files generally receive default/derived permissions consistent with the copy; ownership becomes yours and the permission bits are recreated for the new copies rather than being guaranteed byte-identical to whatever unusual bits the originals had.- Because you already own the files in your home directory, and changing permissions on files you own doesn't require elevated rights. Changing ownership to a different user is security-sensitive (it could be used to hand files around or grab others' files), so it's restricted to root and thus needs
sudo. ls -l myscript.shshows the resulting permission string.755isrwxfor owner,r-xfor group,r-xfor other.- Absolute:
/home/paresh/notes.txt. Relative (from/home/paresh/projects):../notes.txt. - The shell tries to find an executable literally named
whoiamin the directories it searches and finds none, so it reports "command not found" — a specific, literal complaint, not a vague failure. You'd use--help(orman) on the command you meant (whoami) to check its correct usage.
Further reading & sources
man7.org: chmod(1) - the full option reference, including symbolic-mode edge cases (likechmod +Xfor directories) not covered in this module.man7.org: chown(1) and chgrp(1) - full ownership-command references.- Linux Foundation: Special file permissions - setuid, setgid, sticky bit - the next layer beyond rwx this module intentionally left out (you'll want this once you hit shared directories and privileged binaries).
man7.org: umask(2) - the system-call-level reference behind theumaskshell builtin covered briefly above.- Docker docs: understanding user namespaces - a preview of why file ownership inside a container maps to numeric UIDs the way this module's "owner is really a UID" point sets up.
Next
Continue to 04-users-and-groups to learn how the "owner" and "group" in every permission string are actually managed - creating users, creating groups, and understanding what root really is.