18.3 Create, Delete, and Modify Local Groups and Memberships
Key Takeaways
- Create local groups with groupadd (-g for fixed GID, -r for system groups); modify with groupmod; delete with groupdel only when no user still uses the group as primary.
- Add or remove supplementary members with gpasswd -a/-d or usermod -aG; usermod -g changes the primary group in /etc/passwd.
- usermod -G without -a and gpasswd -M replace membership lists—use append forms when you must preserve existing groups such as wheel.
- Primary group is the GID in passwd; supplementary members are listed in /etc/group—id and getent group are the verification tools.
- Group changes persist in account databases immediately; interactive sessions may need re-login to pick up new membership for access checks.
18.3 Create, Delete, and Modify Local Groups and Memberships
Quick Answer: Create groups with
groupadd, modify withgroupmod, delete withgroupdel. Manage membership withgpasswd,usermod -aG, orgpasswd -a/-d. Primary group vs supplementary groups differ: primary is the GID in/etc/passwd; supplementary lists appear in/etc/groupmember fields. Verify withgetent group,id user, andgroups user.
Why groups dominate multiuser tasks
EX200 group tasks appear alone or combined with users and permissions:
- “Create group
developerswith GID 30000.” - “Ensure
aliceandbobare members ofdevelopers.” - “Change the primary group of
alicetodevelopers.” - “Remove
tempfromcontractorswithout deleting the user.” - “Delete empty group
oldteam.”
Shared directories (SGID project dirs) depend on correct group existence and membership. Get groups right before chasing mode bits.
Group database
/etc/group format
groupname:x:GID:member1,member2
developers:x:30000:alice,bob
| Field | Meaning |
|---|---|
| name | Group name |
| x | Password placeholder (rarely used day-to-day) |
| GID | Numeric group id |
| members | Comma-separated supplementary members |
Important: A user’s primary group membership is not always listed in the member field. Primary is the GID in /etc/passwd. Tools like id show both.
getent group developers
getent passwd alice
id alice
groups alice
/etc/gshadow
Stores group passwords and group administrator lists. RHCSA tasks more often use gpasswd membership operations than group password logins. Know that gpasswd updates group-related databases safely.
groupadd: create groups
sudo groupadd developers
sudo groupadd -g 30000 developers
sudo groupadd -r sysproj # system group (system GID range)
getent group developers
| Option | Purpose |
|---|---|
-g GID | Fixed group ID |
-r | System group |
-f | Exit successfully if group already exists (force/exit quiet behavior—check man on your version for exact semantics) |
-K KEY=VAL | Override login.defs-style defaults when supported |
# Idempotent-ish exam pattern when unsure
getent group developers || sudo groupadd -g 30000 developers
If a task specifies GID, use -g. Collisions with existing GIDs fail—choose the required ID and fix conflicts only as tasks allow.
groupmod: rename or renumber
sudo groupmod -n newname oldname
sudo groupmod -g 31000 developers
getent group developers
Changing GID does not rewrite all file group ownerships automatically—files keep old numeric GIDs until chgrp/chown. Prefer correct -g at create time.
groupdel: remove groups
sudo groupdel oldteam
You cannot delete a group that is still the primary group of an existing user. Reassign those users’ primary groups first:
id alice # if primary is oldteam
sudo usermod -g users alice # or another allowed primary
sudo groupdel oldteam
Supplementary-only membership is cleared when appropriate; still verify no primary dependency remains.
Membership management tools
usermod (from 18.1, group-focused)
# Primary group
sudo usermod -g developers alice
# Append supplementary
sudo usermod -aG developers alice
# Replace all supplementary (danger)
sudo usermod -G developers,contractors alice
gpasswd (group-centric)
sudo gpasswd -a alice developers # add member
sudo gpasswd -d alice developers # remove member
sudo gpasswd -A alice developers # set group administrators (less common on exam)
sudo gpasswd -M alice,bob developers # set member list exactly
gpasswd developers # set group password (rare on EX200)
| Command | Typical use |
|---|---|
gpasswd -a user group | Add one supplementary member |
gpasswd -d user group | Remove one member |
gpasswd -M u1,u2 group | Define exact member list |
usermod -aG group user | Add supplementary from user-centric workflow |
usermod -g group user | Change primary group |
Exam tip: gpasswd -M replaces the member list like usermod -G replaces supplementary groups—read before you wipe members.
Alternative: groupmems (if available)
Some systems include groupmems for membership edits. Stick to gpasswd and usermod for portable RHCSA muscle memory.
# Optional awareness
type groupmems 2>/dev/null
Primary vs supplementary (deep enough for EX200)
| Kind | Where stored | Effect on new files |
|---|---|---|
| Primary | GID field of /etc/passwd | Default group ownership for newly created files (unless SGID dir/other rules) |
| Supplementary | Member lists in /etc/group (+ NSS) | Grants access based on group permissions when primary is not the file’s group |
id -un
id -gn # primary group name
id -Gn # all group names
id alice
A user can access a file mode 640 owned by root:developers if they are in developers (primary or supplementary) and the group has read—subject to DAC and SELinux.
Session caveat
Group membership changes apply to new sessions. An already-open SSH login may still show old id output until the user logs out and back in (or uses a new login). For grading end state, id user as root and getent group are authoritative on disk even if a leftover session is stale.
id alice
sudo -u alice id
getent group developers
Creating users already in groups (review)
sudo groupadd -g 30000 developers
sudo useradd -m -s /bin/bash -g developers -G wheel,contractors alice
id alice
-g primary, -G supplementary at create time avoids a second membership step—still verify.
Shared project directory pattern (group + perms preview)
Though full permission objectives live elsewhere, group tasks often pair with:
sudo groupadd projecta
sudo useradd -m -s /bin/bash -G projecta dev1
sudo useradd -m -s /bin/bash -G projecta dev2
sudo mkdir -p /srv/projecta
sudo chgrp projecta /srv/projecta
sudo chmod 2770 /srv/projecta # SGID + group rwx common pattern
ls -ld /srv/projecta
id dev1
Membership without directory group ownership fails collaboration; directory group without membership also fails. Deliver both when the scenario needs shared write access.
Listing and auditing membership
getent group developers
grep developers /etc/group
lid -g developers 2>/dev/null || true # if libuser tools present
# parse members:
getent group developers | awk -F: '{print $4}'
For each required user:
id dev1 | grep -E 'developers|groups'
Exam workflows
Workflow A — Group with fixed GID
sudo groupadd -g 30000 developers
getent group developers
Workflow B — Add three users to a group without destroying other memberships
for u in alice bob carol; do sudo usermod -aG developers "$u"; done
getent group developers
id alice; id bob; id carol
Or:
sudo gpasswd -a alice developers
sudo gpasswd -a bob developers
sudo gpasswd -a carol developers
Workflow C — Change primary group
sudo groupadd -f staff
sudo usermod -g staff alice
id alice
getent passwd alice
Workflow D — Remove membership only
sudo gpasswd -d alice contractors
id alice
getent group contractors
Workflow E — Rename group and verify
sudo groupmod -n developers eng
getent group developers
getent group eng
Workflow F — Delete group safely
# ensure no user has it as primary
getent passwd | awk -F: -v g=$(getent group oldteam | cut -d: -f3) '$4==g{print $1}'
sudo groupdel oldteam
Common traps
- Expecting primary group to appear in
/etc/groupmember list always—it may not. usermod -Gwithout-aremovingwheeland other supplementary groups.gpasswd -Maccidentally wiping members by omitting names.groupdelfailing because the group is still some user’s primary group.- Creating group after
useradd -gfailed—order groups first. - Wrong GID when task mandates a number.
- Assuming membership works in an old SSH session without re-login when testing interactively.
- Hand-editing
/etc/groupand breaking commas/field counts. - Deleting a group while shared files still use that GID—files show numeric GIDs afterward.
- Forgetting to
getent group+idbefore marking the task done.
Relationship to other sections
- 18.1 Users: primary and supplementary assignment at create/modify time.
- 18.2 Passwords: orthogonal; groups do not replace authentication.
- 18.4 Privileged access:
wheelis a group membership problem first. - Permissions / ACLs / SGID dirs: collaboration design rests on GIDs and members.
- NFS / multiuser services: UIDs/GIDs consistency matters across systems (local chapter focuses on one host).
Section checkpoint
You should create groups with groupadd (including -g), rename/renumber with groupmod, remove with groupdel only when safe, add/remove members with gpasswd and usermod -aG, distinguish primary vs supplementary, avoid destructive -G/-M replacements, and verify with getent group and id. That is the EX200 standard for local groups and memberships on RHEL 10.
Which command creates a local group named developers with GID 30000?
What is the safest way to add alice to group developers without removing her other supplementary groups?
groupdel oldteam fails. What is a common reason?
Where is a user's primary group recorded, as opposed to supplementary membership?