Question: If I want to `tail` a 25 GB textfile, does the `tail` command read the whole file?

Since a file might be scattered on a disk I imagine it has to, but I do not understand such internals well.

Answer: 
If `head` or `tail` *appears* to be reading the entire file, a likely reason is that *the file contains few or no newline characters*. I tripped over this a few months ago with a very large (gigabytes) JSON blob that had been serialized with no whitespace whatsoever, not even in strings.

If you have GNU head/tail you can use `-c N` to print the first/last N *bytes* instead of *lines*, but unfortunately this is not a POSIX feature.
As you can see in the [source code](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c?id=a3d070fa3269e89dfad49fde8ea30758afa36f4b#n525) line 525, you can see the comments for the implementation.

```
 /* Print the last N_LINES lines from the end of file FD.
   Go backward through the file, reading 'BUFSIZ' bytes at a time (except
   probably the first), until we hit the start of the file or have
   read NUMBER newlines.
   START_POS is the starting position of the read pointer for the file
   associated with FD (may be nonzero).
   END_POS is the file offset of EOF (one larger than offset of last byte).
   Return true if successful.  */

```